Exception(异常):运行时的概念,不正常的情况(例外的情况)
1,Throwable:运行时可能碰到的任何问题的总称;
1)Error:指非常严重的错误,系统不要求程序员处理,也处理不了。如:硬件坏了.....等。
2)Exception:从代码的角度是程序员可以处理的问题;
运行时异常:程序运行的时候出现的异常,可以不处理
编译时异常:程序编译的时候出现的异常,必需要处理
UncheckedException(RuntimeException的子类) (未检查异常)如果是RuntimeException(或子类)就是为检查异常,其他就是已检查异常
程序员小心谨慎完全可以避免的异常,系统不要求程序员处理(可以不管,运行会提示错误),
如:3/0 数组下标越界。
CheckedExcepiton (已检查异常)
系统要求必须处理异常。
如果程序出现了异常,程序就不会向下执行。解决异常的目的是让程序能够向下运行。
2,异常处理:异常是相对于方法来说的。
1)声明抛出异常(消极的处理)
throws(抛弃):写在方法名的定义上,后面跟要抛弃的异常类型。
如:public void m1() throws Exception{.}
异常产生时,责任可能并不在当前方法,向外抛弃(把异常抛弃,留给调用者处理)可以让异常找到一个最佳的位置处理
抛弃过程中可以对异常类型进行扩展,但是不能缩小。
throw(抛出):一般出现在方法实现里,用来抛出异常对象(或者是产生异常),
如:throw new FileNotFoundException();
当代码出现异常时,代码不会向下执行,JVM会将异常封装成相应的异常类的对象,
然后向外抛出。之后这个方法里剩下的代码就不会再执行了。
对于一个方法的返回值:
1)正常运行时,要求方法必须返回定义的类型的值。
2)如果运行不正常(出现异常),方法返回的是异常对象
方法覆盖:名相同,参数相同,返回类型相同,访问权限不能更小,子类抛弃的异常不能比父类更多。
2)try....catch(积极的处理):
一个try语句后可以跟多个catch语句;catch时异常子类放上面,异常父类放下面。
最好不要嵌套try...catch
如果没有父子关系,先后无所谓;
---方法---( ){
try{
//放的是有可能会产生异常的代码
xxxxxxxxxx; (1)如果出现异常,JVM将其封装成一个对象,将其抛出,找对应的catch里的类型,是否和抛出的异常一致
xxxxxxxxxx; (2)
}catch(Exception1 e1){//e1是异常对象
//当try代码块出现异常时,执行catch代码块。
xxxxxxxxx; (3)
}catch(Exception2 e2){
xxxxxxxxx; (4)//e2.printStackTrace;打印出错误的堆栈信息
}finally{
//不管有没有异常出现都要执行的代码。
xxxxxxxxx; (5)
}
xxxxxxxxx; (6)
}
1)如果(1),(2)没产生异常,(2)执行后直接执行(5),然后执行(6)。
2)如果(1)产生异常,(2)不会被执行,直接跑出try{..},匹配catch,和catch里定义的类型一致,
执行catch完了后,直接跳到(5)执行,最后再执行(6),如果异常类型都不一致,将导至语法问题。
3)自定义异常类型(业务异常):
如:class MyException extends Exception{
publicMyException(String str);
super(str);
}
Exception异常总结:
1、如果程序用了System.exit(0);则不会执行finally里的程序
2、在程序return前执行finally里的程序
3、Java中异常分为两类:
1) checked Exception
处理方式一、继续抛出,消极做法,直到抛出到JVM
处理方式二、用try..catch
2) unchecked Exception (runtime exception)
throwsArithmeticException,IOException应该是出现这两种异常就向上抛吧。
什么情况下一个方法抛出几个异常?一般来说应该是会抛出几种异常,然后在一级调用这个方法时处理一下。
如果没有特殊需要的话要把可能出现的异常都截获并处理。
try{
method();
}catch(exception1 e1){
do something;
}catch(exception2 e2){
do something;
}……
e1的范围小于e2.