Checked和Unchecked Exptions如何在Java中运行?

阅读本书中的例外情况,我发现了这样的说法:

编译器在编译时检查已检查的exception。

编译器不会在编译时检查未经检查的exception。

因此,如果我们也可以说IOExceptionSQLException位于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)并要求您处理它。