Java中的异常体系是怎样的
1 Java中的所有异常都来自顶级父类Throwable。
2 Throwable下有两个子类Exception和Error。
3 Error表示非常严重的错误,比如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError,通常这些错误出现时,仅仅想靠程序自己是解决不了的,可能是虚拟机、磁盘、操作系统层面出现的问题了,所以通常也不建议在代码中去捕获这些Error,因为捕获的意义不大,因为程序可能已经根本运行不了了。
4 Exception表示异常,表示程序出现Exception时,是可以靠程序自己来解决的,比如NullPointerException、llegalAccessException等,我们可以捕获这些异常来做特殊处理。
5 Exception的子类通常又可以分为RuntimeException和非RuntimeException两类
6 RunTimeException表示运行期异常,表示这个异常是在代码运行过程中抛出的,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生,比如NullPointerException、IndexOutOfBoundsException等。
7 非RuntimeException表示非运行期异常,也就是我们常说的检查异常,是必须进行处理的异常,如果不处理,程序就不能检查异常通过。如IOException、SQLException等以及用户自定义的Exception异常。
在Java的异常处理机制中,什么时候应该抛出异常,什么时候捕获异常?
1 异常相当于一种提示,如果我们抛出异常,就相当于告诉上层方法,我抛了一个异常,我处理不了这个异常,交给你来处理,而对于上层方法来说,它也需要决定自己能不能处理这个异常,是否也需要交给它的上层。
2 所以我们在写一个方法时,我们需要考虑的就是,本方法能否合理的处理该异常,如果处理不了就继续向上抛出异常,包括本方法中在调用另外一个方法时,发现出现了异常,如果这个异常应该由自己来处理,那就捕获该异常并进行处理。
为什么要使用自定义异常?
在平常处理业务逻辑时,已知的异常类已经不满足不了我们的需求,我们就可以自定义异常。
怎么自定义:
所有异常都必须是Throwable 的子类。 如果希望写一个检查性异常类,则需要继承Exception类。 如果我们想写一个运行时异常类,那么需要继承 RuntimeException类。
另外注意:
子类继承父类抛出的异常不能比父类范围更广。
Throwable中的成员方法:
public String getMessage():返回此 throwable 的详细消息字符串。
public String toString():获取异常类名和异常信息。
public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
catch不能独立存在 ,必须依赖于try;catch可以有多个;finally在最后面可写可不写,如果写了finally方法块一定会执行。 总结: try 必须存在,后可接finally,catch,或者三个都有