运行时异常与错误
java异常是运行期出现的错误
java异常的父类是Throwable,Throwable有两个子类一个是Error一个是Exception
Rrror:是错误,不是有程序员引起的错误,是大错误(可能由环境等原因导致的)
Exception是异常,是由程序员引起的错误,是小错误,可以被编译器允许的
Exception有两个分类一个是检查行异常一个是非检查性异常
检查性异常:代码写在类中就会报错,需要提起那进行预处理,否则编译报错 范围是:RuntimeException及其子类以外的类
非检查性异常:代码写在类中不会报错,可以不进行预处理,范围是:RuntimeException及其子类
java异常分类
Unchecked Exception(非检查异常)
范围:RuntimeException及其子类
经常出现的异常,可以人为处理也可以不处理
编程导致的错误,程序员的错误
例如:NullPointerException, IndexOutOfBoundsException
Checked Exception(检查异常)
范围:RuntimeException及其子类以外的异常类
方法定义后所加的Exception,必须要人为处理,否则编译报错
程序无法避免的错误,不是程序员的错误
例如:IOException, DataFormatException
异常的处理机制
异常的声明(throws):方法告诉编译器该方法有可能发生的错误,可能抛出的异常——异常在方法声明后被抛出
异常的抛出(throw):运行时出现异常事件,生成对应的异常对象,该对象封装了异常的信息并被提交给Java运行时系统——异常在程序中被抛出
异常的捕获(catch):Java运行时系统接收到异常对象,会寻找处理异常的代码并交给他处理
如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出
如果被调方法发生异常,主调方法仍处理不了此异常,则由此方法的上层主调方法处理,如果main方法仍无法处理此异常,则抛出异常:
如当前不是主线程(main方法),则终止该线程,其他线程依然运行
如当前是主线程,则终止整个应用程序
public void method1() throws ClassNotFoundException {
//throws声明异常,在方法的小括号和大括号中间写,如果需要声明多个异常,中间用逗号分割
//声明异常并不是处理异常
Class.forName("");
}
public void method2() throws ClassNotFoundException {
method1();
}
//被调方法出现异常会抛给主调方法,如果主调方法还不处理异常就会抛给主调方法的上层方法,如果还不处理就会最终抛给main方法
//如果还不处理,最后会发生宕机,程序停止运行。
public void method3(){
try {
method2();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public void method(){
//try代码块中写的是可能发生异常的代码
try{
//try种定义的变量只能在try中使用。catch和finally中都不能使用
int[] a = new int[5];
//try中出现异常就会停止,后续的代码不再执行了,直接进入catch
System.out.println(a[5]);
//当try中没有异常,则catch中的代码就不会执行了
System.out.println("try中代码");
}
//catch代码块中写的是处理异常的代码
catch (ArrayIndexOutOfBoundsException e){
System.out.println("catch中代码");
}
//try后面可以跟零个或多个catch
catch (NullPointerException e){
}
//写多个catch时父异常不能写在子异常前面
catch (Exception e) {}
//finally代码块中写的是受保护的代码
//try后面可以跟一个或零个finally
finally {
//finally是不管异常发布发生都会执行代码
System.out.println("finally中代码");
}