-
异常的继承结构:
Object
Object下有Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
? Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)
? RuntimeException:运行异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行)
-
编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错。
所有异常都是在运行阶段发生的,因为只有程序运行阶段才可以new对象。因为异常的发生就是new异常对象。
-
编译异常和运行异常的区别
编译时异常一般发生的概率比较高
运行时异常一般发生的概率比较低
-
编译时异常还有其他名字:
受检异常:CheckedException
受控异常
-
运行时异常还有其他名字:
未受检异常:UnCheckedException
非受控异常
-
【强调】所有异常都是发生在运行阶段的
-
Java语言中对异常的处理包括两种方式:
第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级
? 谁调用我,我就抛给谁,抛给上一级
第二种方式:使用try…catch语句进行异常的捕捉
? 这件事发生了,谁也不知道,因为我给抓住了。
-
【注意】Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止Java程序的执行。
-
只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行。
另外注意,try语句块中的某一行出现异常,该行后面的代码不会执行。try…catch捕捉异常之后,后续代码可以执行。
-
ClassNotFoundException是类没找到异常,这个异常直接父类是:Exception,所以ClassNotFoundException属于编译时异常
-
FileNotFoundException父类是IOException,IOException的父类是Exception,最终的知,FileNotFoundException是编译时异常
编译时异常要求程序员编写程序阶段必须对它进行处理,不处理编译器就报错。
-
深入try…catch
catch后面的小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型
catch可以写多个。建议catch的时候,精确的一个一个处理。这样有利于程序的调试
catch写多个的时候,从上到下,必须遵守从小到大。
-
在开发中,处理编译时异常,应该上报还是捕捉:
如果希望调用者来处理,选择throws上报
其他情况使用捕捉的方式
-
异常对象有两个非常重要的方法:
获取异常简单的描述信息:
String msg = exception.getMessage();
打印异常追踪的堆栈信息:
exception.printStackTrade();
-
查看异常信息,我们应该怎么看,可以快速的调用程序:
异常信息追踪信息,从上往下一行一行看,要注意,SUN写的代码就不用看,主要问题是出现在自己编写的代码上。
-
关于try…catch中的finally子句:
finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现异常。
finally子句必须和try一起出现,不能单独编写
-
finally语句通常使用在哪些情况下:
通常在finally语句块中完成资源的释放/关闭,因为finally中的代码比较有保障,即使try语句块中的代码出现异常,finally中代码也会正常执行
System.exit(0);退出JVM之后,finally语句中的代码就不执行了。
-
try不能单独使用,try finally可以联合使用。
-
Java语法规则:
Java中有这样一条语法规则:
? 方法体中的代码必须遵循自上而下顺序依次逐行执行
Java中又有这样一条语法规则:
? return语句一旦执行,整个方法必须结束,return语句还必须保证是最后执行的。一旦执行,整个方法结束。
finally面试题
package random;
public class ExceptionTest1 {
public static void main(String[] args) {
int result = m();
System.out.println(result);
}
public static int m(){
int i = 100;
try{
return i;
}finally {
i++;
}
}
}
-
final finally finalize 有什么区别?
final 关键字
? final修饰的类无法继承
? final修饰的方法无法覆盖
? final修饰的变量不能重新赋值
finally 关键字
? 和try一起联合使用
? finally语句块中的代码是必须执行的。
finalize 标识符
? 是一个Object类中的方法名
? 这个方法是由垃圾回收器GC负责调用的
-
异常类程序员是可以自己调用的,
两步:
? 第一步:编写一个类继承Exception或者RuntimeException.
? 第二步:提供两个构造方法,一个无参数的,一个带有String参数的。
-
重写之后的方法不能比重写之前的方法抛出更多的异常
-
throws 在方法声明位置上使用,表示上报异常信息给调用者。
throw 手动抛出异常。