之前不小心弄出来一个空指针异常(NullPointException),然后程序直接崩溃了。简单学习了下RuntimeException和Exception的区别。
1、检查型异常(CheckedException):这类异常都是Exception的子类。异常的向上抛出机制进行处理,加入子类可能产生A异常,那么父类中也必须throwsA异常,可能导致的问题:代码效率低,耦合度过高。
2、非检查型异常(UncheckedException):这类异常都是RuntimeException的子类,不能通过clientcode来试图解决。
在Java的异常中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。另外,所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类。
举个例子,下面的main方法里面没显式声明throws任何Exception,但是却可以抛出NullPointException,也就是RuntimeException。另外在mayThrowsException()中显式地抛出了Exception。当processException()调用该方法时,必须使用try...catch...进行处理。否则编译出错。
从这也能看出Java中Exception和RuntimeException的概念:
Exception:在程序中必须使用try...catch...进行处理。
RuntimeException:可以不使用try...catch...进行处理,但是若有异常产生,则异常将由JVM进行处理。
显而易见,所有的非RuntimeException都需要我们来处理。 当然,对于RuntimeException我们最好也用try...catch...处理。否则一旦异常发生,会导致程序中断。
先看下类继承图,显而易见NullPointException是RuntimeException子类。
1、检查型异常(CheckedException):这类异常都是Exception的子类。异常的向上抛出机制进行处理,加入子类可能产生A异常,那么父类中也必须throwsA异常,可能导致的问题:代码效率低,耦合度过高。
2、非检查型异常(UncheckedException):这类异常都是RuntimeException的子类,不能通过clientcode来试图解决。
在Java的异常中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。另外,所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类。
举个例子,下面的main方法里面没显式声明throws任何Exception,但是却可以抛出NullPointException,也就是RuntimeException。另外在mayThrowsException()中显式地抛出了Exception。当processException()调用该方法时,必须使用try...catch...进行处理。否则编译出错。
package my;
public class TestException {
private String desc;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static void main(String[] args) {
TestException e = null;
System.out.println(e.getDesc());
}
private void processException() {
try {
mayThrowsException();
} catch (Exception e) {
e.printStackTrace();
}
}
private void mayThrowsException () throws Exception {
throw new Exception("My Exception");
}
}
从这也能看出Java中Exception和RuntimeException的概念:
Exception:在程序中必须使用try...catch...进行处理。
RuntimeException:可以不使用try...catch...进行处理,但是若有异常产生,则异常将由JVM进行处理。
显而易见,所有的非RuntimeException都需要我们来处理。 当然,对于RuntimeException我们最好也用try...catch...处理。否则一旦异常发生,会导致程序中断。