什么是运行时异常,检查/未选中的异常和错误/异常之间的差异是什么?为什么这些类型?相反,Java可以简单地遵循简单的设计(只需尝试/捕获所有类型)即可处理程序中的异常情况?

有帮助吗?

解决方案

可投掷是所有例外的顶部。在可投掷的下方,您有错误和例外。在例外,您有RuntimeException。

Java有两种类型的异常 - 检查和未选中。编译器强制执行检查的例外(您必须在“投掷”子句中声明它们并最终捕获它们)。在掷球子句中捕获或宣布未经检查的例外。

(答案的有争议的部分)

存在可投掷,因此有所有异常类型的父母。您绝不应该宣布您投掷可投掷并永远不会抓住它(除非您真的真的真的知道自己在做什么)。

存在错误以指示运行时环境的问题,即您的程序可能无法从中恢复的问题,例如格式不佳的类文件或VM用完存储器。除非您真的知道自己在做什么,否则您不应遇到错误。

异常是所有非编程器错误的根(请参阅此“异常”的RuntimeException),例如由于磁盘已满,因此无法创建文件。您不应该投掷,投掷或捕获异常。如果您必须捕获异常,请确保您知道自己在做什么。

存在RunTimeException以指示所有程序员错误,例如超越数组的末尾或调用NULL对象上的方法。这些是您应该修复的事情,以便它们不引发异常 - 表明您,程序员将代码搞砸了。同样,除非您知道自己在做什么,否则您不应抓住这些。

其他提示

由于我是一个新的Java开发人员,因此我还面临一些区分和处理不同类型异常的困难。这就是为什么我对这个话题做了简短的说明,每当我感到困惑时,我都会经历。这里是 Throwable 类层次结构:
Throwable Class Hierarchy

图像提供 Javatpoint].

这里有三个关键类要记住: Throwable, ExceptionError. 。在这些课程中 Exception 可以分为两种类型:“检查异常”和“未检查的异常”。

检查例外:

  • 这些是扩展的类 Throwable 除了 RuntimeExceptionError.
  • 它们也被称为编译时间例外 try/catch 或在功能签名中指示它 throws 他们并强迫我们在呼叫者中与他们打交道。
  • 它们是可恢复的问题,是由代码控制之外的意外条件引起的(例如数据库降低,文件I/O错误,错误输入等)。
  • 例子: IOException, SQLException, , ETC。

未选中的例外:

  • 扩展的类 RuntimeException 被称为未选中的例外。
  • 未检查的例外情况未在编译时检查,而是在运行时检查,因此名称。
  • 它们也是可以恢复的编程性问题,但与 检查例外 它们是由代码流或配置中的故障引起的。
  • 例子: ArithmeticException,NullPointerException, ArrayIndexOutOfBoundsException, , ETC。
  • 由于它们是编程错误,因此可以通过很好/明智地编码来避免它们。例如,“除以零”会产生 ArithmeticException, ,可以通过对除数的简单检查来避免这种情况。同样,我们可以避免 NullPointerException 通过简单地检查参考文献: if (object != null) 甚至使用 更好的技术.

错误:

  • Error 指的是无法解决的情况 try/catch.
  • 例子: OutOfMemoryError, VirtualMachineError, AssertionError, , ETC。

为什么这些类型?

此外 斯蒂芬c我想说的答案:例外处理是Java的一个相对昂贵的操作。 我们不应该把所有特殊情况放在 try/catch 堵塞。过度使用 try/catchS May妨碍了计划的性能。

综上所述, ExceptionS应尽可能以编程方式处理。另一方面,我们无法处理 ErrorS,因此这些可能是有很多类型的异常的逻辑原因。

Tofubeer的答案 清楚说明异常类的含义。

为什么这些类型?相反,Java可以简单地遵循简单的设计(只需尝试/捕获所有类型)即可处理程序中的异常情况?

为什么?因为它们是必要的!如果没有这四个类别,则按广泛的类别处理例外将是不切实际的。

  • 您如何在没有的情况下捕获“所有致命的JVM错误” Error 班级?
  • 您如何在没有的情况下捕获“所有不是JVM致命错误的例外” Exception 班级?
  • 您如何在没有的情况下捕获“所有未选中的例外” RuntimeException 班级?
  • 错误(由VM投掷,不应捕获或处理)
    1. VM错误
    2. 断言错误
    3. 链接错误...
  • 运行时/UNCHECK异常(编程错误,不应捕获或处理)
    1. 空指针异常
    2. ArrayIndexOutOfBoundException
    3. nirgalargumentException ...
  • 检查异常(其他任何内容,预计将被捕获或处理)
    1. ioException
    2. FILENOTFOUNDEXCEPTION
    3. sqlexception ...等等

运行时异常为您提供了避免捕获并声明异常的灵活性。

检查和未选中的例外之间的区别:

我们在检查和未检查的例外之间存在许多差异,但是所有差异都来自曾经的基本考虑,即是否是 编译器是否可以解决异常。

要记住的要点是:

1]检查的异常手段 编译器检查了异常. 。这意味着编译器要求通过try-catch块或抛出关键字来处理此类例外。

2]未选中的例外是编译器 不提供任何任务 由于可以通过编码/编程来解决它们,因为控制流是可以控制的,例如arithmeticexception,nullpoInterException arrayIndIndexOutofBoundSexception,iLlegalArgumentException等。

我称之为 “异常 - 身份测试” 在您从Java Doc中获取任何随机例外的地方,然后问一个问题。 “嘿例外!您可以通过程序解决吗?”

如果例外说 是的 然后,这是一个未选中的例外,因为可以通过更改代码或解决某些计算错误等来解决。

另一方面,如果例外说 然后,该检查的异常如在检查异常控制流中从我们的代码中输出,例如某人更改数据库密码或有人拔下网络电缆,连接超时(ConnectException),找不到某些资源(filenotfoundexception,classNotFound),sqlexlexception,sqocatontontargetException et invocatontargetection等。这些不能通过编程来解决

这个 文章 汇总 检查未选中 以清晰而简洁的方式例外。

  • 检查例外: 检查例外 是可以在编译时检测,识别和检查的例外。如果代码块抛出了检查的异常,则该方法必须处理异常,否则必须使用异常 throws 关键词。

    • 例子:

      public void testDB() throws ClassNotFoundException, SQLException
      {
          Class.forName("com.mysql.jdbc.Driver");
          System.out.println("Driver Loaded");
          Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/selenium","root","root");
          System.out.println("Connected to MySQL DB");
      }
      
    • 我们要么需要使用投掷指定异常列表,要么需要使用 try-catch{} 堵塞。我已经证明了 throws 在以下程序中。

  • 未选中的例外: 未选中的例外 未在编译时检查。 Java例外 ErrorRuntimeException 课程是不受限制的例外和其他所有内容 可投掷 被检查。

概括: :如果可以合理地期望客户从异常中恢复,请将其作为检查例外。如果客户无法做任何事情以从异常中恢复,请使其成为未选中的异常。

下图显示了异常类的层次结构。所有异常对象的基类是 java.lang.Throwable, ,以及它的两个子类 java.lang.Exceptionjava.lang.Error.

enter image description here

  • Error 类描述内部系统错误(例如 VirtualMachineError, LinkageError)很少发生。如果发生这样的错误,您几乎无法执行此操作,并且程序将被Java运行时终止。

  • Exception 课程描述了您程序引起的错误(例如 FileNotFoundException, IOException)。这些错误可能会被您的程序捕获和处理(例如,执行替代操作或通过关闭所有文件,网络和数据库连接来进行优雅的退出)。

检查与未选中

如图所示, ErrorRuntimeException 被称为 未选中 例外。编译器未检查这些例外,因此无需抓或宣布在您的程序中抛出。这是因为对于这些例外,您无能为力。例如,“除以0”触发 ArithmeticException, ,阵列索引外部触发 ArrayIndexOutOfBoundException, ,这确实是编程的编程逻辑错误,这些错误应在编译时固定,而不是将其留在运行时例外处理。

所有其他例外被称为 检查 例外。它们由编译器检查,必须被抓或宣布被扔掉。

RuntimeException 而且,编译器未检查其子类,不必在该方法的签名中声明。因此,要小心地使用它们,因为您将不会被告知,并且可能不会意识到使用该方法可能发生的例外(因此没有适当的例外处理代码) - 不良的软件工程实践。

来源是 这里

Exceptions are two types in java:

1. **Checked Exception: The exceptions which are checked by compiler. 

例如:我们您正在使用文件执行操作,然后编译器会要求您通过try-catch块或抛出关键字来处理IOException。

2. Unchecked Exception: The exceptions which are not checked by compiler at run time. 

例如:如果您在对象上执行操作而不创建该操作;在这种情况下,您将获得NullPoInterException。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top