1)关于运行时异常(RuntimeExecption):运行时异常是一个超类,当java虚拟机正常时一定抛出;运行时异常可以不用捕捉;空异常是一种运行时异常。
2)一个合理的应用程序不应该(没必要)捕捉运行时也常。
3)在java程序运行时,常会出现一些非正常现象,根据其性质可以分为错误和异常。java程序中,所有的抛出(throw)的异常都必须从Throwable派生而来。
4)类Throwabel有两个直接的子类:Error和Exception。
5)常见的错误,如死循环、内存泄漏等,这种情况下,程序运行时本身无法解决,只能通过其他程序干预。java对应的类位Error类。Error类对象由java虚拟机生成并抛弃(java程序通常不对这类异常进行处理)。
6)以下情况可以引发异常,如下标越界、内存溢出、除数为零等,这种情况下,程序本身可以解决,由异常代码调整程序运行方向,时程序仍可以继续运行,直到正常结束。
7)异常对应的类为Exception类。它有各种子类分别对应不同类型的异常。
8)java编译器要求程序必须捕获或者声明所有的非运行时异常,但对异常可以不做处理。
9)其中RuntimeException代表运行时由java虚拟机生成的异常,原因时编译错误。其他则为非运行时异常,原因是程序碰到了意外情况,如输入异常IOException等。
10)throw关键字用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。如果所有的方法都层层上抛获取的异常,最中JVM会进行处理,处理的方式为:打印异常信息和堆栈信息。如果抛出的异常时Eroor或RuntimeException,则该方法的调用者可选择处理该异常。
11)
1 public class ExcepionDemo02 { 2 3 public static void main(String[] args) { 4 System.out.println(",,,,,,计算开始。。。"); 5 int i = 10; 6 int j = 0; 7 try{ 8 int temp = i/j; 9 System.out.println("两个数字相除" + temp); 10 System.out.println(",,,,,,,,,。。"); 11 }catch(ArithmeticException e){ 12 System.out.println(",,,出现了异常。。"); 13 } 14 System.out.println(",,,,计算结束。。。"); 15 } 16 }
输出结果为:
,,,,,,计算开始。。。
,,,出现了异常。。
,,,,计算结束。。。
12)改变上边的catch:
1 package exception01; 2 3 public class ExceptionDemo03 { 4 5 public static void main(String[] args) throws Exception { 6 System.out.println(",,,,,,计算开始。。。"); 7 int i = 10; 8 int j = 0; 9 try{ 10 int temp = i/j; 11 System.out.println("两个数字相除" + temp); 12 System.out.println(",,,,,,,,,。。"); 13 }catch(Exception e){ 14 throw e; 15 16 } 17 System.out.println(",,,,计算结束。。。"); 18 } 19 20 }
输出结果为:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception01.ExceptionDemo03.main(ExceptionDemo03.java:10)
,,,,,,计算开始。。。
13)如果去掉try……catch语句
1 package exception01; 2 3 public class ExceptionDemo04 { 4 5 public static void main(String[] args) throws Exception { 6 System.out.println(",,,,,,计算开始。。。"); 7 int i = 10; 8 int j = 0; 9 10 int temp = i/j; 11 System.out.println("两个数字相除" + temp); 12 System.out.println(",,,,,,,,,。。"); 13 14 15 16 System.out.println(",,,,计算结束。。。"); 17 } 18 }
输出结果为:
,,,,,,计算开始。。。
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception01.ExceptionDemo04.main(ExceptionDemo04.java:10)
14)throws关键字用于方法体外部的方法的声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出。
15)catch语句表示会出现的某种异常,而且希望能够处理该异常。所以在catch语句中就应该尽量指定异常类型,也可以实用多个catch,用于分别处理不同的异常。
16)如果一个函数内部,它可能抛出了一种类型的异常,但该函数内部又不想用catch处理这种异常,此时,它就必须(强制性)使用throws关键字来显式地声明该函数可能会向外部抛出一个异常,以便该函数的调用者知晓并能够及时处理这种类型的异常。
17)在JAVVA异常处理中,通常由两类异常,其一,就是通过throw语句,程序员在代码中人为抛出的异常,此种异常称为checked exception;另外一个时系统运行时异常(runtime exception),例如被零除等,对于这类异常,程序员完全可以避免它,只要我们写代码时足够小心。因此,为了彻底解决这种隐患,提高程序的可靠性,(不至于因为编码时考虑不周或者一个小疏忽导致系统运行时崩溃),使用RuntimeException异常就是为了实现这样的功能。
18)RuntimeException也可以被程序员显示地抛出,而且为了程序的可靠性,对一些可能出现“运行时异常”的代码区域,程序员最好能够及时地处理这些意外的异常,即通过catch(RuntimeException)或catch(Exception)来捕获它们。