package 异常处理;
public class 异常处理 {
static void demoproc() {
try {
throw new NullPointerException("demo");
}catch(NullPointerException e){
System.out.println("caught inside demopric.");
throw e;为什么在这里的throw不用有throws语句就可以把异常向上抛。
}
}
public static void main(String args[])
{
try {
demoproc();
}catch(NullPointerException e)
{
System.out.println("2"+e);
}
}
}
因为NullPointException是RuntimeException,即运行时异常,归类为非checked异常,即不强制要求调用者catch。
RuntimeException,一般认为是和运行时环境有关,无法避免的,强制要求捕获并处理。
Exception,checked Exception,一般认为是由于编码不规范导致的,不需要强制捕获,完全可以通过代码规避掉。
可以参考下我这篇文章的简单介绍:
https://www.cnblogs.com/ofyou/p/Java-Error-and-Exception.html
为什么有的Exception要catch,有的不需要呢?
我们的原则是,如果能在编码过程中避免的异常,那么就不应该catch,如NullPoint,IndexOutOfBounds,ClassCast等待,如果出错了那么就是我们的代码写的有问题,即使捕获了也无法让程序正常运行。
比如用户增加一个资源,某个字段缺失导致空指针异常,我们捕获了告诉用户异常,用户会把我们赶出去,因为这个字段本来就不是要求非空的,只是我们没去判断而已 😃
什么样的异常我们需要捕获或者显式通过throw声明要求调用者捕获呢?那就是通过代码无法控制,跟运行时的环境有关的异常,譬如IO异常,我们读取磁盘、网络请求等可能会因为文件损坏、丢失、网络异常等原因导致出错,那么这种情况我们就要捕获异常了。等环境恢复后,我们还是可以继续IO操作的。