不能使用try / catch块处理java未经检查的异常?

时间:2011-11-12 12:21:14

标签: java exception exception-handling

在教程中,我发现您的代码无法处理未经检查的异常,即我们无法使用try/catch块,示例是ArrayIndexOutOfBoundsException, NullPointerException.之类的例外但是可以使用try / catch块处理这些异常。我想我不清楚这个概念!!

另外我认为throw关键字只能用于try/catch block.can throw关键字与UncheckedException一起使用?

8 个答案:

答案 0 :(得分:32)

已检查和未检查的异常之间的唯一区别是已检查的已使用throws在方法签名中捕获或声明了,而对于未经检查的异常,这是可选的。

  

您的代码无法处理未经检查的异常,即我们无法使用try / catch块

当然可以 - 但我们没有。

  

另外我认为throw关键字只能用于try / catch block.can throw关键字可以与Unchecked Exception一起使用吗?

请注意,有两个关键字:

  • throw显式抛出您创建的异常对象。 throw new NullPointerException();工作得非常好,虽然明确地创建了这个特殊的异常并不常见,但大多数人会认为它很糟糕。
  • throws声明方法可能抛出该异常。使用未经检查的异常,这是可选的,但是可以用来记录事实(同样,通常不会声明throws NullPointerException,因为这几乎是给定的。)

答案 1 :(得分:6)

所有未经检查的异常都可以像检查的那样处理 - 如果需要,可以通过声明方法throws来让它们通过:

public void m() throws RuntimeException {}

或者你可以catch他们:

public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}

应该注意,类RuntimeException充当未经检查的异常的全部(因为所有未经检查的异常都从它扩展),就像Exception类是一样的检查异常的全部内容。

如前所述,唯一真正的区别在于,对于已检查的异常,您来处理它们(通过让它们通过或捕获它们)并且编译器将确保它 - 在另一方面,未经检查的例外的处理是可选的。

这一切都归结为每种异常类型的预期用法 - 你应该能够从已检查的异常中恢复(或至少在它们发生时对它们做些什么),而对于未经检查的异常,可能没有从他们身上恢复是一种合理的方式。这当然有点主观。

答案 2 :(得分:5)

他们可以处理,但你不得。如果你不处理它们,它们将传播并爬上调用方法堆栈,直到其中一个捕获它。如果没有,程序将崩溃。

通常,最重要的是,如果可以合理地期望客户端从异常中恢复,那么它应该是已检查的异常。如果客户端无法执行任何操作以从异常中恢复,则可以将其作为未经检查的异常

此外,已检查的例外对于记录您希望第三方使用的API非常有用。当他们知道你的方法可以抛出一个特定的异常时,他们会相应地编码并处理这个案例。如果您只使用未经检查的例外,则所有投注均已关闭。

一种常见的模式(有些人不喜欢它,但在某些情况下,当你知道自己在做什么时它是可以的)是将抛出的已检查异常包装到未经检查的模式中。

try {
   ... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
    throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}

答案 3 :(得分:3)

考虑差异的一种简单方法是认为检查是指编译。如果异常是已检查的异常,编译器将检查您的代码是否抛出异常或在编译时在try / catch块中处理它。对于未经检查的异常,编译器不会进行此类检查。您可以以相同的方式处理已检查/未检查的异常(使用try / catch / throws),区别仅在于编译器执行的检查。这篇文章有一个不错的example

答案 4 :(得分:3)

除了纪尧姆:

  • 未经检查的异常通常是编程错误,如果正确实现(索引越界,空指针,类强制转换......),则根本不会发生这种情况,因此调用者/用户通常无法对它们采取任何措施。
  • 检查异常被抛出,因为它超出了程序员的控制范围(网络不可用,文件系统不可用,并发修改,如重复的主键,......)
  • 错误通常由JVM引发,应用程序通常必须停止(内存不足,堆栈溢出......)

答案 5 :(得分:0)

是的,您可以使用throw投放未经检查的例外。是的,您可以在catch块中捕获未经检查的异常。

答案 6 :(得分:0)

是的,您可以处理未检查的异常,但不是强制性的。实际上,它取决于应用程序开发人员。以下是我认为甚至需要处理未经检查的异常的可能原因。

  • 如果您的应用程序很大,许多开发人员正在互相调用API。最好处理未检查的异常,否则最终您的程序将崩溃,从而停止其他功能。因此,即使是简单的NullPointerException也可以使您的程序停止工作。

  • 假设您有一个调度程序,该调度程序处理用户数据且大小为百万,对于坏数据,您只想打印日志而不停止处理其他好数据。在这种情况下,如果您没有处理异常,则一个错误的数据可能会停止您的程序

答案 7 :(得分:-3)

是的,我们可以处理运行时异常,请检查下面的代码

public class Demo {
  static void m1() {
    int a[]=new int [5];
    try {
    a[12]=2;
    }catch(Exception e) {

    }
  }

  public static void main(String[] args) {
    m1();
   try {
    String s=null;

    System.out.println(s.length());
   }catch(Exception e) {

   }
    System.out.println("hello world");
  }
}