所有分类
  • 所有分类
  • 未分类

Java–异常/Exception–类型/原理

简介

说明

本文介绍Java的异常的类型及原理。

Java异常的层次结构

Throwable有两个直接的子类: Error、Exception。

  • Error
    • JVM内部的严重问题,比如资源不足等,无法恢复。
    • 处理方式: 程序员不用处理
  • Exception
    • JVM通过处理还可回到正常执行流程,即:可恢复。
    • 分RuntimeException和其他Exception,或者说分为非受检异常(unchecked exception)和受检异常(checked exception)。
      • 使用建议:将checked exceptions用于可恢复的条件,将runtime exception用于编程的错误。
        • Use checked exceptions for recoverable conditions and runtime exceptions for programming errors (Item 58 in 2nd edition)
    • RuntimeException(unchecked exception)
      • 处理或者不处理都可以(不需try…catch…或在方法声明时throws)
    • 其他Exception(checked exception)
      • Java编译器要求程序必须捕获(try…catch)或声明抛出(方法声明时throws)这种异常。

为什么要对unchecked异常和checked异常进行区分?

编译器将检查你是否为所有的checked异常提供了异常处理机制,比如说我们使用Class.forName()来查找给定的字符串的class对象的时候,如果没有为这个方法提供异常处理,编译是无法通过的。

捕获异常再抛出

注意:下边的异常中的打印要用System.err而不是System.out,不然会影响打印的顺序。

实例1:包裹原异常再抛出

package com.example.a;

public class Demo {
    public static void main(String[] args) throws Exception {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            System.err.println("自己捕获到异常:" + e.getMessage());
            e.printStackTrace();
            System.err.println("自己打印异常结束");
            throw new Exception("自己抛出的异常", e);
        }finally {
            System.out.println("This is finally");
        }
    }
}

执行结果

自己捕获到异常:/ by zero
java.lang.ArithmeticException: / by zero
	at com.example.a.Demo.main(Demo.java:6)
自己打印异常结束
Exception in thread "main" java.lang.Exception: 自己抛出的异常
	at com.example.a.Demo.main(Demo.java:11)
Caused by: java.lang.ArithmeticException: / by zero
	at com.example.a.Demo.main(Demo.java:6)
This is finally

实例2:不包裹原异常再抛出

package com.example.a;

public class Demo {
    public static void main(String[] args) throws Exception {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            System.err.println("自己捕获到异常:" + e.getMessage());
            e.printStackTrace();
            System.err.println("自己打印异常结束");
            throw new Exception("自己抛出的异常");
        }finally {
            System.out.println("This is finally");
        }
    }
}

执行结果

自己捕获到异常:/ by zero
java.lang.ArithmeticException: / by zero
	at com.example.a.Demo.main(Demo.java:6)
自己打印异常结束
Exception in thread "main" java.lang.Exception: 自己抛出的异常
	at com.example.a.Demo.main(Demo.java:11)
This is finally
3

评论6

请先

  1. 使用建议:将checked exceptions用于可恢复的情况,将unchecked exception用于编程的错误。 这句话能详细解释下,什么是可恢复的情况和编程的错误
    珠光2023 2023-12-11 0
    • 应该用checked exception处理可以预见并可以恢复的条件,例如读取文件时可能发生IO异常。这样,调用该方法的用户就必须考虑如何处理这些异常情况。 对于编程错误,如空指针引用、数组越界等,使用runtime exception更为合适。这些异常表示程序逻辑错误,需要进行代码修正,而不是靠调用者处理异常。
      自学精灵 2023-12-11 0
  2. 面试官会问什么问题呢
    xiaodu 2023-08-03 0
    • 面试官会问:异常有哪两大类?Throwable和Exception是什么关系?常见的RuntimeException有哪些?常见的Error有哪些?我把这几个问题也更新到了主页里的面试题汇总了。
      自学精灵 2023-08-03 4
  3. 这俩包裹和不包裹的代码好像一样吧
    充电不听歌 2023-07-28 1
    • 不一样的,第一个抛出异常的代码里把e放进去了。第一个是:throw new Exception("自己抛出的异常", e);而第二个是:throw new Exception("自己抛出的异常");
      自学精灵 2023-07-28 3
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录