约书亚·布洛赫(Joshua Bloch)在他的《有效Java》中写道:
“使用Javadoc @throws标记来记录方法可以抛出的每个未经检查的异常,但是请不要使用throws关键字在方法声明中包括未经检查的异常。”
听起来确实很合理,但是如何找出我的方法会抛出哪些未经检查的异常?
让我们考虑以下课程:
public class FooClass {
private MyClass[] myClass;
/**
* Creates new FooClass
*/
public FooClass() {
// code omitted
// do something with myClass
}
/**
* Performs foo operation.<br />
* Whatever is calculated.
* @param index Index of a desired element
* @throws HorribleException When something horrible happens during computation
*/
public void foo(int index) {
try {
myClass[index].doComputation();
} catch (MyComputationException e) {
System.out.println("Something horrible happened during computation");
throw new HorribleException(e);
}
}
}
现在,我记录了HorribleException,但是很明显,foo方法也可以抛出未经检查的
java.lang.ArrayIndexOutOfBoundsException
。代码变得越复杂,就很难考虑该方法可能引发的所有未经检查的异常。我的IDE并没有太大帮助,也没有任何工具。由于我不知道任何工具…
您如何处理这种情况?
仅记录那些您明确抛出自己或正在通过其他方法传递的内容。剩余部分应视为错误,应通过良好的单元测试和编写可靠的代码来修复。
在这种特殊情况下,我ArrayIndexOutOfBoundsException
认为 您的代码中 有错误 ,
并且我会相应地修复该代码,使其永远不会抛出该错误。即添加检查数组索引是否在范围内,并通过引发异常(由您记录)或采用替代路径来进行相应处理。
问题内容: 我有两个连接在一起的表。 A有很多B 通常,您会这样做: 从a中获得所有记录的记录,这些记录中包含b的记录。 我如何只获取b中没有任何内容的a中的记录? 问题答案: 或像该线程上的其他一些人所说的那样:
问题内容: 阅读本书中的 Exception时,我发现了以下语句: 被检查的异常由编译器在编译时检查。 和 编译器不会在编译时检查未经检查的异常。 因此,如果我们也可以说或 位于Checked Exceptions类树之下。如何将java编译器知道 会有 一个例外,没有对 其中 可能 仍然 代码为我的理解里面。 另外,强制捕获Checked异常而不是Unchecked意味着什么呢? 问题答案: J
我用的是spring-boot和JPA。我试图捕捉未检查的异常,如(违反约束)引发的事务。即使我添加了catch块,它也会在超出事务边界时抛出。 我谷歌了一下,发现可以通过事务回调来实现。我尝试了下面的代码:仍然是给出错误 请帮帮我!!
因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产
问题内容: 我一直在阅读有关未解决问题和已解决问题的信息,没有一个在线资源真正了解它们之间的区别以及何时使用两者。 据我了解,它们都在运行时抛出,它们都表示超出逻辑预期范围的程序状态,但是必须显式捕获已检查的异常,而未检查的异常则不能。 我的问题是,假设出于参数考虑,我有一个将两个数字相除的方法 以及需要在某处划分的方法 谁负责检查分母为零的情况,应该检查还是取消检查异常(忽略Java的内置div
我有以下两个示例,我不清楚java.lang.Exception是如何处理的:作为检查的或未检查的异常。 以下方法编译成功: 在这里,我认为java.lang.Exception是威胁java.lang.RuntimeException或java.lang.Error。不处理也可以声明扔。 如果我们没有使用异常,而是使用了检查异常(它是java.lang.Exception的子类),那么您必须在方