我从未使用过“throws”子句,今天一位配偶告诉我,我必须在方法声明中指定方法可能抛出的异常。但是,如果不这样做,我一直在使用异常而没有问题,那么,实际上,如果需要它,为什么需要呢?
答案 0 :(得分:24)
Java有两种不同类型的例外:已检查例外和未选中例外。
未经检查的异常是RuntimeException
的子类,您不必添加throws声明。所有其他异常必须在方法体中处理,可以使用try / catch语句或使用throws声明。
未经检查的异常的示例:IllegalArgumentException
有时用于通知,已使用非法参数调用方法。不需要投掷。
已检查异常的示例:IOException
java.io
包中的某些方法可能会抛出。使用try / catch或将throws IOException
添加到方法声明中,并将异常处理委托给方法调用者。
答案 1 :(得分:13)
如果使用throws关键字声明了一个方法,那么任何其他希望调用该方法的方法都必须准备好捕获它或声明它本身会引发异常。
例如,如果要暂停应用程序,则必须调用Thread.sleep(milliseconds);
但是这个方法的声明说它会抛出一个InterruptedException
<强>声明:强>
public static void sleep(long millis) throws InterruptedException
因此,如果您希望在main方法中调用它,则必须捕获它:
public static void main(String args[]) {
try {
Thread.sleep(1000);
} catch(InterruptedException ie) {
System.out.println("Opps!");
}
}
或者让该方法也声明它抛出异常:
public static void main(String args[]) throws InterruptedException {
Thread.sleep(1000);
}
答案 2 :(得分:6)
即使使用已检查例外,也可能发生这种情况。有时它会破坏记录。
假设一个库方法使用这个技巧来允许实现可以抛出Runnable
的{{1}}:
IOException
你这样称呼它:
class SneakyThrowTask implements Runnable {
public void run() {
throwSneakily(new IOException());
}
private static RuntimeException throwSneakily(Throwable ex) {
return unsafeCastAndRethrow(ex);
}
@SuppressWarnings("unchecked")
private static <X extends Throwable>X unsafeCastAndRethrow(Throwable ex) throws X {
throw (X) ex;
}
}
永远不会记录异常。因为它是一个经过检查的例外,你不能这样写:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
}
}
答案 3 :(得分:4)
我很确定如果您尝试抛出一个已检查的异常,并且未将该方法声明为抛出该类型,则代码甚至无法编译(现在检查)。
编辑,如果您尝试像
这样简单的事情就行了public static void main(String[] args) {
throw new Exception("bad");
}
您收到编译错误。
特别针对您的问题,如果您调用声明为抛出异常的方法,则必须尝试/捕获方法调用,或声明您的方法抛出异常。
答案 4 :(得分:3)
throws
关键字用于引发另一个方法的异常。
它减轻了用户的处理异常。因为这样所有异常都可以在用于运行的方法中处理。
大多数情况下,它主要是一种方法,因此用户无需在方法内部进行探索。
它还会向编译器抛出关键字强制,以处理可能发生的异常。
如果您是API开发人员,则在编写代码时,您可能会看到可能会发生异常,因此在方法运行时,您可以使用throws
关键字来处理它。
答案 5 :(得分:2)
Java抛出关键字,
throws
关键字用于声明异常。throws
之后是课程。throws
传播。 throws
示例,
void m()throws ArithmeticException{
//method code
}