JAVA异常详解,RuntimeExecption,Exception

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)来捕获它们。