Checked和Unchecked Exptions如何在Java中运行?
阅读本书中的例外情况,我发现了这样的说法:
编译器在编译时检查已检查的exception。
和
编译器不会在编译时检查未经检查的exception。
因此,如果我们也可以说IOException
或SQLException
位于Checked Exceptions类树下面。 java编译器如何知道会出现exception,而且IllegalArgumentException
也没有,因为我的理解可能会 保留在代码中。
此外,确定必须获得Checkedexception并且不是Unchecked意味着什么呢?
java中的exception都以相同的方式工作。
已检查和未检查的exception(它们都是RuntimeException的子类)之间的区别,如果抛出已检查exception的方法的任何一方调用该方法,则必须尝试/捕获exception,或者将自己的方法声明为抛出该exception。
所以,如果我有一个方法:
void throwsACheckedException() throws SomeCheckedException;
无论谁叫它,都必须做两件事之一。 之一:
try { throwsACheckedException(); } catch (SomeCheckedException e) { //do something }
要么
void someCallingMethod() throws SomeCheckedException { //pass it on throwsACheckedException(); }
您不必声明的未经检查的exception,并且调用该方法的任何人都不必显式捕获。 例如:
void someInnocentLookingMethod() { throw new NullPointerException("surprise!"); //...extends RuntimeException }
然后你可以简单地调用它,而不需要try / catch麻烦:
void unsuspectingVictim() { someInnocentLookingMethod(); }
未经检查的exception通常用于任何可能随时出现的事情,因此强制开发人员尝试/捕获它们会使代码非常繁琐(例如NullPointerException),尽管有些东西检查exception完全是邪恶的: – )
已检查的exception要求您向方法签名添加throws
声明,或者在其周围添加try
catch
块。
public void checked() throws IOException { throw new IOException(); // compiles just fine } public void checked() { try { throw new IOException(); } catch (IOException e) { // ... } }
这不起作用:
public void checkedWithoutThrows() { throw new IOException(); // will not compile }
未经检查的exception不需要此操作。
public void unchecked() { throw new RuntimeException(); }
而且,为了完整起见,确定未经检查的exception的方法是未经检查的exception都会在某个时刻从RuntimeException
下降。
对于Checkedexception,您在编译时看到错误,并表示您必须处理它们。 运行时exception不会在代码中处理任何错误或警告。
编译器期望exception(Checked exceptions)并要求您处理它。