当前位置: 首页 > 面试题库 >

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

呼延德华
2023-03-14
问题内容

我在理解Java checkedunchecked异常之间的区别时遇到了一些问题。

  1. 首先,checked异常应该在编译时寻找异常。在不同来源中提供的示例引用了数据库连接性,其中一些是文件处理,而unchecked异常应该是在程序员方面寻找错误,例如索引超出数组范围等。

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

2其次,RunTimeException自身如何成为unchecked子类Exception,这又是checked什么呢?这意味着什么?

我在赫伯特·希尔德(Herbert Schildt)的书中找到了一个解释checked异常用法的示例:

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 Exception,所以我自己无法检查!):

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),硬件崩溃或仅是一些不可恢复的小情况(与服务器的连接丢失),或世界末日:-);
在这种情况下,正常的处理是让异常到达代码的最外层代码块,该代码块向用户显示发生了不可预测的错误,并且应用程序无法继续执行操作。这是一种致命的情况,因此您唯一可以做的就是将其打印到日志或在用户界面中显示给用户。在这些情况下,捕获异常是错误的,因为,捕获异常后,您需要手动停止该程序,以免造成进一步的损害;因此最好让某种异常“打迷”
:)

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

我个人认为SQLException也应该不受检查,因为它表示程序中的错误或与数据库的连接问题。但是,有许多示例会导致您例外,而您实际上对管理方法一无所知(RemoteException)。

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



 类似资料:
  • 问题内容: 我在一个带有旧服务层的项目上工作,如果请求的记录不存在,或者由于调用者未得到授权而无法访问,则在很多地方返回null。我说的是ID要求的特定记录。例如,类似: 最近,我一直在努力更改此API,或者用引发异常的新API进行补充。随之而来的是关于检查与未检查的异常的争论。 从JPA / Hibernate等所有设计师的笔记中,我建议未检查的异常可能是最合适的。我的观点是,不能合理地期望AP

  • 问题内容: 约书亚·布洛赫(Joshua Bloch)在《有效的Java》中说 将检查的异常用于可恢复的条件,将运行时异常用于编程错误(第二版中的项目58) 让我们看看我是否正确理解了这一点。 这是我对检查异常的理解: 1.以上是否被视为经过检查的异常? RuntimeException是未经检查的异常吗? 这是我对未经检查的异常的理解: 4.现在,上面的代码难道不是一个检查过的异常吗?我可以尝试

  • 问题内容: 阅读本书中的 Exception时,我发现了以下语句: 被检查的异常由编译器在编译时检查。 和 编译器不会在编译时检查未经检查的异常。 因此,如果我们也可以说或 位于Checked Exceptions类树之下。如何将java编译器知道 会有 一个例外,没有对 其中 可能 仍然 代码为我的理解里面。 另外,强制捕获Checked异常而不是Unchecked意味着什么呢? 问题答案: J

  • 问题内容: 据我了解,如果不逐一查找API文档,就无法找出方法抛出的异常。 由于这是没有选择的,因此我想撤消研究,并询问您在处理时遇到的最常见的Exception和RuntimeException: 铸件 数组 向量,ArrayList,HashMap等 IO(文件类,流,过滤器…) 对象序列化 线程(wait(),sleep()等) 或任何其他被视为“基本Java”的内容 我意识到这可能是主观的

  • 我有以下两个示例,我不清楚java.lang.Exception是如何处理的:作为检查的或未检查的异常。 以下方法编译成功: 在这里,我认为java.lang.Exception是威胁java.lang.RuntimeException或java.lang.Error。不处理也可以声明扔。 如果我们没有使用异常,而是使用了检查异常(它是java.lang.Exception的子类),那么您必须在方

  • 问题内容: 在Java(或任何其他具有检查的异常的语言)中,当创建自己的异常类时,如何决定应检查还是不检查它? 我的直觉是,在调用者能够以某种有效的方式进行恢复的情况下,将要求使用检查异常,而对于无法恢复的情况,未检查异常将更多,但是我会对其他人的想法感兴趣。 问题答案: 只要你知道何时应使用检查异常,它就很棒。Java核心API未能遵循SQLException(有时甚至是IOException)