作为一名希望完善编程技巧的java程序员,我经常遇到创建运行时异常的情况。我知道如果明智地使用它是一个很好的做法。
就个人而言, NullPointerException 和 IllegalStateException 是我创建的软件中最常用的。你呢?
您经常使用哪些运行时异常?你在什么情况下使用它们?
答案 0 :(得分:66)
我从不抛出 NullPointerException 。对我来说,当出现问题并且需要开发人员查看发生的情况时,它会在代码中自然出现。然后(s)他解决了原因并且不会再发生。
我使用 IllegalStateException 来表示对象配置错误或者调用的顺序不正确。但是,我们都知道,理想情况下,对象应该确保它不会处于错误状态,并且不能以不正确的顺序调用它(构建构建器和生成的对象......)。
当方法检测到其参数不正确时,我使用了很多 IllegalArgumentException 。这是任何公共方法的责任,停止处理(以避免更难以理解的间接错误)。此外,方法开头的一些if
用于文档目的(文档从不偏离代码,因为它是代码:-))。
public void myMethod(String message, Long id) {
if (message == null) {
throw new IllegalArgumentException("myMethod's message can't be null");
// The message doesn't log the argument because we know its value, it is null.
}
if (id == null) {
throw new IllegalArgumentException("myMethod's id can't be null");
// This case is separated from the previous one for two reasons :
// 1. to output a precise message
// 2. to document clearly in the code the requirements
}
if (message.length()<12) {
throw new IllegalArgumentException("myMethod's message is too small, was '" + message + "'");
// here, we need to output the message itself,
// because it is a useful debug information.
}
}
我还使用特定的运行时异常来表示更高级别的异常情况。
例如,如果我的应用程序的某个模块无法启动,那么当另一个模块调用时,我可能会抛出 ModuleNotOperationalException (理想情况下是一个通用代码,如拦截器,或者是特定代码)它。在该架构决策之后,每个模块必须在调用其他模块的操作上处理此异常......
答案 1 :(得分:12)
我一直认为运行时异常应该表示编程错误(例如,null
引用在未预期时传入,数组索引超出范围等),而已检查的异常应表示环境中的异常条件不能被“编码离开”(例如IOException
,SQLException
)。
有一种情况是,有时你需要在RuntimeException中包装应该是一个已检查的异常,以满足接口的定义。作为一个简短的例子,您可能有一些java.util.List
的时髦实现,它管理多台机器之间的分布式列表。显然,这会抛出已检查的异常(可能是IOException
的某些子类),如果自己定义的话,但是使这个类实现List
的好处是客户端几乎可以透明地使用它,只要它们使用另一个列表
这可能导致Joel称之为leaky abstraction,因此重要的是您的文档清楚可以抛出什么异常以及它们的含义!在这种情况下,我发现RuntimeException
的自定义子类通常更清楚地传达根本原因,而不是试图将其变为现有的运行时异常类。
答案 2 :(得分:3)
我经常使用IllegalArgumentException
。大多数情况下,我会尝试在逻辑上尽快返回默认值,但有些时候不是,所以我使用这个。
我使用的另一个是ArrayIndexOutOfBoundsException
。
答案 3 :(得分:3)
UnknownException,非常有用:P
我也喜欢org.apache.commons.lang.NotImplementedException
答案 4 :(得分:2)
大多数情况下,我不会抛出运行时异常。而不是在检查特定条件后抛出用户定义的异常。但我使用的少数是 - IllegalAccessException,ArithmeticException,NumberFormatException和SecurityException。
答案 5 :(得分:2)
根据 Effective Java 中的 Joshua Bloch ,
最常用的例外情况: