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

时间:2013-10-17 03:39:14

标签: java exception

阅读本book中的例外情况,我发现了这句话:

  

编译器在编译时检查已检查的异常。

  

编译器在编译时不检查未经检查的异常。

因此,如果我们也可以说IOExceptionSQLException低于Checked Exceptions类树。 java编译器如何知道 是一个例外而不是IllegalArgumentException 可能 保持代码内部作为我的理解。

此外,确保获得Checked异常并且不是针对Unchecked的强制性事实是什么意思?

3 个答案:

答案 0 :(得分:4)

已检查的异常要求您向方法签名添加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
}

未经检查的异常不需要此。

public void unchecked() {
  throw new RuntimeException();
}

而且,为了完整起见,确定未经检查的异常的方法是未经检查的异常都会在某个时刻从RuntimeException下降。

答案 1 :(得分:3)

java中的

异常都以相同的方式工作 已检查和未检查的异常(它们都是RuntimeException的子类)之间的区别如果对于抛出已检查异常的方法,无论何人调用该方法都必须尝试/捕获异常,或者将自己的方法声明为抛出异常异常。

所以,如果我有一个方法:

void throwsACheckedException() throws SomeCheckedException;
无论谁调用它都必须做两件事之一。之一:

try {
   throwsACheckedException();
} catch (SomeCheckedException e) {
   //do something
}

void someCallingMethod() throws SomeCheckedException { //pass it on
   throwsACheckedException();
}

您不必声明的未经检查的异常,并且调用该方法的任何人都不必显式捕获。例如:

void someInnocentLookingMethod() {
   throw new NullPointerException("surprise!"); //...extends RuntimeException
}

然后你可以简单地调用它,而不需要try / catch麻烦:

void unsuspectingVictim() {
   someInnocentLookingMethod();
}

未经检查的异常通常用于任何可能随时出现的事情,因此强制开发人员尝试/捕获它们会使代码非常繁琐(例如NullPointerException),尽管有些事情检查了异常是邪恶完全: - )

答案 2 :(得分:2)

对于Checked异常,您在编译时看到错误,并表示您必须处理它们。 运行时异常不会在代码中处理任何错误或警告。

编译器需要异常(Checked exceptions)并要求您处理它。