Java 中 RuntimeException 和 Exception 的区别

在 java 的异常类体系中, Error 和 RuntimeException 是非检查型异常,其他的都是检查型异常。

所有方法都可以在不声明 throws 的情况下抛出 RuntimeException 及其子类
不可以在不声明的情况下抛出非 RuntimeException
简单的说,非 RuntimeException 要自己写 catch 块处理掉。

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

1567957005311

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

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 的概念:

Exception:在程序中必须使用 try...catch 进行处理。
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: 自定义异常

常见的 RuntimeException- -
RuntimeException 是开发中最容易遇到的,下面列举一下常见的 RuntimeException:

1、NullPointerException:见的最多了,其实很简单,一般都是在 null 对象上调用方法了。
String s=null;
boolean eq=s.equals(""); // NullPointerException
这里你看的非常明白了,为什么一到程序中就晕呢?
public int getNumber(String str){
  if(str.equals("A")) return 1;
   else if(str.equals("B")) return 2;
}
这个方法就有可能抛出 NullPointerException, 我建议你主动抛出异常,因为代码一多,你可能又晕了。
public int getNumber(String str){
  if(str==null) throw new NullPointerException("参数不能为空");
// 你是否觉得明白多了
  if(str.equals("A")) return 1;
   else if(str.equals("B")) return 2;
}

2、NumberFormatException:继承 IllegalArgumentException,字符串转换为数字时出现。比如 int i= Integer.parseInt("ab3");

3、ArrayIndexOutOfBoundsException: 数组越界。比如 int[] a=new int[3]; int b=a[3];

4、StringIndexOutOfBoundsException:字符串越界。比如 String s="hello"; char c=s.chatAt(6);

5、ClassCastException: 类型转换错误。比如 Object obj=new Object(); String s=(String)obj;

6、UnsupportedOperationException: 该操作不被支持。如果我们希望不支持这个方法,可以抛出这个异常。既然不支持还要这个干吗?有可能子类中不想支持父类中有的方法,可以直接抛出这个异常。

7、ArithmeticException:算术错误,典型的就是 0 作为除数的时候。

8、IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常,我们可以在自己的程序中好好利用这个异常。

posted @ 2020-02-21 14:42  别再闹了  阅读(342)  评论(0)    收藏  举报