总:一个图,五个关键字(try,catch,finally,throws,throw)
throw:
一:异常的概念
1:java的异常是java提供的用于处理错误的一种机制。
2:所谓错误是指在程序运行的过程中发生的一些异常事件(除0溢出,数组下标越界,要读取的文件不存在)。
3:java运行时系统接收到异常对象时,会找能处理这一异常对的戴拿并把当前异常对象交给他处理,这一过程成为捕获异常。
二:java异常的分类
Error是系统错误,处理不了,Exception子类是必须要显示处理的异常,必须try catch逮,RuntimeException下面的异常可以不用显式捕获异常,例如(ArrayIndexOutOfBoundsException)数组下标越界,我们没有在程序中开始try catch,主要是如果这种异常也要逮的话,程序的运行效率大大降低。
try可能会跟着多个catch(先抓小的异常,再抓大的,并列无所谓),但是finally是用来兜底的,无论如何都会被执行,为异常处理提供一个统一的接口,进行资源的清除工作。
java 程序中出现异常而不去catch,出现异常之后的代码是运行不到的,导致程序终止,具体解释如下:
RuntimeException也是一样的.RuntimeException是一种可以编绎通过的异常,但运行还是不能通过的,如果不想程序终止,也要去try catch它. 除0异常就是一种RuntimeException,你可以在自己机子上试下.
而非RuntimeException的Exception如果不try catch它,则必须要throws出去.否则编绎都无法通过.当然如果你仅仅是throws出去,在发生异常之后的代码还是会运行不到的.
三:如果处理不了,直接往外抛利用throw.如果能处理即处理,处理不了就往外抛。调用别人的方法就是这样,如果别人的方法抛异常,自己处理运用try catch ,如果不处理自己也throw。在main方法中throw相当不好习惯。
四:使用自定义的异常
public class Exception1 {
public void regist(int num)throws MyException{
if(num<1)
throw new MyException("人数为负,不合理",3);
}
public void manager(int num){
try{
regist(num);
}catch(MyException e){
System.out.println("登记失败,出错类型码为:"+e.getId());
e.printStackTrace();
//e.getMessage();
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Exception1 ex = new Exception1();
ex.manager(0);
}
子类重写的方法抛出的异常不能比父类方法抛出对的异常更宽泛,因为多态使用时(父类的引用指向子类对象),我们捕捉的是父类对的异常,执行的是子类的方法,如果子类抛出的异常更宽泛我们在捕捉异常处会出现问题。
}
class MyException extends Exception{
private int id;
String message;
public MyException(String message,int id){
this.message = message;
this.id = id;
}
public int getId(){
return id;
}
}