Exception 是另外一个非常重要的异常子类 。程序本身可以捕获并且可以处理的异常 。这类异常一旦出现,我们就要对代码进行更正,修复程序 。Exception这种异常又分为两类:运行时异常和编译时异常 。
2.3.1 运行时异常定义:RuntimeException 类及其子类异常,如NullPointerException (空指针异常)、IndexOutOfBoundsException (下标越界异常)等,表示 JVM在运行期间可能出现的异常 。特点:此类异常,Java 编译器不会检查它,属于不受检异常 。一般是由程序逻辑错误引起的,此类程序应该从逻辑角度尽可能避免这类异常的发生 。而当程序中可能出现这类异常,即使没有用try-catch 语句捕获它,也没有用throws 子句声明抛出它,也会编译通过 。在程序中可以选择捕获处理,也可以不处理 。如果产生运行时异常,则需要通过修改代码来进行避免 。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!注意:RuntimeException 异常会由JVM自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题,应该从逻辑上去解决并改进代码 。这里我们来看下运行时异常是怎样的,这里我想说下,出现异常,不要紧张,把异常的简单类名,拷贝到API中去查 。然后看是什么异常 。可以看出,我们的程序逻辑出现错误,所以出现了算术异常 。我们只要修改int b = 10就行了,或者b不等于0都可以 。所以遇到异常,我们不用担心 。可以先从查看异常类名开始,看是什么异常,看是什么原因,找到我们程序出错的地方并进行修改就可以正常运行了 。那我们什么都没有处理,那出现异常时,是谁处理了这个异常呢?是JVM的默认处理:把异常的名称,原因,位置等信息输出在控制台,但是呢程序就不能继续执行了 。2.3.2 非运行时异常(编译时异常)定义:Exception中除 RuntimeException 及其子类之外的异常 。特点:此类异常,Java 编译器会检查它 。如果程序中出现此类异常,从程序语法角度讲是必须进行处理的异常 。例如:ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws 进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译 。注意:在程序中,通常我们不会自定义该类异常,而是直接使用系统提供的异常类 。该异常我们必须手动在代码里添加捕获语句来处理该异常 。通过注释可以看到,createNewFile() 方法是处理了IOException异常的,而IOException异常又继承来自Exception,是非运行时异常,所以必须处理异常 。所以我们如果是编译时异常,在编译时期就报错了,必须处理这个异常,不然程序不能编译通过 。2.4 受检异常与非受检异常 通常,Java的异常(Throwable)分为受检异常(checked exceptions)和非受检异常(unchecked exceptions) 。
推荐阅读