现在的位置: 首页 > 综合 > 正文

Java中的Exception和RuntimeException的区别

2012年09月10日 ⁄ 综合 ⁄ 共 1533字 ⁄ 字号 评论关闭

在java的异常类体系中,Error和RuntimeException是非检查型异常(unchecked exception),其他的都是检查型异常(unchecked exception)。
非检查型异常,就是在程序中,可以不用try..catch..进行处理,而检查型异常,则必须用try..catch进行处理,或者在方法定义中,用throws继续传递。
所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类,但不可以在不声明的情况下抛出非RuntimeException。

非RuntimeException要自己写catch块进行处理。

看一段代码

public class MyDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str="123";
        int temp=Integer.parseInt(str);
        System.out.println(temp*temp);
    }
}

再看看parseInt方法的源代码如下:

 

   public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
   }

我们发现这个方法中抛出了NumberFormatException异常,但是在上面的代码中我们没有找到try...catch来处理,这是为什么呢。按照我们异常处理的知识,如果一个方法通过throws抛出了异常,那么可以在抛出异常的方法中不使用try...catch,但是在调用这个方法的地方必须有try...catch来处理(或者通过throws继续向后抛出)。

这个原因就是NumberFormatException是一个unchecked exception,是一个非检查型异常,是一个不需要处理的异常。虽然我们也可以通过try...catch对可能抛出的异常进行捕获,但这不是必须的。

这一点,可以通过类的继承关系看到

从上图我们可以发现NumberFormatException是RuntimeException的子类,那么这就需要我们清楚Exception和RuntimeException的概念:

1. Exception:在程序中必须使用try...catch进行处理。

2. RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。

对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。

下面列举一下常见的RuntimeException:

1、NullPointerException:空指针

2、NumberFormatException:数字格式错误,继承自IllegalArgumentException,字符串转换为数字时出现。

3、ArrayIndexOutOfBoundsException:数组越界

4、StringIndexOutOfBoundsException:字符串越界

5、ClassCastException:类型转换错误。

6、UnsupportedOperationException:该操作不被支持。

7、ArithmeticException:算术错误。

8、IllegalArgumentException:非法参数。

 

抱歉!评论已关闭.