`
ku_uga
  • 浏览: 46387 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

为何RuntimeException不需要捕获

阅读更多

  从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。

  checked exception迫使你捕获它并处理这种异常情况。以java.net.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLException。MalformedURLException就是一种checked exception。设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。

  再看下面这个例子:

public void method(){
 int [] numbers = { 1, 2, 3 };
 int sum = numbers[0] + numbers[3];
} 

 
  在运行方法method()时会遇到ArrayIndexOutOfBoundsException(因为数组numbers的成员是从0到2)。对于这个异常,调用方无法处理/纠正。这个方法就是runtime exception的情形。上面我已经提到,runtime exception用来指示一种调用方本身无法处理/恢复的程序错误。而程序错误通常是无法在运行过程中处理的,必须改正程序代码。

  总而言之,在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。因为在程序测试过程中,系统打印出来的调用堆栈路径(StackTrace)往往使你更快找到并修改代码中的错误。有些程序员建议捕获runtime exception并纪录在log中,我反对这样做。这样做的坏处是你必须通过浏览log来找出问题,而用来测试程序的测试系统(比如Unit Test)却无法直接捕获问题并报告出来。

分享到:
评论

相关推荐

    Java经验点滴:处理没有被捕获的异常

    而有些是我们无法捕获的,因为我们不能确定它们会在什么地方出现,例如像NullPointerException,ClassCastException,IndexOutOfBoundsException这些RuntimeException。我们也许可以在所有它们有可能发生的地方去...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,则抛出IllegalMOnitorStateException,它是RuntimeException的一个子类,因此,不需要try-...

    JAVA异常基础入门

    出现RuntimeException就一定是你的问题 ,可以不捕获,因为小心点这些异常是可以避免的。 派生于RuntimeException的异常。是一类特殊的异常,如被 0 除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的...

    Java异常架构详细介绍与说明(值得珍藏)

    通常,Error用于指示合理的应用程序不应该试图捕获的严重问题,而Exception则用于指示合理的应用程序想要捕获的条件。Throwable包含了其线程创建时线程执行堆栈的快照,可以通过printStackTrace()等方法获取堆栈跟踪...

    基础深化和提高-异常机制

    异常通常表示程序可以处理的错误情况,而错误通常表示严重的系统问题,一般不应该捕获和处理。 异常处理: Java提供了try-catch-finally语句块用于捕获和处理异常。在try块中放置可能抛出异常的代码,在catch块中...

    java多线程编程之捕获子线程异常示例

    java多线程程序中所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉。但是无法避免的是unchecked exception,也就是RuntimeException,当抛出异常时子线程...

    Android 捕获运行时异常详解

    CheckException:在编译代码时就需要进行try()catch捕获的。 UnCheckException:所有的运行时异常,RuntimeException类和他的子类,都是在APP运行的过程中的发生的。即:APP在运行的过程中崩溃了,这种异常我们就...

    Java异常处理.md

    受检异常需要在编译时进行处理,而非受检异常则不需要。常见的异常类包括Exception和RuntimeException。 为了处理异常,我们使用try-catch-finally语句块。在try块中编写可能抛出异常的代码,然后使用一个或多个...

    Android开发使用UncaughtExceptionHandler捕获全局异常

    此功能能够将程序在运行中碰到的崩溃(runtimeException)问题反馈到服务器,帮助开发者改善产品,多适配机器。 然而在公司Android开发中不集成这些SDK,那应该怎么实现这样的功能呢?下面让我们来看下如何使用...

    Android中捕获全局异常实现代码

    主要介绍了Android中捕获全局异常实现代码,本文给出了2种方法,以及对应实现代码,需要的朋友可以参考下

    Java精华(免费版)

     在调用这个方法时不需要捕获这个runtime exception;   runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。   * Checked exceptions:   定义方法时必须声明所有可能会...

    【09-异常处理】

    不到捕获异常的catch块,则运行时环境终止,Java程序也将退出。 异常的捕捉流程 Java的异常体系 访问异常信息 •如果程序需要在catch块中访问异常对象的相关信息,可以通过...

    JSTL详细标签库介绍

    首步我们一般在程序中先处理我们完成异常处理的类,完成异常处理的功能,因为可能除数为0是会出现异常,我们查找java.lang包中各个Exception类,发现RuntimeException类集合中的ArithmeticException可以处理运算异常...

    基于Struts的异常处理

    通过定义继承RuntimeException的异常类及继承ExceptionHandler的异常处理类,手动从dao层捕获异常。非常实用!

    浅谈RxJava处理业务异常的几种方式

    RuntimeException类及其子类都被称为运行时异常,这种异常的特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try…catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。...

    java,c/c++,php,c#安全编码规范

    2.5.3 不允许抛出RuntimeException, Exception,Throwable 22 2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止...

    【Java】自定义异常和异常中的方法覆盖注意事项

    自定义异常1.1 定义方式1.2 自定义异常的抛出1.3 自定义异常的捕获2. 异常中的方法覆盖 1. 自定义异常 1.1 定义方式 ① 必须继承自Exception或Exception的子类,常用RuntimeException ② 必须提供无参构造方法; ③...

    test exception

    测试 android exception 在android中 try catch 的作用 : 只可以捕获checkException。如果是Error或者是 RuntimeException, 即使catch住了,则程序仍然会崩溃。

    phpstan-strict-rules:TheCodingMachine遵循的基于最佳实践的一组PHPStan附加规则

    如果捕获Throwable , Exception或RuntimeException ,则必须重新抛出该异常。 超全局相关规则 禁止使用$_GET , $_POST , $_FILES , $_COOKIE , $_SESSION和$_REQUEST 。 相反,您应该使用框架的请求/会话对象。...

    JAVA基础知识精华总结 收藏

    JAVA基础知识精华总结 收藏 1、 对象的初始化 ...JAVA中除了RunTimeException 类,其他异常均须捕获或抛出。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cppinside/archive/2004/06/28/28246.aspx

Global site tag (gtag.js) - Google Analytics