我何时必须使用try / catch包围?

时间:2013-04-16 09:04:56

标签: java eclipse

我有一些代码:

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(),但是我不必使用()调用。为什么?如何在调用时使用try和catch来创建函数make?

9 个答案:

答案 0 :(得分:6)

由于InterruptedException是已检查的例外,NumberFormatException是未经检查的过期。

对于已检查的异常,编译器强制您使用try-catch阻止它们或使用throws声明它们,而对于未检查的异常,try-catch阻止不是强制性的。

当函数a()抛出NumberFormatException(未经检查的异常)时,编译器不会强制您使用try-catch包围函数调用。

当函数b()抛出InterruptedException(已检查异常)时,编译器会强制您使用try-catch包围函数调用,或使用throws声明它们。

答案 1 :(得分:2)

NumberFormatException不是一个经过检查的异常(即因为它有java.lang.RuntimeException作为其基类),这意味着开发人员不会被迫处理(开发人员的选择是否处理它) )当开发人员选择不处理异常时,如果发生异常,它将由JVM处理。

其中InterruptedException(即因为它有java.lang.Exception作为其基类)是一个经过检查的异常,这意味着开发人员每次都要使用try-catch块或者通过在Throws子句中声明异常。

看看这个example

答案 2 :(得分:1)

这是因为NumberFormatException扩展了RuntimeException - 即unchecked例外。虽然InterruptedExceptionchecked例外 - 但应该在try...catch块中捕获,或者您应该将throws添加到main()方法。

答案 3 :(得分:1)

因为NumberFormatException()是未经检查的异常,所以检查了InterruptedException,你必须使用try-catch来检查异常,但是你不必检查try-catch - 那么每个方法都会有try-catch。

答案 4 :(得分:1)

NumberFormatException是一个RuntimeException - >未选中

InterruptedException是一个已检查的异常

我发现Java Tutorial非常有用于了解Java及其API,事实上,我仍然经常使用它:

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

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

答案 5 :(得分:0)

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

但是对于第一种情况,它不会要求NumberFormatException是未经检查的expcetion。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

关键字throws声明方法可能抛出该异常。虽然必须使用未经检查的异常处理已检查的异常,但这是可选的。在你的情况下,抛出一个NumberFormatException,它是从RuntimeException派生的,根据定义是一个未经检查的异常,见Section 11.2: Compile-Time Checking of Exceptions

  

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

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

答案 8 :(得分:0)

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

1. surround try/catch
2. propagate exeption

如果要在本地处理此异常,请使用try / catch块。基本上,在try块中是一个有可能抛出异常的代码。

但如果您希望throws SomeException可以处理exception这个问题,那么您可以在方法签名中使用calling method ... calling method也可以传播此exception try/catch 1}}进一步向上......如果所有方法都不会Java Virtual Machine此异常,execution time {{1}}会抛出它{/ 1}}