黑马程序员-----java异常处理机制(学习日记)

来源:互联网 发布:360浏览器网络收藏夹 编辑:程序博客网 时间:2024/05/16 05:11


 --------android培训、java培训、期待与您交流! ----------


异常,就是程序在运行时出现不正常的情况。在java编程中,遇到异常也是在所难免的事,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。

问题也是现实生活中的一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。


在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。


       Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。


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

这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。


 Exception(异常):是程序本身可以处理的异常。

       Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。


  运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。


       非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常            


异常的处理通常有两种方式:

   抛出异常当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。

从方法中抛出的任何异常都必须使用throws子句。


   捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。


      捕捉异常通过try-catch语句或者try-catch-finally语句实现。

try {      // 可能会发生异常的程序代码  } catch (Type1 id1){      // 捕获并处置try抛出的异常类型Type1  }  catch (Type2 id2){       //捕获并处置try抛出的异常类型Type2  }  

   需要注意的是,一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。

        

总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。

实例1. 

捕捉throw语句抛出的“除数为0”异常

public class TestException {      public static void main(String[] args) {          int a = 6;          int b = 0;          try { // try监控区域                            if (b == 0) throw new ArithmeticException(); // 通过throw语句抛出异常              System.out.println("a/b的值是:" + a / b);          }          catch (ArithmeticException e) { // catch捕捉异常              System.out.println("程序出现异常,变量b不能为0。");          }          System.out.println("程序正常结束。");      }  }  

运行结果:程序出现异常,变量b不能为0。

                    程序正常结束。


实例2.

  捕捉运行时系统自动抛出“除数为0”引发的ArithmeticException异常。

    public static void main(String[] args) {          int a = 6;          int b = 0;          try {              System.out.println("a/b的值是:" + a / b);          } catch (ArithmeticException e) {              System.out.println("程序出现异常,变量b不能为0。");          }          System.out.println("程序正常结束。");      }  }  

运行结果:程序出现异常,变量b不能为0。

                  程序正常结束。

实例3.

不捕捉、也不声明抛出运行时异常。

public class TestException {      public static void main(String[] args) {          int a, b;          a = 6;          b = 0; // 除数b 的值为0          System.out.println(a / b);      }  }

运行结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.TestException.main(TestException.java:8)


throws 和 throw 的区别

throws 使用在函数上

throw   使用在函数内

throws 后面跟的异常类,可以跟多个,用逗号隔开

throw   后面跟的是异常现象


自定义异常:

使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
    在程序中使用自定义异常类,大体可分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。

实例4.

class FushuException extends Exception{FushuException(String msg){super(msg);}}class Demo{int div (int a,int b) throws FushuException {if(b<0)throw new FushuException("除数为负数");return a/b;}}class  ExceptionDemo5{public static void main (String[] args){Demo d = new Demo();try {int x = d.div(4,-1); System.out.println("x="+x);}catch (FushuException e){System.out.println(e.toString());}System.out.println("over");}}
运行结果:
FushuException: 除数为负数
over



0 0
原创粉丝点击