异常
1、是实例对象。两类:
Checked异常:其它;
Runtime异常;RuntimeException类及其子类的实例。
Checked异常:①明确知道咋处理:try捕获,catch修复。
②当前方法不知咋处理:声明方法时throws抛出。
Runtime:无须显式抛出、显式捕获。可直接交给caller处理。
Checked类:
Runtime类:
2、try放可能异常的语句块,catch激发被捕获异常,finally最后执行的部分。
try异常——跳到catch执行——接着catch后面的代码块执行,不再跳回try。
try{
......
}catch(Exceptiontype e){
......
}catch(Exceptiontype1 e){
......
}finally{
......
}
3、try传Exception e给catch。
e.getMessage()
//输出错误性质
e.toString()
//异常类型与性质
e.printStackTrace()
//异常类型、性质、栈层次、出现位置
4、不管前面咋样,finally都执行。
不会被执行的情况:①finally语句块异常。②前面已经System.exit()退出程序。③程序所在线程死亡。④关闭CPU。
5、throws:方法抛出异常。在方法声明处使用。
public int add(int n1,int n2) throws 异常类型{};
①此方法不处理异常,向上抛给上一级调用者处理;若主方法也不知道咋处理,则也throws声明抛出异常,此异常可不用try-catch处理,交给JVM自动处理。JVM处理方式:打印异常的跟踪栈信息并终止程序运行。
②多个异常逗号分隔。
③调用者处理:指调用方法时用try显式捕获,或放在另一个throws声明抛出的方法中。
④Error,RuntimeException或其子类可不用throws声明抛,会被系统自己抛。
⑤有异常的可能性。
⑥方法重写的“两小”:A、子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同;B、子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。
throw:语句抛出异常。当前方法中+自行抛出异常:一个异常类的实例化对象。
①对于Checked异常,无法单独使用。必须在try块里或throws声明抛出的方法中。
②异常由方法体内的语句处理。
③一定抛出了某异常。
6、catch(Exception e)放所有异常的最后面。因为是父类。
7、自定义异常:
①创建自定义异常类,继承Exception。Runtime类型的继承RuntimeException。
②在当前抛出异常的方法中处理异常:try-catch语句块。
反之:方法声明处throws异常,向上抛给方法的caller。
③在出现异常的方法的caller中捕获处理。
④两个构造器:无参构造器;带一个字符串参数的构造器。字符串通常作为异常对象的描述信息,即getMessage()方法的返回值。
public class Exception1 extends Exception{
public Exception1(String str){
super(str);
//Exception1父类Exception有个构造器:
//public Exception(String message){
// super(message);}
//Exception的父类Throwable有个构造器:
//public Throwable(String message){
// fillInStackTrace();
// detailMessage=message;}
//detailMessage是private型的。
}
}
public class Exception1 extends Exception{
public Exception(String str){
this.str=str;
}
public String getMessage(){
return str;
}
}
8、所有异常是Throwable的子类。
Error类及子类:内部错误、资源耗尽错误。
Exception:非致命性错误。捕获处理。分Checked和Runtime。
9、Exception构造器与方法:详见API:https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true
10、一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常。