2

我有一些代码:

public static void a() throws NumberFormatException {
        return;
    }

    public static void b() throws InterruptedException{
        return;
    }

    public static void main(String[] args) {

        a();
        b();

    }

并且 Eclipse 说我必须将 try/catch 包围到函数调用 b(),但我不必使用 a() 调用来做到这一点。为什么?如何使函数 make 在被调用时用 try 和 catch 包围?

4

9 回答 9

6

Because InterruptedException is a checked exception and NumberFormatException is an unchecked expcetion.

For checked exception, compiler forces you to either surround them with try-catch block or declare them with throws, while for unchecked exceptions try-catch block is not compulsory.

As function a() throws NumberFormatException (unchecked exception) compiler do not force you to surround the function call with try-catch.

As function b() throws InterruptedException (checked exception) compiler forces you to either surround the function call with try-catch or declare them with throws.

于 2013-04-16T09:07:22.197 回答
2

NumberFormatException is not a checked Exception(i.e because it has java.lang.RuntimeException as its base class), which means that the developer is not forced to handle(its the developer's choice whether to handle it or not) when the developer chooses not to handle the exception and if the exception occurs, it will be handled by the JVM.

Where as InterruptedException (i.e because it has java.lang.Exception as its base class) is a checked exception which means that the developer has to handle it every time either by using a try-catch block or by declaring the exception in the Throws clause.

Take a look at this example.

于 2013-04-16T09:07:29.430 回答
1

NumberFormatException 是一个 RuntimeException -> 未选中

InterruptedException 是一个检查异常

我发现 Java 教程对于学习 Java 及其 API 非常有用,事实上,我仍然不时使用它:

http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html

http://docs.oracle.com/javase/tutorial/

于 2013-04-16T09:11:53.960 回答
1

This is because NumberFormatException extends RuntimeException - i.e. it is unchecked exception. While InterruptedException is checked exception - it should be catched in try...catch block, or you should add throws to main() method.

于 2013-04-16T09:07:43.377 回答
1

因为 NumberFormatException() 是未经检查的异常 InterruptedException 被检查,你必须用 try-catch 来包围检查的异常,但你不必尝试检查 - 每个方法都会有 try-catch。

于 2013-04-16T09:08:38.483 回答
0

公共类 InterruptedException 扩展 Exception 在线程等待、休眠或以其他方式被占用时抛出,并且线程在活动之前或期间被中断。有时某个方法可能希望测试当前线程是否已被中断,如果是,则立即抛出此异常。

但对于第一种情况,它不会询问 NumberFormatException 是未经检查的异常。

于 2013-04-16T09:09:23.530 回答
0

所有Exception扩展RuntimeException并不意味着明确的 try-catch 块。他们被称为Unchecked。这些异常理论上保留给 VM 抛出的不可恢复的运行时错误。然而,它们现在被普遍使用,因为很多人同意说Checked异常机制是一个糟糕的设计概念。

Unchecked当您的程序无法从错误中恢复并让它们传播到将负责正确记录和/或向用户显示错误的横向层异常处理时,您通常会使用它。

检查异常通常用于调用者需要处理错误的情况,因为它能够从中恢复或触发特定行为。

于 2013-04-16T09:15:35.767 回答
0

关键字throws声明一个方法可能会抛出该异常。虽然已检查的异常必须与未检查的异常一起处理,但这是可选的。在您的情况下,a 抛出一个NumberFormatException,它派生自 RuntimeException ,根据定义,这是一个未经检查的异常,请参阅第 11.2 节:异常的编译时检查

未经检查的异常类是类 RuntimeException 及其子类,以及类 Error 及其子类。所有其他异常类都是检查异常类。

根据定义,b类抛出的InterruptedException是一个检查异常(必须在try-catch块中捕获)。

于 2013-04-16T09:25:43.740 回答
0

Java中有两种处理异常的方法 -

1. surround try/catch
2. propagate exeption

如果要在本地处理此异常,请使用 try/catch 块。基本上,try块内是有可能引发异常的代码。

但是throws SomeException如果您希望这可能exception由...处理,您可以在方法签名中使用calling method...这calling method也可以进一步传播exception...如果所有方法都不会try/catch出现此异常,它将由Java Virtual Machineat抛出execution time

于 2013-04-16T09:29:03.560 回答