六、异常处理
体系结构
异常
java.lang.Throwable
------Error:错误,程序中不进行运行。
------Exception:异常,要求在编写程序时,就要考虑到对这些异常的处理
分类:
编译时异常和运行时异常
编译时异常:在编译期间会出现的异常(执行javac.exe命令时,出项异常)
运行时异常:在运行期间出现的异常(执行java.exe命令时,出现异常)
当执行一个程序时,如果出现异常,那么异常之后的代码就不在执行
常见的运行时异常---RunTimeException
1.数组下标越界的异常:ArrayIndexOutOfBoundsException
2.算术异常:ArithmeticException
3.类型转换异常:ClassCastException
4.空指针异常:NullPointerException
Exception异常的处理
方式一:try-catch
如何处理Exception的异常
Java提供的是异常处理的抓抛模型
1."抛":当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应的异常类型的对象,并将此对象抛出。(自动抛出&手动抛出)
>一旦抛出此异常类的对象,那么程序就终止执行
>此异常类的对象抛给方法的调用者
2."抓":抓住上一步抛出来的异常类的对象。如何抓?即为异常处理的方式
java提供了两种方式用来处理一个异常类的对象
处理的方式一:
try{
//可能出现异常的代码
}catch(Exception e1){
//处理的方式一
}catch(Exception e2){
//处理的方式二
}finally{
//一定要执行的代码
}
注:1.try内声明的变量,类似于局部变量,出了try{}语句,就不能被调用
2.finally是可选的。
3.catch语句内部是对异常对象的处理:
>getMessage(); //获取message
> printStackTrace();//打印异常信息
4.可以有多个catch语句,try中抛出的异常类对象从上往下去匹配catch中的异常类的类型,
一旦满足就执行catch中的代码,执行完,就跳过其后的多条catch语句。
5.如果异常处理了,那么其后的代码继续执行。
6.若catch中多个异常类型是"并列"关系,孰上孰下都可以。
若catch中多个异常类型是"包含"关系,须将子类放在父类的上面,进行处理,否则报错。
7.finally中存放的是一定会被执行的代码,不管try中、catch中是否仍有异常未处理,以及是否有return语句
8.try-catch是可以嵌套的
三.对于运行时的异常来说,可以不显式的进行处理,
对于编译时异常来说,必须要显式的继续处理
方式二throw:
异常处理的方式二:在方法的声明处,显式的抛出该异常对象的类型
格式:如 public static void method2() throws FileNotFoundException,IOException{}
当在此方法内部出现异常的时候,会抛出一个异常类的对象,抛给方法额调用者。
异常的对象可以逐层向上抛,直至main中。当然向上抛的过程中,可以在通过try-catch-finally进行处理
手动抛出异常
手动抛出一个异常:
抛出异常类型,若是RuntimeException,可以不显式的处理
若是一个Exception,必须显式的处理
throw new RunTimeException("xxxxx");
自定义一个异常类
如何自定义一个异常类
1.自定义的异常类继承现有的异常类
2.提供一个序列号,提供几个重载的构造器
public class MyException extends Exception{
static final long serialVersionUID = -70348975L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
抛异常的方法的重写规则
子类重写父类的方法,其抛出的异常类型只能是被重写的方法的异常类的子类或异常类型一样。
A a = new B();
try{
a.method1();
}catch(IOException e){
e.printStackTrace();
}
class A{
public void method1() throws IOException{
}
}
class B extends A {
public void method1() throws FileNotFoundException{
}
}