2009-10-01 73 views
42

作为一名希望完善他的编程技能的java程序员,我经常遇到必须创建运行时异常的情况。我知道如果明智地使用这是一个很好的做法。java中最常用的运行时异常是什么?

个人,NullPointerException异常IllegalStateException异常是在我创建了软件最常用的。你呢?

你经常使用哪些运行时异常?你在什么情况下使用它们?

回答

66

我从不抛弃空指针异常。对我而言,当出现问题时,它是自然出现在代码中的,并且需要开发人员看看会发生什么。然后(他)修复了原因,并且不再发生。

我使用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

大点的男人! – 2009-10-01 09:45:00

+8

伟大的名单;我会添加UnsupportedOperationException,我一直在使用集合接口的特定实现。 – Carl 2009-10-01 11:30:24

+0

很棒的回答。我将来会更加关注IllegalStateException! – reef 2009-10-01 12:09:19

3

我使用IllegalArgumentException相对经常。大多数情况下,我会尽量在逻辑上尽快返回默认值,但有些时候不是这样,所以我使用这个。

我使用的另一个是ArrayIndexOutOfBoundsException

11

我一直认为,运行时异常应该代表编程错误(例如null参考在出乎意料的时候过去了,数组索引出界,等等),而检查的异常应该代表了环境,不能“编码得天独厚的条件离开“(例如IOException,SQLException)。

违反此规则的是,有时您需要在RuntimeException中包装应该检查的异常,以满足接口的定义。作为一个简单的例子,您可能会有一些时髦的实现java.util.List来管理多台机器之间的分布式列表。很显然,如果定义它自己,这将抛出检查异常(可能是IOException的某个子类),但是使这个类实现List的好处是客户端可以在任何他们使用另一个列表的地方以几乎透明的方式使用它。

虽然这可能会导致Joel所说的leaky abstraction,所以重要的是您的文档清楚说明可以抛出什么异常以及它们是什么意思!在这种情况下,我发现RuntimeException的自定义子类在传达根本原因时通常会更清楚,而不是试图将其用于现有的运行时异常类。

+0

您符合Java的原始思想,涉及CheckedExceptions。实际上,这被称为Java的唯一原始特征(所有其他语言都来自成功的其他语言)。但是这个问题引发了很多争论,我认为目前的趋势是将这种区分视为Java中的一个错误。确切的问题将在这里脱离主题,你可以谷歌他们... – KLE 2009-10-01 09:50:13

2

UnknownException,非常有用的:P

我也很喜欢org.apache.commons.lang.NotImplementedException

+13

我使用抛出新的UnsupportedOperationException(“尚未实现”);'我的应用程序的部分尚未实现。 – Jesper 2009-10-01 12:51:15

2

主要是我不扔运行时异常。而不是在检查特定条件后抛出用户定义的异常。但是我使用的几个是--IllegalAccessException,ArithmeticException,NumberFormatException和SecurityException - 。

0

根据约书亚布洛赫有效的Java

最常用重用例外:

  1. 抛出:IllegalArgumentException
  2. IllegalStateException异常
  3. NullPointerException异常
  4. IndexOutOfBoundsException异常
  5. ConcurrentModificationException的
  6. UnsupportedOperationException异常