在Java中最常用的运行时exception是什么?
作为一个希望完善他的编程技能的java程序员,我经常遇到我必须创build运行时exception的情况。 我知道如果明智地使用这是一个很好的做法。
就个人而言, NullPointerException和IllegalStateException是我创build的软件中最常用的。 你呢?
你经常使用哪些运行时exception? 你在什么情况下使用它们?
我从不抛出NullPointerException 。 对于我来说,当出现问题时,它是自然出现在代码中的,并且需要开发人员来看看会发生什么。 然后,他修复了原因,不再发生。
我使用IllegalStateException来指示对象configuration不正确或调用顺序不正确。 然而,我们都知道,理想情况下,一个对象应该确保它不能处于不良状态,并且不能以不正确的顺序来调用它(使构build器和结果对象…)。
当一个方法检测到它的参数不正确时,我使用了很多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. } }
我也使用特定的运行时exception来表示更高级别的exception情况。
例如,如果我的应用程序的一个模块无法启动,那么当另一个模块调用它时,我可能会抛出一个ModuleNotOperationalExceptionexception(理想情况下是由一个像拦截器一样的通用代码,否则由特定的代码引发)。 在这个架构决定之后,每个模块都必须处理调用其他模块的操作的这个exception。
我一直认为运行时exception应该表示编程错误(例如,当不期望的时候传入null
引用,数组索引越界等等),而检查exception应该代表环境中不能被“编码”的例外情况(例如, IOException
, SQLException
)。
违反这个规则的是,有时你需要在RuntimeException中包装应该被检查的exception,以满足接口的定义。 作为一个简单的例子,您可能会有一些时髦的java.util.List
实现来pipe理多台机器之间的分布式列表。 很显然,如果自己定义了这个exception(可能是IOException
一些子类),但是使这个类实现List
的好处是,客户端可以在任何地方使用另一个列表,几乎可以透明地使用它。
但是,这可能会导致Joel所谓的漏洞抽象 ,所以重要的是,您的文档清楚地说明可以抛出什么exception以及它们是什么意思! 在这种情况下,我发现RuntimeException
一个自定义子类通常在传达根本原因时变得更加清晰,而不是试图将其用于现有的运行时exception类。
我经常使用IllegalArgumentException
。 大多数情况下,我会尝试一旦合乎逻辑地返回默认值,但是有些时候不合适,所以我使用这个。
另一个我使用的是ArrayIndexOutOfBoundsException
。
UnknownException,非常有用:P
我也喜欢org.apache.commons.lang.NotImplementedException
大多数情况下,我不会抛出运行时exception。 而不是在检查特定条件后抛出用户定义的exception。 但是,我使用的几个是 – IllegalAccessException,ArithmeticException,NumberFormatException和SecurityException。