java中最常用的运行时异常是什么?

Win*_*hen 45 java runtime exception

作为一名希望完善编程技巧的java程序员,我经常遇到创建运行时异常的情况.我知道如果明智地使用它是一个很好的做法.

就个人而言,NullPointerExceptionIllegalStateException是我创建的软件中最常用的.你呢?

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

KLE*_*KLE 68

我从不抛出NullPointerException.对我来说,当出现问题并且需要开发人员查看发生的情况时,它会在代码中自然出现.然后(s)他修复了原因并且它不再发生.

我使用IllegalStateException来表示对象配置错误或者调用的顺序不正确.但是,我们都知道,理想情况下,对象应该确保它不能处于错误状态,并且不能以不正确的顺序调用它(构建构建器和生成的对象......).

当方法检测到其参数不正确时,我使用了很多IllegalArgumentException.这是任何公共方法的责任,停止处理(以避免更难以理解的间接错误).此外,if方法开头的一些s用于文档目的(文档从不偏离代码,因为它是代码:-)).

     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.
       }
     }
Run Code Online (Sandbox Code Playgroud)

我还使用特定的运行时异常来表示更高级别的异常情况.

例如,如果我的应用程序的某个模块无法启动,我可能会抛出一个ModuleNotOperationalException(理想情况下是一个通用代码,比如一个拦截器,否则是一个特定的代码),当另一个模块调用它时.在该架构决策之后,每个模块必须在调用其他模块的操作上处理此异常...

  • 好的清单; 我添加了UnsupportedOperationException,我一直使用它来收集接口的特定实现. (8认同)

And*_*yle 12

我一直认为运行时异常应该表示编程错误(例如null,当不期望时传入的引用,数组索引超出范围等),而被检查的异常应该表示环境中不能"编码掉"的异常条件(例如IOException,SQLException).

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

这可能会导致Joel称之为漏洞抽象,因此重要的是您的文档清楚可以抛出什么异常以及它们的含义!在这种情况下,我发现一个自定义子类RuntimeException通常更清楚地传达根本原因,而不是试图将其变为现有的运行时异常类.