/*在Java程序的执行过程中,如果出现了异常事件,就会生成一个例外对象。 java中的例外类可分为两大类: Error: 动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类例外,也不会抛弃这种例外。 Exception: 1)运行时例外: 继承于RuntimeException的类都属于运行时例外, 由于这些例外产生的位置是未知的,Java 编译器允许程序员在程序中不对它们做出处理. 2)非运行时例外: 除了运行时例外之外的其他由Exception 继承来的例外类都是非运行时的例外, Java编译器要求在程序中必须处理这种例外. 两种处理例外的机制: 捕获例外: 简言之,就是try-catch语句. 声明抛弃例外: 如果一个方法并不知道如何处理所出现的例外,则可在方法声明时, 声明抛弃(throws)例外。这是一种消极的例外处理机制。 简言之,就是在方法前加throws Xxx. 例外类的层次见HELP try-catch-finally: try{ ...... }catch( ExceptionName1 e ){//没一个catch语句称为一个异常处理器 ...... }catch( ExceptionName2 e ){ ...... } ...... }finally{ ...... } 在执行try语句块期间的任何时刻抛出异常是,如果存在相应的异常处理器,程序控制会立即转到它上面。就是说,程序控制会转到其异常类与所抛出的异常类对应的第一个catch句子上。执行完catch子句后,程序控制会转到整个try语句后的语句finally语句必须在catch 子句后面try必须, catch和fianlly可选。*///Programme 1:public class TestException{ public static void main(String[] args) { //处理例外机制1:捕获例外 try { int a=0, b=0; a /=b; } /*在catch块中是对例外对象进行处理的代码,与访问其它对象一样, 可以访问一个例外对象的变量或调用它的方法。getMessage( )是类 Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable 还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容 */ /*捕获例外的顺序和catch语句的顺序有关,当捕获到一个例外时, 剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时, 首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类, 再安排父类。 */ catch (ArithmeticException e) { e.printStackTrace(System.out); } /*当捕获到一个例外时,剩下的catch语句就不再进行匹配, 所以下面的catch语句不执行 */ catch(RuntimeException e) { System.out.println(e.getMessage()); } }}/*result:java.lang.ArithmeticException: / by zero at TestException.main(TestException.java:9) */ //Programme 2:class Test{ public int devide(int x, int y) throws DevideByMinusException/*处理例外机制2:抛出例外. 声明抛弃例外是在一个方法声明中的throws子句中指明的. throws子句中同时可以指明多个例外,之间由逗号隔开。 此处的DevideByMinusException也可以改成其父类 Exception,没有影响.*/ { if (y < 0) /*抛出例外就是产生例外对象的过程,首先要生成例外对象,例外或者由虚拟机生成, 或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出例外对象通过throw语句实现。*/ throw new DevideByMinusException ("cannot devided by minus"); int result = x/y; return result; }} class DevideByMinusException extends Exception//自定义例外类必须是Throwable的直接或间接子类。{ public DevideByMinusException(String msg) { super(msg); }} class TestException{ public static void main(String[] args) { Test test = new Test(); //方法的调用者必须了解这些例外,并确定如何正确的处理他们。 try { test.devide(3, -1); } catch (Exception e) { System.out.println (e.getMessage()); } System.out.println ("Programme is running here!"); }}/*result:cannot devided by minusProgramme is running here! */

评论