java中的异常

--解释ErrorException的区别?

     Error:指的是JVM错误,这个时候的程序并没有执行,无法处理;

     Exception:指的是程序之中出现的错误信息,可以进行异常处理,主要关心Exception。

--请解释java之中的异常处理流程  

    1.如果程序之之中产生了异常,那么会自动的由jvm根据异常的类型,实例化一个指定异常类的对象

    2.如果这个时候没有异常处理操作,这个对象交给jvm进行默认处理方式,而后中断程序

    3.如果有异常处理,由try语句捕获产生的异常类对象

    4.与try之后的每一个catch进行匹配,如果匹配成功,使用 指定catch进行处理,没有任何catch匹配成功交给jvm默认处理

    5.不管是否有异常都会执行finally程序,如果没有异常,执行完finally,继续执行下面程序

如果此时有异常没有更够处理(没有catch匹配)那么也会执行finally,但是执行完finally后,将默认交给jvm进行异常的信息输出,并且中断程序。

--Exception的使用

    对象多态性来讲,所有的异常类都是Exception的子类,那么这个时候,实际上所有的异常都可以使用Exception进行接收。那么这个时候就应该可以感受到异常处理所带来的好处了。但是这种操作也存在一种问题。如果在一些异常处理要求严格的项目之中,异常必须分别处理,如果现在异常的处理要求不是很严格,直接编写Exception就足够

--throws关键字


    throws关键字主要在方法定义()上使用,表示此方法不进行异常处理,而交给被调用处处理

    a() throws Exception{} 方法定义上使用

    // 下面调用处处理

    try{

      a();

    }catch(Exception e){

      e.printStackTrace();

    }

    调用有throws声明的方法的时候,一定要使用异常处理,这是强制性的,也可以继续主方法抛出异常(main方法上throws),由jvm进行处理

--throw关键字

    之前的所有异常类都是由jvm自动进行实例化操作的,用户可以自己手工抛出一个实例化对象,就通过throw完成了

    try{

      throw new Exception("抛出异常");

    }catch(Exception e){

      e.printStackTrace();

    }

--异常处理的标准格式

     try…catchfinallythrowsthrow

    

class MyMath {

         // 出现异常要交给被调用处出,使用throws

         public int div(int x,int y) throws Exception {

                   System.out.println("===== 计算开始 =====") ;       // 资源打开

                   int result = 0 ;

                   try {

                            result = x / y ;     // 除法计算

                   } catch (Exception e) {

                            throw e ;   // 向上抛

                   } finally {

                            System.out.println("===== 计算结束 =====") ;       // 资源关闭

                   }

                   return result ;

         }

}

public class TestDemo {

 

         public static void main(String args[]){

                   try {

                            System.out.println(new MyMath().div(10,0)) ;

                   } catch (Exception e) {

                            e.printStackTrace() ;

                   }

         }

}

--RuntimeException

    public static int parseInt(String s) throws NumberFormatException

    这是parseInt方法抛出的异常,而我们在用这个方法的时候并没有处理这个异常 为什么呢?

    看一下NumberFormatException的继承树

    java.lang.Object

           |- java.lang.Throwable

                     |- java.lang.Exception

                              |- java.lang.RuntimeException

                                       |- java.lang.IllegalArgumentException

                                                 |- java.lang.NumberFormatException

    发现NumberFormatException属于RuntimeException的子类,java中规定了对于RuntimeException异常类型,可以选择性处理,如果没有处理则交给jvm进行默认处理 。

    请解释一下RuntimeExceptionException的区别?请列举出几个常见的RuntimeException:

· RuntimeException是Exception的子类;

· Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性的进行处理;

· 常见的RuntimeException:NumberFormatException、ClassCastException、NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException。

--断言:assert

    断言指的是程序执行到某行之后,其结果一定是预期的结果,而在JDK 1.4之后增加了一个assert关键字。

范例:使用断言

public class TestDemo {

         public static void main(String args[]){

                   int x = 10 ;

                   // 假设经过了若干操作

                   assert x == 30 : "x的内容不是30" ;

                   System.out.println(x) ;

         }

}

         默认情况下,Java之中的断言,不会在正常执行的代码中出现,如果要想启用断言,则应该增加一些选项:

java -ea TestDemo

         不过断言在开发之中几乎是不使用的技术,知道这个关键字就完了。

--自定义异常类

    在Java之中本身已经提供了大量的异常类型,但是在开发之中,这些异常类型根本就不能满足于开发的需要。所以在一些系统架构之中往往会提供一些新的异常类型,来表示一些特殊的错误,而这种操作就称为自定义异常类,而要想实现这种自定义异常类,那么可以让一个类继承Exception或RuntimeException。

范例:自定义异常类

class MyException extends Exception {   // 自定义异常类

         public MyException(String msg) {

                   super(msg) ;

         }

}

public class TestDemo {

         public static void main(String args[]) throws Exception {

                   throw new MyException("自己的异常类") ;

         }

}

         如果以后见到了一些特殊的没见过的异常类,基本上都表示自定义的。

 

 

posted on 2013-08-24 19:30  iyon  阅读(454)  评论(0编辑  收藏  举报

导航