我们不做异常处理,JVM会做出默认异常处理,异常名称,原因,位置输出在控制台,并结束程序。
try…catch…final
注意:try里面越少越好
catch里面必须有内容
变形:try…finally 这样不进行异常处理,只释放内存。
多个异常处理:一旦try里面的语句出了问题,就把问题抛出,和catch里面的问题进行匹配,结束try,执行后续语句。
1》能明确的尽量明确。
2》平级谁前谁后无所谓,父子关系,父在后
JDK7
try{
111111
}catch(异常类1|异常类2 e){
pppp}
1》处理方式是一致的
2》多个异常之间是同级关系
在try里面发现问题后,JVM会帮我们生成一个异常对象,然后把这个对象抛出,和catch里面匹配,如果该对象是某个类型的,就会执行该catch里面的处理信息。
异常中用到的几个方法:public String getMessage()异常的消息字符串
public String toString()返回异常的简单信息描述、、类的name(全路径) :(冒号和一个空格)
printStackTrace()获取异常类名,异常信息,异常位置,
printStackTrace(PrintStreams)(i/o流)
throws
throws 异常类名 (必须跟在方法的括号后面,可以跟多个异常,中间用,隔开)
编译期异常抛出,调用者必须处理;运行期异常抛出,可以不用处理。
注意:尽量不要在main方法里抛出异常。
throw
如果出现了异常情况,把异常抛出,抛出的是异常的对象。例:throw new 异常类型();
throws和throw的区别:
throws:
用在方法声明后面,跟异常类名
可以跟多个异常类名,用,隔开
表示抛出异常,由该方法的调用者处理
表示出异常的一种可能,不一定发生异常
throw:
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内语句处理
throw一定抛出异常
try和throws选择:
后续程序继续运行用try,不运行用throws(main方法里必须用try)
面试题:
1》final,finally和finalize的区别
final:最终
修饰类:类不能被继承;
修饰变量:变量是常量;
修饰方法:方法不能被重写;
finally:异常处理的一部分,释放资源。除非在执行finally之前JVM退出了,否则finally里的内容一定被执行。
finalize:Object的一个方法,用于垃圾回收。
2》如果catch里面有return语句,finally里面的代码还会执行么?如果会,是return前,还是return后。
public class finallyDemo {
public static void main(String[] args) {
System.out.println(fin());
}
public static int fin() {
int a=50;
try {
System.out.println(a / 0);
a=10;
} catch (Exception e) {
a = 20;
return a; //结果是20;在执行的时候进入catch这个时候return的不是a,是return 30,
} finally { //因为有finally,所以进入finally,然后继续return 20;
a = 30;
}
return a;
}
}
自定义异常:A:继承Exception //编译时期异常
B:继承RuntimeException //运行时期异常
异常注意事项:A:子类重写父类方法时,子类方法必须抛出相同或父类异常子集(父亲坏了,儿子不能比父亲更坏)
B:如果被重写的方法没有异常抛出,那么子类的方法绝不可以抛出异常,那么子类只能try,不能throws.