每当我们使用“扔”时,我们是否必须使用“投掷”?

时间:2013-11-20 14:11:47

标签: java exception

我的问题很简单:

Java中,每当我们在方法中使用throw时,假设exception throwingchecked为{{1}},是否必须添加“抛出“在方法声明中?

谢谢:)

5 个答案:

答案 0 :(得分:2)

需要在方法签名中声明任何可能转义方法的已检查异常(例如,不扩展RuntimeException的异常)。例如:

public static void mightThrow(String s) throws NumberFormatException {
    // ...
    int x = Integer.parseInt(s);
    // ...
}

即使我们不直接抛出任何异常,Integer.parseInt()也可能会抛出一个已检查的NumberFormatException。由于我们调用该方法,并且我们没有捕获潜在的异常,因此我们的方法还必须在其throws签名中声明该异常。

这并不一定意味着抛出(或可能抛出)已检查异常的每个方法都必须在其签名中声明throws。如果抛出的异常总是在该方法中捕获,则无需将其添加到签名中。例如:

public static Integer tryParseInteger(final String s) {
    try {
        return Integer.parseInt(s);
    }
    catch (NumberFormatException ignored) {
        return null;
    }
}

在这个例子中,我们将始终捕获NumberFormatException可能引发的任何Integer.parseInt()并阻止它冒出堆栈,因此我们不需要在{{1}中声明它方法。

永远不需要声明未经检查的例外:

tryParseInteger()

此处,因为public static void unsupported() { throw new UnsupportedOperationException( "The specified operation is not supported." ); } 来自未经检查的UnsupportedOperationException,所以不需要声明它。

答案 1 :(得分:0)

不,因为您可能想要抛出异常但是在同一个地方处理它,也就是方法

答案 2 :(得分:0)

Throws只是让javac知道这个方法可能会导致这种异常。并非总是必要的。当你知道特定的方法可以引发某种异常时,这很有用。

答案 3 :(得分:0)

一般来说,Java是异常严格的,因此您必须具体说明方法throws的异常类型。请注意,您可以使用继承来简化方法的签名。例如,您可以将方法声明为throws IOException,并在其实现中抛出任何类型的IOException,例如FileNotFoundExeptionInteruptedIOException等。

此规则的一个例外(无双关语)是RuntimeException s(例如OutOfMemoryErrorUnsupportedOperationException),可以在不必声明它们的情况下抛出它们。

答案 4 :(得分:0)

的差异:

1)你可以通过将它们共同分开来声明throws关键字中的方法抛出的多个异常,例如:抛出IOException,ArrayIndexBoundException等,而你只能使用throw关键字抛出一个异常实例,例如抛出新的IOException(“无法打开连接”)。

2)throws关键字赋予方法灵活性抛出异常而不是处理它。在方法中使用throws关键字 签名一种方法,建议其调用者准备在throws子句中声明的Exception,特别是在检查Exception的情况下并提供对它们的充分处理。另一方面,通过抛出Exception实例,将执行的关键字转移控制抛给调用者。 throw关键字也可用于代替return,如下例所示:

 private static boolean shutdown() {
    throw new UnsupportedOperationException("Not yet implemented");
 }

如下面的方法shutdown应该返回布尔值,但是有了put in place编译器可以理解这个方法总是抛出异常。

3)throws关键字不能在任何地方使用异常方法签名,而throw关键字可以在方法或静态初始化块中使用,提供足够的异常处理,如例子所示。

 static{
    try {
        throw new Exception("Not able to initialized");
    } catch (Exception ex) {
         Logger.getLogger(ExceptionTest.class.getName()).log(Level.SEVERE, null, ex);
    }
}

4)throw关键字也可用于在不使用break关键字的情况下中断switch语句。

int number = 5;
 switch(number){
        case 1:
            throw new RuntimeException("Exception number 1");
        case 2:
            throw new RuntimeException("Exception number 2");
    }