Java语言的异常
异常处理机制
- Java中的异常概念
1. 异常是程序在运行过程中由于算法问或软件设计等问题导致的程序异常事件。 2. 异常的前提是可以识别并被捕获的。 3. Java以面向对象的方法来处理异常的;Java提供了各种类型的异常类。 4. Java允许自定义异常类。 - Java异常的产生过程
1. 程序运行若发生异常,就会触发能被监听器捕获的异常事件,该事件的处理程 序会生成一个对应的 异常对象并交给JVM,由 JVM查找相应的代码处理该异 常。 2. 生成异常对象并将其交给JVM的过程称为捕获异常。 3. 常本身作为一个对象,即产生一个异常就是产生一个异常对象;异常对象可 能由应用程序本身产 生,也可能由JVM产生,这取决于异常的种类。 - 异常的本质
1 .每个异常类都代表一种运行错误,类中包含错误信息及错误处理的方法等内容。 2. 异常本质上是一个程序运行时发生的事件,该事件将导致程序的运行中断;尽 管如此,在处理异常 的代码中可以调整程序运行的方向,使程序仍可继续执行。 - 异常的处理
1. 程序产生异常,系统捕获异常,程序员编写异常处理程序。
异常处理类
- 在 Java 中,Throwable 类是 Java 语言中所有错误或异常的超类,它有两个直接子类:Error和Exception。
- Error类及其子类代表了程序运行时Java系统内部的错误,程序设计者无能为力,程序也不能从Error中恢复,因此不必处理它们,从技术上讲Error不是异常。
- Exception类及其子类代表了用户程序能够捕捉到的异常,因此应该是程序设计者要关心的、尽可能要处理的部分。
异常的处理
在 Java 中,通常用 try 、catch 、finally 捕捉并处理异常,用 throw 是方法里面抛、throws 是在方法上抛出异常。
使用try-catch-finally捕获和处理异常 语法结构:
try{
要检查的语句序列:可能要抛出异常的代码
}catch(异常类名 形参对象名){
异常发生时处理的语句序列
}finally{
无论是否产生异常,都要执行这部分语句
}
例如:
Scanner scn=new Scanner(System.in);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
System.out.println("请输入出生日期(yyyy-MM-dd):");
String strBirth=scn.next();
try {
Date birth=sdf.parse(strBirth);
System.out.println("生日:"+birth);
}catch(ParseException pe) {
System.out.println("生日错误!");
pe.printStackTrace();
}finally {
System.out.println("程序执行finally块!");
}
多异常的处理
- 多异常需要程序设计者熟悉各类异常。初学者在不熟悉各种异常类的情况下可 以使用Exception类。
- 多异常的处理思想与switch-case结构非常类似。
抛出异常
- 1.在捕获异常之前,必须有一段代码生成并抛出一个异常对象。
- 2.异常类型不同,抛出异常的方法也不同,分为:系统自动抛出的异常、指定方法抛出的异常。
- 3.系统定义的异常由系统抛出;指定方法抛出的异常需使用关键字
throw 或throws ;
我们主要讨论由方法抛出的异常用法。
-
抛出异常的方法与调用方法处理异常 1.异常的产生和处理可以在一个方法内进行; 2.异常的产生和处理也可以不在一个方法中,即一个方法产生异常,由该方法的调用者去处理异常 相对应地,异常有关的方法就有两个:有抛出异常的方法 和处理异常的方法。 -
抛出异常的方法 1.在方法体内使用throw抛出异常:throw 由异常类产生的对象; 2.在方法头部添加throws抛出异常: [修饰符] 返回值类型 方法名([参数列表]) throws 异常列表{ … … } 由上述两种方式抛出异常,在该方法内就不必提供 try-catch-finally 块去处理异常,有调用者的程序处理。 -
处理异常的方法 1.如果程序设计者调用了一个会抛出异常的方法,要么try-catch 处理这个异常,要么将异常继续抛出。
样例: 1.直接抛
package Test.javawork.hextodecString;
public class HexString{
public static String hexToDecString(String hexString) throws HexFormatException {
String regex="^[A-Fa-f0-9]+$";
if(!hexString.matches(regex))
throw new HexFormatException(hexString+"不是16进制");
return "是16进制";
}
public static void main(String[] args) {
String s = null;
try {
s = HexString.hexToDecString("123we");
} catch (HexFormatException e) {
e.printStackTrace();
}
System.out.println(s);
}
}
2.直接处理。
package Test.javawork.hextodecString;
public class HexString{
public static String hexToDecString(String hexString) {
String regex="^[A-Fa-f0-9]+$";
if(!hexString.matches(regex))
try {
throw new HexFormatException(hexString+"不是16进制");
} catch (HexFormatException e) {
e.printStackTrace();
}
return "是16进制";
}
public static void main(String[] args) {
String s = HexString.hexToDecString("123we");
System.out.println(s);
}
}
- 注意直接抛是不会运行后面的程序的直接就停止了。直接处理的话,处理完之后就会继续运行接下面的程序。
自定义异常类
java提供的异常类,不够我们使用,需要我们自己定义一些异常类 格式:
public class XXXXException extends Exception 或者RuntimeException{
添加一个空参构造方法
添加一个带异常信息的构造方法
}
注意:
- 自定义异常类一般都是以
Exception 结尾,说明该类是个异常类 - 自定义异常类,必须继承
Exception 或者RuntimeException 继承Exception 的话:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译器异常,就必须处理这个异常,要么Try()。。。。catch或者throws 继承RuntimeException 的话:那么这个自定义的异常类就是一个运行期异常,无需处理,直接抛,直接交给虚拟机处理(中断处理)
例自定义类:
package Test.javawork.hextodecString;
public class HexFormatException extends Exception{
public HexFormatException(String message) {
super(message);
}
}
package Test.javawork.hextodecString;
public class HexString{
public static String hexToDecString(String hexString) throws HexFormatException {
String regex="^[A-Fa-f0-9]+$";
if(!hexString.matches(regex))
throw new HexFormatException(hexString+"不是16进制");
return "是16进制";
}
public static void main(String[] args) {
String s = null;
try {
s = HexString.hexToDecString("123we");
} catch (HexFormatException e) {
e.printStackTrace();
}
System.out.println(s);
}
}
|