异常的分类:运行时异常 编译时异常(编译时直接报错)
错误(error)和异常(exception)有什么区别?
error代表,一般出现的错误是致命的,而且是不可挽回的,比如服务器宕机,数据库崩溃
exception:运行和编译错误,是可以挽回的,一般是程序员自己犯的错误,需要修改源代码,知道可以正常运行
异常处理格式:
① 自己不去处理,直接抛出异常 ,谁执行到这个方法,谁去解决
throws : 抛异常,抛到方法上,直接暴露出来,给调用者去解决
② try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }
catch (){ //除非try里面执行代码发生了异常,否则这里的代码不会执行 }
finally { //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }
异常处理时的注意情况:
一:
多个异常用catch
注意:catch处理的异常,最大的异常放在最后面,最小的异常放在最里面
当知道具体到哪一行时,最好用最小的异常去处理
//方法一:
try {
method2();
method1();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
二:
final finally 与 finalize的区别
1.在java中,final可以用来修饰类,方法和变量(成员变量,局部变量)
1.final修饰的类不能被继承 2.final修饰的方法不能被子类重写3.final修饰的变量不能被重新赋值
2.finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块
表示这段语句一定会被执行(不管有没有抛出异常),通常用来释放资源
3.finalize是object类的一个方法,在垃圾收集器gc执行的时候会调用被回收对象的方法,
可以覆盖此方法提供垃圾收集时的其他资源回收(比如关闭文件)
JVM不会保证此方法被调用
三:
面试题: throw和throws的区别
1.throw是语句抛出的异常
语法:throw(异常对象);
throws是方法可能抛出的异常声明。(用在声明的方法后,表示该方法可能会出现的异常)
语法: public void A(int a) throws Exception1,Exception2{}
2.throw语句用在方法体内,表示抛出异常,由方法体内的语句去执行
throws语句用在方法声明后面,表示在抛出异常,由该方法调用者去处理
3.throws主要是声明这个方法可能会抛出这种类型的异常,使他的调用者知道要去捕获这个异常【有可能,倾向】
throw是具体向外抛出异常的动作,所以他是抛出异常的一个实例【把倾向变成真实】
四:父类和子类之间的异常处理关系
子类继承父类。重写父类方法,当父类方法有异常时,那么子类重写父类方法后,抛出的异常要么相同,要么比它还小
【父类坏了。子类不能比父类更坏】
1.异常的大小:FileNotFoundException<IOException<Exception(最大)<Throwable(基本用不到)
Serializable:序列化 底层
2.当父类有多个异常时,子类只能抛出一样的异常或者父类的子异常,不能抛出父类没有的异常
3.当父类没有异常,子类去重写的方法中没有异常,子类不能抛出异常【throws】,子类只能捕获异常【try{}catch(){}】
五:JAVA中也可以自定义异常
自定义一个异常去继承异常类 ,继承父类的构造函数
给定判断条件,当条件满足事务,就可以去执行这个异常的处理方式