1:概述

异常体系
四、异常 - 图1

1:Exception 和 Error 有什么区别?
Exception 和 Error 都是 Throwable 的子类。Exception 用于用户程序可以捕获的异常情况。Error 定义了不期望被用户程序捕获的异常。
分类
四、异常 - 图2

-
异常事件可分为两类:
Error:Java 虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等严重情况。比如:StackOverflowError 和 OOM。一般不编写针对性的代码进行处理。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界

  • 编译时期异常:checked 异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
  • 运行时期异常:runtime 异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)

    2:常见异常

  • NullPointerException 空指针异常

  • ClassNotFoundException 指定类不存在
  • NumberFormatException 字符串转换为数字异常
  • IndexOutOfBoundsException 数组下标越界异常
  • ClassCastException 数据类型转换异常
  • FileNotFoundException 文件未找到异常
  • NoSuchMethodException 方法不存在异常
  • IOException IO 异常
  • SocketException Socket 异常 -

    3:处理异常

    1)抛出异常 throw
    2)声明异常 throws
    throw 和 throws 有什么区别?
    Throw 用于方法内部,Throws 用于方法声明上
    Throw 后跟异常对象,Throws 后跟异常类型
    Throw 后只能跟一个异常对象,Throws 后可以一次声明多种异常类型
    3)捕获异常 try…catch
    1:在项目中不要捕获 Java 类库中继承自 RuntimeException 的运行时异常,ndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查违法来规避,保证程序健壮性。
    2:对大段代码进行 try-catch,这是不负责任的表现。 catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。
    3:有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
    4:有特殊的流关闭等操作一定必须放在 finally 中
    程序检测
    If(num==0){}
    方式一:try-catch-finally
    四、异常 - 图3

捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
getMessage() 获取异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值 void。
四、异常 - 图4

方式二:throws + 异常类型
方法三:手动抛出异常
首先要生成异常类对象,然后通过 throw 语句实现抛出操作(提交给 Java 运行环境)。
IOException e=new IOException();
Throw e;
可以抛出的异常必须是 Throwable 或其子类的实例。下面的语句在编译时将会产生语法错误:
Throw new String(“wanttothrow”);

4:用户自定义异常类

定义异常类

  1. // 业务逻辑异常
  2. public class RegisterException extends Exception {
  3. /**
  4. * 空参构造
  5. */
  6. public RegisterException() {
  7. }
  8. /**
  9. *
  10. * @param message 表示异常提示
  11. */
  12. public RegisterException(String message) {
  13. super(message);
  14. }
  15. }

使用

  1. public static boolean checkUsername(String uname) throws LoginException{
  2. for (String name : names) {
  3. if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
  4. throw new RegisterException("亲"+name+"已经被注册了!");
  5. }
  6. }
  7. return true;
  8. }
  9. }

总结:

1:在项目中不要捕获 Java 类库中继承自 RuntimeException 的运行时异常,这类异常由程序员预检查违法来规避,保证程序健壮性。
2:不能大段进行 try……catch……对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。给出准确的异常处理信息
3:有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
4:有特殊的流关闭等操作一定必须放在 finally 中
5:请确保在 Javadoc 中添加一个@throws 声明,并描述可能导致的异常情况。

转载 https://www.yuque.com/jykss/jykss/zezf4y#WDe4S