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”的前三行如下

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;

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

以下是Java 文档的描述

底线准则:

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

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

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

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

分类:
后端