如果方法抛出未在方法声明中使用“throws”指定的exception,会发生什么情况
我从来没有使用过“throws”子句,今天一个伙伴告诉我,我必须在方法声明中指定方法可能引发的exception。 但是,如果不这样做,我一直在使用exception而没有问题,那么,实际上,为什么需要它呢?
Java有两种不同类型的例外: checked Exceptions和unchecked Exceptions。
未经检查的exception是RuntimeException
子类,您不必添加throws声明。 所有其他exception必须在方法体中处理,可以使用try / catch语句或使用throws声明。
未经检查的exception的示例: IllegalArgumentException
,有时用于通知,已使用非法参数调用方法。 不需要投掷。
已检查exception的示例: IOException
,即java.io
包中的某些方法可能抛出。 使用try / catch或者将throws IOException
添加到方法声明并将exception处理委托给方法调用者。
如果使用throws关键字声明了一个方法,那么任何其他希望调用该方法的方法都必须准备好捕获它或声明它本身会引发exception。
例如,如果要暂停应用程序,则必须调用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!"); } }
或者让方法也声明它抛出exception:
public static void main(String args[]) throws InterruptedException { Thread.sleep(1000); }
即使使用经过检查的例外,它也可能发生 有时它会打破记录。
假设一个库方法使用这个技巧来允许实现可以抛出IOException
的Runnable
:
class SneakyThrowTask implements Runnable { public void run() { throwSneakily(new IOException()); } private static RuntimeException throwSneakily(Throwable ex) { return unsafeCastAndRethrow(ex); } @SuppressWarnings("unchecked") private static 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); } }
永远不会记录该exception。 因为它是一个经过检查的例外,你不能这样写:
public static void main(String[] args) { try { new SneakyThrowTask().run(); } catch (RuntimeException ex) { LOGGER.log(ex); } catch (IOException ex) { LOGGER.log(ex); // Error: unreachable code } }
- 您需要声明方法抛出的已检查exception。
- 如果你声明’抛出exception’,它几乎涵盖了大部分(如果不是全部)已检查的exception
- 您始终可以抛出未经检查的运行时exception,而不必声明。
我很确定如果你试图抛出一个已检查的exception,并且没有将该方法声明为抛出该类型,则代码甚至不会编译(现在检查)。
编辑,如果你尝试一些简单的东西就这样吧
public static void main(String[] args) { throw new Exception("bad"); }
你得到一个编译错误。
特别针对您的问题,如果您调用声明为抛出exception的方法,则必须尝试/捕获方法调用,或声明您的方法抛出exception。
throws
关键字用于向另一个方法抛出exception。
它简化了用户的句柄exception。 因为所有exception都可以在用于运行的方法中处理。
主要是它主要是一种方法,因此用户不需要在方法内部进行探索。
它还会向编译器抛出关键字强制以处理可能发生的exception。
如果您是API开发人员,那么在编写代码时,您可能会发现可能发生exception,因此在方法运行时使用throws
关键字来处理它。
Java抛出关键字,
- Java
throws
关键字用于声明exception。 - 后面是课堂。
- 可以使用
throws
传播已检查的exception。 - 它向调用者提供有关exception的方法的信息。
throws
例子,
void m()throws ArithmeticException{ //method code }