我的问题很简单:
在Java
中,每当我们在方法中使用throw
时,假设exception
throwing
为checked
为{{1}},是否必须添加“抛出“在方法声明中?
谢谢:)
答案 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
,例如FileNotFoundExeption
,InteruptedIOException
等。
此规则的一个例外(无双关语)是RuntimeException
s(例如OutOfMemoryError
或UnsupportedOperationException
),可以在不必声明它们的情况下抛出它们。
答案 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");
}