检查和未检查异常在Java中是如何工作的?

检查和未检查异常在Java中是如何工作的?,java,exception,Java,Exception,在阅读本文中的例外情况时,我发现以下陈述: 编译器在编译时检查已检查的异常 及 编译器不会在编译时检查未检查的异常 因此,如果我们也可以说IOException或SQLException在checkedExceptions类树下。java编译器如何知道IllegalArgumentException将出现异常和否,据我所知,该异常可能保留在代码中 另外,强制捕获已检查异常而非未检查异常这一事实到底意味着什么?已检查异常需要向方法签名添加一个抛出声明,或者在其周围添加一个try-catch块 pu

在阅读本文中的例外情况时,我发现以下陈述:

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

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

因此,如果我们也可以说IOException或SQLException在checkedExceptions类树下。java编译器如何知道IllegalArgumentException将出现异常和否,据我所知,该异常可能保留在代码中


另外,强制捕获已检查异常而非未检查异常这一事实到底意味着什么?

已检查异常需要向方法签名添加一个抛出声明,或者在其周围添加一个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派生出来的。

java中的异常都以相同的方式工作。 检查异常和未检查异常之间的区别,这些异常都是if的子类。对于抛出检查异常的方法,调用该方法的人必须尝试/捕获异常,或者声明自己的方法抛出该异常

因此,如果我有一个方法:

void throwsACheckedException() throws SomeCheckedException;
无论谁打电话给它,都必须做以下两件事之一。要么:

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

未经检查的异常不必声明,调用该方法的人也不必显式捕获。例如:

void someInnocentLookingMethod() {
   throw new NullPointerException("surprise!"); //...extends RuntimeException
}
然后,您可以简单地调用它,而无需尝试/捕获麻烦:

void unsuspectingVictim() {
   someInnocentLookingMethod();
}

未经检查的异常通常用于在任何时候都可能爬到您身上的东西,因此强制开发人员尝试/捕获它们会使代码非常乏味,例如NullPointerException,尽管有些人认为已检查的异常完全是邪恶的:-

对于已检查的异常,您在编译时看到错误,并说您必须处理它们。 运行时异常不会在代码中给出任何要处理的错误或警告


编译器期望异常检查异常并要求您处理它。

忘记所有答案,先阅读。非常有用,谢谢。为什么我要忘记答案?你真的是认真的吗?这些答案对于理解高层次的问题很好。JLS为您提供了绝对真理。如果您将异常源包装为throw语句,或者使用匹配的catch子句调用在try块中抛出异常的方法,则不必向方法签名添加throws声明。谢谢@TedHopp。更新答案。
void unsuspectingVictim() {
   someInnocentLookingMethod();
}