黑马程序员技术交流社区
标题:
RumtimeException
[打印本页]
作者:
颜宗茂
时间:
2011-12-28 21:21
标题:
RumtimeException
本帖最后由 颜宗茂 于 2011-12-29 21:01 编辑
RumtimeException能被捕获处理吗??
作者:
李高翔
时间:
2011-12-28 21:50
java中异常分两类,一类是需要处理的(Checked exceptions), 一类是不需要处理的(Unchecked exceptions)。
从逻辑的角度来说,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,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。
再看下面这个例子:
Java代码
1.public void method(){
2. int [] numbers = { 1, 2, 3 };
3. int sum = numbers[0] + numbers[3];
4.}
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)却无法直接捕获问题并报告出来。
作者:
曾运
时间:
2011-12-28 21:51
RumtimeException 可以被捕获处理。
public class RuntimeExceptionDemo
{
public static void main(String[] args)
{
int a[]=new int[2];
try
{
a[2]=2;//发生异常
} catch (ArrayIndexOutOfBoundsException e)
{
a[0]=0;
a[1]=1;
}
System.out.println("over");//进行捕获后,程序会继续往下执行,输出“over”
}
}
复制代码
作者:
颜宗茂
时间:
2011-12-28 22:00
曾运 发表于 2011-12-28 21:51
RumtimeException 可以被捕获处理。
那就是被抓住了, 也是,这个方法挺好。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2