运行时/已检查/未检查/错误/异常之间的差异

时间:2010-07-02 01:33:22

标签: java exception exception-handling runtimeexception checked-exceptions

什么是运行时异常以及什么是已检查/未检查异常以及错误/异常之间的区别。为什么这么多类型?相反,Java可能只是遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?

8 个答案:

答案 0 :(得分:29)

Throwable是所有例外的最高点。 在Throwable下面你有错误和异常。 在Exception下面你有RuntimeException。

Java有两种类型的例外 - 已选中和未选中。检查的异常由编译器强制执行(您必须在throws子句中声明它们并最终捕获它们)。对于在throws子句中捕获或声明,不会强制执行未经检查的异常。

(答案中有争议的部分)

存在Throwable,因此所有异常类型都有父级。你永远不应该声明你扔掉了Throwable并且永远不会抓住它(除非你真的真的知道你在做什么)。

存在错误,表示运行时环境存在问题,程序可能无法从中恢复,例如格式错误的类文件或内存不足的VM。除非你真的知道自己在做什么,否则不应该发现错误。

异常作为所有非程序员错误的根存在(请参阅RuntimeException以了解“异常”),例如由于磁盘已满而无法创建文件。你不应该抛出,抛出或捕获异常。如果你必须捕捉异常,请确保你知道你在做什么。

存在RuntimeException以指示所有程序员错误,例如超过数组末尾或调用null对象上的方法。这些是你应该修复的东西,这样它们就不会抛出异常 - 这表明你,程序员,搞砸了代码。除非你知道自己在做什么,否则你不应该抓住这些。

答案 1 :(得分:28)

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

[图片由JavaTpoint提供]。

此处需要记住三个关键类:ThrowableExceptionError。在这些类Exception中,可以分为两种类型:" Checked Exception"和"未经检查的例外"。

已检查例外:

  • 除了ThrowableRuntimeException之外,这些是扩展Error的类。
  • 它们也称为编译时异常,因为它们在编译时被检查,这意味着编译器强制我们用try/catch处理它们或在函数签名中指出它throws它们和强制我们在来电者处理他们。
  • 它们是程序可恢复的问题,这些问题是由代码控制之外的意外情况引起的(例如数据库关闭,文件I / O错误,输入错误等)。
  • 示例: IOExceptionSQLException

未选中的例外:

  • 扩展RuntimeException的类称为未经检查的例外。
  • 未在编译时检查未经检查的异常,而是在运行时检查,因此命名为。
  • 它们也是可编程恢复的问题,但与已检查的异常不同,它们是由代码流或配置中的错误引起的。
  • 示例: ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException等。
  • 由于它们是编程错误,因此可以通过良好/明智的编码来避免它们。例如"除以零"产生ArithmeticException,可以通过对除数的简单检查来避免。同样,我们可以通过简单地检查引用来避免NullPointerExceptionif (object != null)或甚至使用better techniques

错误:

  • Error指的是try/catch未处理的无法恢复的情况。
  • 示例: OutOfMemoryErrorVirtualMachineErrorAssertionError等。

为什么这么多类型?

Stephen C的答案外,我想说: 异常处理是Java中相对昂贵的操作。 我们不应该将所有特殊情况放在try/catch块中。过度使用try/catch可能会妨碍计划效果。

总之,Exception应尽可能以编程方式处理。另一方面,我们无法处理Error,因此这些可能是为什么存在多种类型的异常的一些逻辑原因。

答案 2 :(得分:3)

TofuBeer's answer清楚地解释了异常类的含义。

  

为什么这么多类型?相反,Java可能只是遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?

为什么呢?因为他们是必要的!如果没有这4个类,那么按广义类别处理异常将是不切实际的。

  • 如果没有Error类,你会如何捕获“所有致命的JVM错误?”
  • 如果没有Exception类,您如何捕获“不是JVM致命错误的所有异常”?
  • 如果没有RuntimeException类,您将如何捕获“所有未经检查的异常”?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  • 错误(由VM引发,不应该被捕获或处理)
    1. VM错误
    2. 断言错误
    3. 链接错误......等等
  • 运行时/取消选中异常(编程错误,不应该被捕获或处理)
    1. 的NullPointerException
    2. ArrayIndexOutOfBoundException
    3. IllegalArgumentException ...依旧
  • 检查例外(任何其他情况,预计应用程序将被捕获或处理)
    1. IOException的
    2. FileNotFoundException异常
    3. SQLException ...依旧

答案 5 :(得分:0)

已检查和未检查的异常之间的区别:

检查异常和未检查异常之间有很多差异,但是所有差异都源于一次基本的考虑,即异常是否可由编译器解决。

要记住的要点是:

[1]已检查的异常表示编译器已检查的异常。这意味着编译器要求通过try-catch块或throws关键字处理此类异常。

[2]未检查的异常是编译器没有提供任何授权的异常,因为开发人员可以通过编码/编程来解决它们,因为控制流是可控制的,如ArithmeticException,NullPointerException ArrayIndexOutOfBoundsException ,IllegalArgumentException等。

我将其称为“ Exception-Identity-Test” ,您可以在其中从Java文档中获取任何随机异常,然后只问一个问题。 “例外!可以通过编程方式解决吗?”

如果异常说,则它是未经检查的异常,因为可以通过代码更改或解决某些计算错误等方式来解决。

另一方面,如果“异常”显示为“ ”,则这是“已检查的异常”,如已检查的异常控制流超出了我们的代码,例如有人更改了数据库密码或有人拔出了网络电缆,连接超时(ConnectException),找不到某些资源(FileNotFoundException,ClassNotFound),SQLException,InvocatonTargetException等。这些不能通过编程来解决

答案 6 :(得分:-1)

article以简洁明了的方式总结了 Checked Unchecked 异常。

  • 已检查的异常 已检查的异常是可以在编译时检测,识别和检查的异常。如果代码块引发了检查的异常,则该方法必须处理该异常,或者必须使用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");
      }
      
    • 我们要么需要使用throws指定异常列表,要么需要使用try-catch{}块。我已经在下面的程序中演示了throws的用法。

  • 未经检查的异常 未经检查的异常在编译时不进行检查。 ErrorRuntimeException类下的Java异常是未经检查的异常,而 throwable 下的其他所有事物都经过检查。

  

摘要:如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。

答案 7 :(得分:-1)

Exceptions are two types in java:

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

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

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

例如:如果您正在对一个对象执行操作而不创建它;在这种情况下,您将获得NullPointerException。