Java编程基础七:异常处理

159 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

第七章 异常处理

==java中的异常分为两部分==

  • Error:JVM都无法解决的问题,比如jvm内部错误,资源耗尽等,例如StackOverflowError
  • Exception:其他变成错误或者偶然的外部因素导致的可以使用专门的代码处理。例如:空指针等

1.常见的异常类型

graph LR
ta[java.lang.Throwable] --> er[java.lang.Error]
ta --> ex[java.lang.Exception]
ex --> c[非运行时异常]
c --> IO[IOException]
IO --> fnfe[FileNotFoundException]
c --> cnfe[ClassNotFoundException]
ex --> uc[运行时异常RuntimeException]
uc --> npe[NullPointerException]
uc --> ai[ArrayIndexOutOfBoundsException]
uc --> cce[ClassCastException]
uc --> nfe[NumberFormatException]
uc --> ime[InputMismatchException]
uc --> ae[ArithmeticException]

1.1 常见运行时异常解决方案

常见运行时异常大概原因关注点
ArithmeticExecption(算术异常)一个整数除以0/ x
NegativeArraySizeExecption

2.异常处理机制

==异常的处理:抓抛模型==

过程一:“抛”,程序在执行的过程中,一旦出现异常,就会在异常代码出生成一个对应的异常类对象,并将此对象抛出,一单抛出一场对象以后,后边的代码就不再执行

过程二:“抓”,可以理解为异常的处理方式。①try - catch - finally ② throws + 异常类型

catch一般会有getMessage()he printStackTrace()==一般用这个==

2.1try - catch - finally

try{
    //可能出现异常的代码
}catch(异常类型1 变量名){
    //处理异常的方式1
}catch(异常类型2 变量名){
    //处理异常的方式3
}finally{
    //可选的,写不写都可以,写了的话就是一定会执行的代码
}
//JDK 7之后可以用 | 连接
try{
    //可能出现的代码
}catch(异常类型1 | 异常类型2 e){
    
}
  • try保卫可能会出现异常的代码

  • catch捕获异常

  • finally一定会被执行的代码

    范围小的异常要放在上边,

①使用try-catch-finally处理编译时异常,使得程序在编译时不在报异常,但是运行是可能报错,相当于讲一个编译时异常延迟到运行时出现了

②由于运行时异常比较常见,所以通常不针对运行时异常编写try- catch - finally,但是针对编译时异常一定要处理

③**finally里永远不要出现return语句,否则try-catch中间的return就不会执行**

2.2throws + 异常处理

  • 一般写在方法声明处,说明可能会抛出的异常类型,当抛出异常的时候,后边的代码就不会执行了

如何选择使用哪一种异常处理机制

​ ①如果父类中被重写的方法没有throws方式处理异常,那么子类重写的方法也不能使用throws,所以子类重写的方法只能用try - catch

​ ②执行的方法a中,先后有调用另外的方法,而且是递进关机,建议使用throws方法处理,执行的方法a建议使用try-catch

2.3 throw new Exception

2.4异常对象的产生

​ ①系统自动生成的异常对象

​ ②手动生成一个异常对象并抛出**(throw)**

3.如何自定义异常

public class MyException extends RuntimeException{
    static final long serialVersionUID = -12178941256195L;
    public MyException(){
        
    }
    public MyException(String msg){
        super(msg);
    }
}

4. 关闭资源

try{
    n.close();
}catch(Exception e){
    e.printStackTrace();
}finally{
    try{
        m.close();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try{
            o.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}