Java异常

@

总结内容

1. 什么是异常,为什么要处理异常

在写程序的过程中,可能出现各种程序员没有预料到的情况,或者系统存在一些错误,例如打开一些不存在的文件,开发人员逻辑错误等,这些错误导致程序奔溃,这就叫异常。
为了让用户有一个良好的体验,为了程序的健壮性,不让程序随意崩溃,我们就需要处理异常。

2. 异常语法和执行顺序以及注意事项

  • 异常语法
复制代码
try{
//一些会抛出的异常
}catch(Exception e){
//第一个catch
//处理该异常的代码块
}catch(Exception e){
//第二个catch,可以有多个catch
//处理该异常的代码块
}finally{
//最终要执行的代码
} 
  • 执行顺序
    先执行try{},遇到异常后会去匹配catch()中的异常是否匹配,如果不匹配则执行向下继续catch(),如果一直没匹配到,就一直执行到finally,然后报错,不再执行后面的代码;如果被对应的catch捕捉到,就先执行该catch()的内容,然后跳过后面的catch()直接执行finally的内容,最后接着按正常顺序执行finally{}后面的代码(如果try{}中有return,则在最后执行完finally{}之后不再继续执行后面的代码)。

  • 注意事项
    (1)在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要放在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报 已捕获到...异常的错误
    (2)通过 throw new 异常类 的方式抛出异常,后面就不能有可以行代码代码
    (3)如果try{}语句块中有return存在,并且程序报错的情况下,在执行完try中语句后,会先执行捕捉到异常的catch语句中的内容,再执行finally内的内容,最后执行return。
    (4)有多个catch的情况下,捕捉顺序从上至下依次判断是否是该异常,如果被某个catch捕捉到则执行该catch方法内的代码,之后的catch都不会再执行。
    (5)只要程序进入try{}方法中,finally{}之内的代码一定会被执行,不会受catch、try中return的影响。

3. 异常分类

  • 异常继承体系

  • 异常种类
    Exception:表示程序在运行时出现的一些不正常情况,一般大多数表示轻度到中度的问题,属 于可预测、可恢复问题。如除数为 0,数组索引越界等,这种情况下,程序员通过合理的异常处 理,确保程序的正常运行直到结束。
    Error:表示代码运行时 JVM(Java 虚拟机)出现的问题。如系统崩溃或内存溢出等,不需要处理 Error。

4. 具体异常(理解记忆)

  • 运行时异常 (RuntimeException):
    运行时异常(RuntimeException):在程序运行过程中可处理 ,可不处理,父类是 RuntimeException
    常见的运行时异常:
    InputMismatchException:输入不匹配异常
    ArithmeticException:数学计算异常 e.g:除数为 0
    IndexOutOfBoundsException:下标/索引越界异常
    ArrayIndexOutOfBoundsException : 数组下标越界异常
    StringIndexOutOfBoundsException : 字符串下标越界
    NullPointerException : 空指针异常
    IllegalArgumentException : 方法接收到非法参数
    ClassCastException : 强制类型转换异常
    NumberFormatException : 数字格式转换异常,如把"abc"转换成数字

  • 编译时异常(Exception)
    检查时异常(Checked Exception):也称编译时异常,指在编译期间检查程序可能存在不正常 的情况,在程序运行过程中必须处理,否则编译不通过
    常见的检查时异常:
    ClassNotFoundException : class 没找到异常
    FileNotFoundException : 未见未找到异常
    IOException:IO 异常
    SQLException : 数据库相关异常
    UnsupportedEncodingException : 不支持的字符串编码异常 遇到不懂的异常类时,首先要分辨它属于检查时还是运行时异常。
    通过快捷键查看 IEDA : ctrl+h
    Eclipse: ctrl + t

5. throw和throws关键字区别和作用

  • 区别一:
throws:
 声明异常,用于声明方法可能存在异常,后面跟的是异常类名
throw:
 用在方法体内,后面跟的是异常类对象名
public static void method() throws ArithmeticException {  // 跟在方法声明后面,后面跟的是异常类名
    int a=1;
    int b=0;
    if(b==0) {
    	throw new ArithmeticException();  // 用在方法体内,后面跟的是异常类对象名 
    }else {
    	System.out.println(a/b);
    }
 }
  • 区别二:
throws:
可以跟多个异常类名,用逗号隔开
throw:
只能抛出一个异常对象名 
 public static void method() throws ArithmeticException,Exception {//跟多个异常类名,用逗号隔开
    throw new ArithmeticException();// 只能抛出一个异常对象名   
 }
  • 区别三:
throws:
throws:
 表示抛出异常,由该方法的调用者来处理
throw:
 表示抛出异常,由该方法体内的语句来处理
public class throwandthrows {
  public static void main(String[] args) {
    try {
      method();//由该方法的调用者来处理
    }catch (ArithmeticException e) {
      e.printStackTrace();
    }
  }
  public static void method() throws ArithmeticException {
      int a=1;
      int b=0;
      if(b==0) {
      	throw new ArithmeticException();//由该方法体内的语句来处理
      }else {
      	System.out.println(a/b);
      }
  }
}
  • 区别四:
throws:
 throws表示有出现异常的可能性,并不一定出现这些异常 
throw:
 throw则是抛出了异常,执行throw一定出现了某种异常

6. 自定义异常

  • 定义:
    (1)首先我们定义的异常类需要继承(运行时异常RuntimeException)或者(编译时异常Exception)中的一个,按自己需求继承即可
    (2)必须提供无参构造方法
    (3)必须提供过去参数的构造方法

  • 抛出异常
    具体案例可以看我下一篇博客:自定义异常类的简单实现

  • 声明异常和重写的关系
    (1)方法名、参数列表、返回值类型必须和父类相同(方法重写基本要求);
    (2)父类中方法没有声明异常,则子类中也不可以声明异常;
    (3)父类中方法声明了异常,子类重写后可声明也可不声明,如果声明则必须是与其相同或其异常子类;
    (4)子类可以声明比父类更多的异常,但必须小于父类的异常类(即异常子类) - 即子类不能抛出比父类更多、更宽的异常。

总结

以上就是对异常的总结了,我的下一篇博客:自定义异常类的简单实现

posted @ 2021-03-30 18:17  Yan_Yang  阅读(56)  评论(0编辑  收藏  举报