java异常——RuntimeException和User Define Exception

1.RuntimeException

今天摩根IT电面的时候被问到Exception和RuntimeException的区别,当时答不出来,大囧,晚上来学习一下。

首先看一段代码,主要内容就是将字符串类型的数字转化为整型的数字,然后让两个数字相乘,代码如下:

View Code
public class RuntimeException {

    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方法的源代码如下:

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

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

下面来观察NumberFormatException类的继承关系:

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

  1. Exception:在程序中必须使用try...catch进行处理。
  2. RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。

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

 

2.User Defined Exception

下面给出一个自定义异常的实例:

View Code
class MyException extends Exception{
    public MyException(String msg){
        super(msg);
    }
}

public class DefaultException {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
            throw new MyException("自定义异常");
        }catch(Exception e){
            System.out.println(e);//edu.sjtu.ist.comutil.MyException: 自定义异常
            //System.err.println(e);
//            e.printStackTrace();
//            StackTraceElement[] sts = e.getStackTrace();
//            for (StackTraceElement st : sts){
//                System.err.println(st);
//            }

        //    System.err.println(e.getStackTrace());
        }

    }

}

输出结果为:

MyException: 自定义异常

posted @ 2012-04-24 21:12 xwdreamer 阅读(...) 评论(...) 编辑 收藏