java Exception

首先来熟悉一下java的异常体系: 

Throwable 类是 Java 语言中所有错误或异常的超类(这就是一切皆可抛的东西)。它有两个子类:Error和Exception。

 Error:用于指示合理的应用程序不应该试图捕获的严重问题。这种情况是很大的问题,大到你不能处理了,所以听之任之就行了,你不用管它。比如说VirtualMachineError:当 Java 虚拟机崩溃或用尽了它继续操作所需的资源时,抛出该错误。好吧,就算这个异常的存在了,那么应该何时,如何处理它呢??交给JVM吧,没有比它更专业的了。

Exception:它指出了合理的应用程序想要捕获的条件。Exception又分为两类:一种是CheckedException,一种是UncheckedException。这两种Exception的区别主要是CheckedException需要用try...catch...显示的捕获,而UncheckedException不需要捕获。通常UncheckedException又叫做RuntimeException。《effective java》指出:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。

我们常见的RuntimeExcepiton有BufferUnderflowException、IllegalArgumentException、IllegalStateException、NullPointerException、ArithmeticException、IndexOutOfBoundsException、ClassCastException(当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。)等等。对于那些CheckedException就不胜枚举了,我们在编写程序过程中try...catch...捕捉的异常都是CheckedException。io包中的IOException及其子类,这些都是CheckedException。

--------------------------------------------------

Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception。

   Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

Exception:表示可恢复的例外,这是可捕捉到的。

Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

    但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

    出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

    如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。

异常处理的目标之一就是为了把程序从异常中恢复出来。

public class TT {

    public static void main(String[] args) {
        try{
            test(5, 0);
        } catch(Exception e) {
            System.out.println("error");
        }

    }
    
    public static void test(int i, int j) throws Exception {
        i = i/j;
    }
}

Throws Exception表示方法体可能抛出异常,需要上层来处理,上层调用时必须是try{}catch{}否则会报错

public class TT {

    public static void main(String[] args) {
        try {
            test(5, 0);
        } catch (Exception e) {
            System.out.println("error");
        }

    }

    public static void test(int i, int j) throws Exception {
        if (j == 0) {
            throw new Exception();
        }
        
        i = i / j;  
    }
}

如果使用throw关键词来抛出异常那么绿色部分的代码必不可少

 

    public static void main(String t[]) {

        System.out.println(test());
    }
    
    public static int test(){
        int x = 1;
        
        try {            
            return x;
        } finally {
            ++x;
        }        
    }

结果为1

返回结果是已经放在某个位置了(网上俗称罐子,就是栈里面), 再改变x也不会影响到这个结果

     public static void  main(String args[]){
            smallT t  = new  smallT();
            int  b  =  t.get();
            System.out.println(b);
      }
     
      public int  get() {
            try {
                  return 1 ;
            } finally {
                  return 2 ;
            }
      }

结果为2

posted @ 2015-02-23 20:51  牧 天  阅读(228)  评论(0)    收藏  举报