Java中的异常
一、异常的定义
在程序运行过程中出现的错误
,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。
在Java中,把各种异常现象进行了抽象形成了异常类。
二、异常的分类
- 异常主要分为
一般性异常(编译时异常)
、非受控异常(运行时异常)
- 一般性异常(编译时异常):
写代码的时候,编译时报错的异常,就是编译时异常
在编译时期就会检查,如果没有处理异常则编译失败。
- 非受控异常(运行时异常):
写代码的时候,编译时没有报错的异常,就是运行时异常(RuntimeException)
在运行时期检查异常,在编译时期,运行异常不会报错。
三、异常的处理
1、编译时异常的处理
- 上抛(声明异常)
- 关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。
- 上一个也可以继续上抛,一直抛到main方法上。main方法再上抛就会抛给JVM,JVM就会中断运行。
- 对于编译时异常,一直上抛,说明只是把问题抛给了更高一级,并没有实实在在的处理它。
修饰符 返回值类型 方法名(参数列表) throws 异常类名…{ }
例:
public void m() throws FileNotFoundException{ }
- 捕获异常
- 一旦异常发生,可以上抛,但是在没有到达main方法之前,最好捕捉并处理,不要将这些异常交给JVM自动处理。
- Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
编译时异常一定要捕获,一定要处理,如果不做任何处理,编译过不了。
如果一味上抛,一旦出现问题,JVM会终止运行。
异常一旦发生且被捕获之后,程序是不会终止运行的。
try..catch不能避免异常,只能确保异常发生以后,程序还能正常运行,
但是在try代码块中,异常发生之后,这个异常所在位置之后的代码都将不会执行。
try{}catch(){}
try作用域中的所定义的变量,出了这个作用域便失效
如果try语句块中没有要处理的异常信息,catch是一个可以省略的,但是不建议省略。
try只会在有异常发生的情况下才会出现。
catch()中的()的内容是异常类变量
try中包含了可能产生异常的代码
try后面是catch,catch可以有一个或多个,catch中是需要捕获的异常
当try中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch语句块中,如果没有异常不会跳转到catch中
try {
} catch (OneException e) {
} catch (TwoException e) {
}
例:
try {
FileInputStream fis = new FileInputStream("test.txt");
fis.close();
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
以上代码分析:
将IOException放到前面,会出现编译问题
因为IOException是FileNotFoundException的父类,所以截获了IOException异常后,IOException的子异常都不会执行到
所以再次截获FileNotFoundException没有任何意义
异常的截获一般按照由小到大的顺序,也就是先截获子异常,再截获父异常。
正确示例:
try {
FileInputStream fis = new FileInputStream("test.txt");
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2、运行时异常的处理
运行时异常不需要预处理
,通过规范的代码可以避免产生这种异常
四、堆栈追踪信息
e.printStackTrace()这个方法是异常中最重要的一个方法。
一般都使用这个方法,这个方法出现在catch语句块中。
打印样例:
com.MyException.MyException
at com.myJava.A.My.check(My.java:12)
at com.myJava.A.Test6.main(Test6.java:9)
五、手动抛异常(自定义异常)
class 自定义异常类 extends Exception {
成员属性String类型
无参构造;
有参构造;
}
注意:只能继承Exception,不能继承RuntimeException
自定义异常:
package com.MyException;
public class MyException extends Exception {
private String message;
public MyException() {
}
public MyException(String message) {
this.message = message;
}
}
手动抛异常:
package com.myJava.A;
import com.MyException.MyException;
public class My {
public void check(Object object)throws MyException {
if(object instanceof Integer) {
System.out.println("合理的整数");
}
else {
MyException myException = new MyException();
throw new MyException("不是合理的整数");
}
}
}
测试类:
package com.myJava.A;
import com.MyException.MyException;
public class Test6 {
public static void main(String[] args) {
My my = new My();
try {
my.check("123456");
} catch (MyException e) {
e.printStackTrace();
}
}
}
测试结果: