java - Java 中的检查异常与非检查异常

标签 java exception

我在理解 Java 中的已检查未检查 异常之间的差异时遇到了一些问题。

  1. 首先,检查异常应该在编译时查找异常。不同来源提供的示例引用了数据库连接、文件处理等内容,而未检查异常则应该在程序员方面查找错误,例如超出数组范围的索引等。<

不是应该反过来吗?我的意思是,数据库连接是在运行时完成的,对吧?文件处理也是如此。您在编译时不会打开文件句柄,那么为什么在编译时会查找可能的错误呢?另一方面,对超出其范围的数组进行索引已经在程序中完成,可以在编译时检查(如果异常索引是用户在运行时提供的,那么它是运行时是可以的)问题)。我在这里缺少什么?

2 其次,RunTimeException本身是未检查,如何子类Exception(它是检查)?这意味着什么?

我在 Herbert Schildt 的书中找到了一个示例,解释了检查异常的用法:

class ThrowsDemo {
   public static char prompt(String str)
      throws java.io.IOException {
  System.out.print(str + ": ");
  return (char) System.in.read();
  }
  public static void main(String args[]) {
    char ch;
    try {
      ch = prompt("Enter a letter");
    }
    catch(java.io.IOException exc) {
     System.out.println("I/O exception occurred.");
     ch = 'X';
    }
    System.out.println("You pressed " + ch);
    }
}

这里需要throws子句吗?为什么我不能用这样的 try-catch 语句正常地执行此操作(抱歉,我不知道如何模拟 IO 异常,所以无法检查我自己!):

class ThrowsDemo {
   public static char prompt(String str)  {
     System.out.print(str + ": ");
     return (char) System.in.read();
  }
  public static void main(String args[]) {
    char ch;
    try {
      ch = prompt("Enter a letter");
    }
    catch(java.io.IOException exc) {
     System.out.println("I/O exception occurred.");
     ch = 'X';
    }
    System.out.println("You pressed " + ch);
    }
}

最佳答案

CheckedException 需要由调用者处理,Unchecked 异常则不需要。

因此,当您设计应用程序时,您应该考虑您正在管理哪种特殊情况。

例如,如果您设计一个验证方法来检查某些用户输入的有效性,那么您就知道调用者必须检查验证异常并以美观的方式向用户显示错误。这应该是一个已检查的异常。

或者,对于那些可以恢复的异常情况:假设您有一个负载均衡器,并且您希望通知调用者“n”台服务器之一已关闭,因此调用者必须恢复事件,将消息重新路由到另一台服务器;这应该是一个已检查的异常,因为调用者(客户端)尝试恢复错误至关重要,而不要只是让错误破坏程序流程。

相反,有许多情况不应该发生,和/或应该破坏程序。例如,编程错误(如除零、空指针异常)、API 的错误使用(IllegalStateException、OperationNotSupportedException)、硬件崩溃或一些不可恢复的小情况(与服务器的连接丢失),或世界末日:-);在这些情况下,正常的处理是让异常到达代码的最外层 block ,向用户显示发生了不可预测的错误,并且应用程序无法执行任何操作来继续。这是一个致命的情况,因此您唯一能做的就是将其打印到日志中或在用户界面中向用户显示。在这些情况下,捕获异常是错误的,因为捕获异常后需要手动停止程序以避免进一步的损坏;所以最好让某种异常“引起轰动”:)

由于这些原因,JRE 中也有一些未检查的异常:OutOfMemoryError(不可恢复)、NullPointerException(这是一个需要修复的错误)、ArrayIndexOutOfBoundsException(另一个错误示例)等等。

我个人认为 SQLException 也应该取消检查,因为它表示程序中的错误,或者数据库的连接问题。但是有很多例子,您会遇到异常,但您实际上不知道如何管理(RemoteException)。

处理异常的最佳方法是:如果可以恢复或管理异常,就处理它。否则让异常过去;其他人将需要处理。如果你是最后一个“别人”,并且不知道如何处理异常,只需显示它(记录或显示在 UI 中)。

关于java - Java 中的检查异常与非检查异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58887677/

相关文章:

python - 为什么 NumPy float 不给出 ZeroDivisionError?

c++ - 不同平台的系统异常处理

hadoop - 在 Hadoop 中运行 pyspark 时不是文件异常

Java 替换文本文件中的行

java - XML 文档的索引路径

Java & Windows-MY keystore - 重复的别名

windows - 在 Python 3.3 中捕获 TimeoutExpired 异常

Java 深度克隆对象

java - 使用 Singleton 与扩展 Application 类

php - 在这种情况下我应该重新抛出异常吗?