黑马程序员技术交流社区

标题: 整理的关于异常的相关笔记,大家可以参考一下。。。。。 [打印本页]

作者: outsider1020    时间: 2014-12-28 09:24
标题: 整理的关于异常的相关笔记,大家可以参考一下。。。。。
1、异常:在程序中导致程序中断的指令流。
      注意:异常出现之后,如果没有处理的话,则会让整个程序中断执行
2、(1)所有异常的父类为:Throwable.
(2)Throwable分为两类:
     <1>Error:错误,是JVM内部产生的错误,程序代码无法控制处理
     <2>Exception:异常,一般代码中由逻辑错误、语法错误所导致的程序中断,程序员应该尽量避免产生异常。
          Exception分为两类:
          a、Checked异常即(受检异常):编译期异常,属于Exception的直接或间接子类。只有Java语言提供了Checked异常,其他语言都没有提供Checked异常。Java认               为Checked异常都是可以被处理的异常,所有Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。对于Checked异常的处理方式有如下两种:
          (一)当前方法明确知道如果处理该异常,程序应该使用try……catch块来捕获该异常,然后在对应的catch块中修复该异常。
          (二)当前方法不知道如何处理这种异常,应该在定义方法时声明抛出该异常。
          Checked异常体现了Java的严谨性,它要求程序员必须注意该异常——要么显式声明抛出,要么显式捕获并处理它。
          b、Runtime异常即(非受检异常):运行期异常,属于RuntimeException的直接或间接子类。
3、异常的处理机制
(1)使用try...catch捕获异常
     注:(1)如果执行try块里的业务逻辑代码块时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程被称为抛出(throw)异常, 当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给该catch块处理,这个过程被称为捕获(catch)异常;如果Java运行时环境找不到捕获异常的catch块,则运行时环境终止,Java程序也将退出。
           (2) catch关键字的形式;catch(Exception e),这意味着每个catch块都是专门用于处理该异常类及其子类的异常实例。 当Java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类或其子类的实例,如果是,Java运行时环境将调用该catch块来处理该异常;否则再次拿该异常对象和下一个catch块里异常类进行比较。当程序进入负责异常处理的catch块时,系统生成的异常对象将会传给catch块后的异常形参,从而允许catch块通过该对象来获得异常的详细信息。
         (3) try块后可以有多个catch块,这是为了针对不同的异常类提供不同的异常处理方式。当系统发生不同的意外情况时,系统会生成不同的异常对象,Java运行时就会根据该异常对象所属的异常类来决定使用 哪个catch块来处理该异常。
          public class DivTest {
         public static void main(String [] args ) {
                 try {
                         int a =Integer. parseInt(args [0]);
                         int b =Integer. parseInt(args [1]);
                         int c =a/ b;
                        System .out. println("您输入的两个数相除的结果是:" +c);
                 } catch (NumberFormatException e) {
                        System .out. println("数字格式异常:程序只能接收整数参数" );
                 }catch (IndexOutOfBoundsException e ) {
                        System .out. println("数组越界:运行时程序输入的参数个数不够" );
                 }catch (ArithmeticException e ) {
                        System .out. println("算术异常" );
                 }catch (Exception e ) {
                        System .out. println("未知异常" );
                 }
         }

}
          (4) try块与if语句不一样,try块后的花括号{...}不可以省略,即使try块里只有一行代码,也不可省略这个花括号。同样的,catch块后的花括号{...} 也不可以省略。
        (5)  try块里声明的变量是代码块内的局部变量,它只在try块内有效,在catch块中不能访问该变量。
        (6)在进行异常捕获时,一定要先捕获小异常,再捕获大异常。
        (7)  Java7提供的多异常捕获:在Java7以前,每个catch块只能捕获一种类型的异常;但从Java7开始,一个catch块可以捕获多种类型的异常。使用时注意:
               <1>捕获多种类型异常时,多种异常类型之间用(|)隔开
               <2>捕获多种类型异常时,异常之间要是并列的平级关系,不能出现子父类的情况
               <3>捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。
          public class MultiException {
         public static void main(String [] args ) {
                 try {
                         int a =Integer. parseInt(args [0]);
                         int b =Integer. parseInt(args [1]);
                         int c =a/ b;
                        System .out. println("您输入的两个数相除的结果是:" +c);
                 } catch (NumberFormatException | IndexOutOfBoundsException | ArithmeticException e) {
                        System .out. println("程序发生了数字格式异常、数组越界异常、算术异常之一" );
                         //捕获多种异常时,异常变量默认有final修饰,所有下面代码有错
                         //e=new ArithmeticException("test");
                 }catch (Exception e ) {
                        System .out. println("未知异常" );
                         //捕获一种类型的异常时,异常变量没有final修饰,所以下面代码完全正确
                        e =new RuntimeException( "test");
                 }

         }

}
(8)访问异常信息:如果程序需要在catch块中访问异常对象的相关信息,则可以通过访问catch后的异常形参来获得。当Java运行时决定调用某个catch块来处理该异常信息时,会将异常对象赋给catch块后的异常参数,程序即可通过该参数来获得异常的相关信息。所有的异常对象都包含了如下几个常用的方法。
          <1>getMessage():返回该异常的详细描述字符串。
          <2>printStackTrace();将该异常的跟踪栈信息输出到标准错误输出。
               <3>printStackTrace(PrintStream s);将该异常的跟踪栈信息输出到指定输出流。
          <4>getStackTrace():返回该异常的跟踪栈信息。

作者: Seejun    时间: 2014-12-28 11:07
感谢分享
作者: xiao飞    时间: 2014-12-28 12:44
太详细了,大赞
作者: Afridoce    时间: 2014-12-28 12:58
赞一个~~~~~
作者: 陈召    时间: 2014-12-28 14:32
不错,挺详细的。赞一个。
作者: duluhua    时间: 2014-12-28 19:20
非常感谢分享~
作者: 任我行_2014    时间: 2015-1-2 00:30
总结很全面,收藏啦,谢谢楼主分享
作者: 找寻小龙猫    时间: 2015-1-2 02:18
谢谢楼主分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2