Java 中已检查与未检查的异常

简介: Java 中已检查与未检查的异常

在 Java 中,有两种类型的异常:


1)Checked: 是在编译时检查的异常。如果某个方法中的某些代码抛出了已检查的异常,则该方法必须要么处理该异常,要么必须使用 throws 关键字指定该异常。


例如,考虑以下 Java 程序,它打开位置“C:\test\a.txt”的文件并打印它的前三行。程序无法编译,因为main()函数使用 FileReader() 并且 FileReader() 抛出一个检查异常 FileNotFoundException。它还使用了 readLine() 和 close() 方法,这些方法也会抛出检查异常 IOException

import java.io.*;
class Main {
  public static void main(String[] args) {
    FileReader file = new FileReader("C:\\test\\a.txt");
    BufferedReader fileInput = new BufferedReader(file);
    // 打印文件“C:\test\a.txt”的前三行
    for (int counter = 0; counter < 3; counter++)
      System.out.println(fileInput.readLine());
    fileInput.close();
  }
}

输出:

错误:(10, 50) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
错误:(5, 27) java: 未报告的异常错误java.io.FileNotFoundException; 必须对其进行捕获或声明以便抛出
错误:(12, 24) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出

为了修复上面的程序,我们要么需要使用 throws 指定异常列表,要么需要使用 try-catch 块。我们在下面的程序中使用了 throws。由于 FileNotFoundExceptionIOException 的子类,我们可以在 throws 列表中指定 IOException 并使上述程序无编译错误。

import java.io.*;
class Main {
  public static void main(String[] args) throws IOException {
    FileReader file = new FileReader("C:\\test\\a.txt");
    BufferedReader fileInput = new BufferedReader(file);
    // 打印文件“C:\test\a.txt”的前三行
    for (int counter = 0; counter < 3; counter++)
      System.out.println(fileInput.readLine());
    fileInput.close();
  }
}

输出:文件“C:\test\a.txt”的前三行如下

image.png

2) Unchecked: 是在编译时未检查的异常。在 C++ 中,所有异常都是未经检查的,因此编译器不会强制它处理或指定异常。程序员应该文明,并指定或捕获异常。\


ErrorRuntimeException 类下的 Java 异常是未经检查的异常,在 throwable 下的所有其他异常都被检查。

                   +-----------+
           | Throwable |
                   +-----------+
                    /         \
           /           \
          +-------+          +-----------+
          | Error |          | Exception |
          +-------+          +-----------+
       /  |  \           / |        \
         ________/      ______/         \
                            +------------------+
    unchecked     checked    | RuntimeException |
                    +------------------+
                      /   |    |      \
                     _________________/
                       unchecked

考虑以下 Java 程序。它编译得很好,但在运行时会抛出 ArithmeticException 。编译器允许它编译,因为 ArithmeticException 是一个未经检查的异常。

class Main {
    public static void main(String args[]) {
            int x = 0;
            int y = 10;
            int z = y/x;
    }
}

输出:

image.png

我们应该检查异常还是不检查异常?


以下是Java 文档的描述

底线准则:

如果可以合理地期望客户端从异常中恢复,请将其设为已检查异常。如果客户端无法从异常中恢复,则将其设为未经检查的异常


以上就是本篇文章的全部内容

💌 欢迎大家在评论区提出意见和建议!💌

如果你真的从这篇文章中学到了一些新东西,喜欢它,收藏它并与你的小伙伴分享。🤗最后,不要忘了❤或📑支持一下哦。


目录
相关文章
|
2月前
|
Java
java自定义Service的异常
java自定义Service的异常
15 0
|
3天前
|
Java 程序员 编译器
|
5天前
Swagger2异常:java.lang.NumberFormatException: For input string: ““
Swagger2异常:java.lang.NumberFormatException: For input string: ““
14 1
|
6天前
|
存储 Java 程序员
JavaSE&Java的异常
JavaSE&Java的异常
20 0
|
18天前
|
Java
Java 16 新玩法:instanceof 升级版,让类型检查更精准
Java 16 新玩法:instanceof 升级版,让类型检查更精准
13 0
|
22天前
|
Java
Java中的异常类总结
Java中的异常类总结
|
2月前
|
SQL Java
java中的异常
java中的异常
10 1
|
2月前
|
Java 程序员 编译器
Java中异常
Java中异常
12 0
|
2月前
|
Java 程序员 编译器
Java中的异常
Java中的异常
9 0
|
2月前
|
Java
Java异常的抛出
Java异常的抛出
10 0