280 likes | 459 Vues
第七章 异常处理. §1.1 错误处理的方法概述 §1.2 Java 的异常处理机制 §1.3 创建自己的异常类. §1.1 错误处理的方法概述. 传统的程序运行时错误处理 异常处理. 1 传统的程序运行时错误处理. 如 C 语言: 函数返回值 = 某个可能会执行失败的函数(); if( 函数返回值 == 表示该函数执行成功的值) { 正常代码 } else if( 函数返回值 == 代表错误情况 1 的值 ){ 处理错误情形 1} else if( 函数返回值 == 代表错误情况 2 的值 ){ 处理错误情形 2} …….
E N D
第七章 异常处理 §1.1 错误处理的方法概述 §1.2 Java的异常处理机制 §1.3 创建自己的异常类
§1.1 错误处理的方法概述 • 传统的程序运行时错误处理 • 异常处理
1 传统的程序运行时错误处理 如C语言: • 函数返回值=某个可能会执行失败的函数(); if(函数返回值==表示该函数执行成功的值){正常代码} else if(函数返回值==代表错误情况1的值){处理错误情形1} else if(函数返回值==代表错误情况2的值){处理错误情形2} ……
1 传统的程序运行时错误处理 • 函数返回值=某个可能会执行失败的函数(); if(函数返回值!=表示该函数执行成功的值) { Switch(函数返回值){ case 错误情况1的值:处理错误情形1 case 错误情况2的值:处理错误情形2 ……}} else{正常代码}
1 传统的程序运行时错误处理 缺点: 1)整个程序代码穿插错误处理代码,使得条理性和可读性差; 2)对错误处理程序难以集中管理,难以保证程序的一致性; 3)对于返回值的意义,要借助于文档,程序维护困难。
2 异常处理 如C++,JAVA语言: • 就是在异常发生时,由编程语言提供的某种机制通知应用程序,让应用程序决定如何进行下一步的处理。 传统方式: 1)负责测出错误的发生 (程序设计者) 2)进行错误的处理 异常处理方式:2)进行错误的处理 (程序设计者)
2 异常处理 • 特点: 1)可将错误处理代码和常规代码隔离开来,提高程序的可读性和可维护性; 2)可以处理一组错误,进行集中管理,保证程序的一致性。 3) 将异常事件分类,体现了良好的层次性。
§1.2 Java的异常处理机制 Java语言用异常为它的程序提供了错误处理方式,为方法的异常终止和出错处理提供了清晰的接口。 • 异常和异常对象 • 异常的处理过程
1 异常和异常对象 • 异常:在程序执行的时候,所发生会打断程序正常流程的事件。 异常的类型 错误出现 产生异常对象 程序的状态信息 “异常”被看作是对象,是继承自类Throwable的子类。所有Throwable的子类所产生的对象实例,都是异常。
1 异常和异常对象 • 异常类的层次 Object Throwable Exception Error Non_RuntimeException RuntimeException
1 异常和异常对象 • 运行时异常:运行异常可以不做处理,运行时系统会把生成的运行时异常对象交给默认的异常处理程序,在标准输出上显示异常的内容及发生异常的位置。
1 异常和异常对象 • ArithmeticException:除0,用0取模; • NullPointException:访问一个空对象中的变量和方法,或一个空数组中的元素; • ClassCastException:把对象o强制成Class C,而o既不是C的实例,又不是C的子类的实例; • NegativeArraySizeException:数组的长度是负数; • ArrayIndexOutOfBoundsException:访问数组中的非法元素。
1 异常和异常对象 • 非运行时异常:非运行异常需要使用try-catch-finally语句捕获异常或使用throws子句生声明异常。
1 异常和异常对象 • IOException • FileNotFoundException:找不到文件; • InterruptedIOException; • UnknownHostException; • UnknownServiceException; • SocketException; • MalformedURLException; • NoSuchMethodException • ClassNotFoundException
2 异常的处理过程 • 抛出异常:产生一个异常对象以及把它转交给运行系统 • 间接抛出(try) • 直接抛出(throw) • 捕获异常(catch):找出异常的合适处理方法,即异常指针的选择过程 • 处理异常
2 异常的处理过程 Java的异常处理机制由try / catch / finally 组成 try{ //可能会产生异常的程序块 }catch(Exception1){ //异常处理 } catch(Exception2){ //异常处理 }[finally{ //清除方法状态和关闭文件等语句 }]
2 异常的处理过程 例1: try{ System.in.read(); }catch(IOException e){ String err = e.getMessage(); System.out.println(err); }
2 异常的处理过程--声明异常 例2:声明异常 Protected void myMethod(){ try{ doRead(); }catch(IOException e){ System.out.println(e.getMessage());} } Protected void doRead() throws IOException{ System.in.read(); }
2 异常的处理过程—抛出异常 例3: Public static void main(String[] args){ try{ System.out.pringtln(passingGrade(90,80)); }catch(Exception e){ System.out.println(e.getMessage());} } Static void passingGrade(int correct,int total) throws Exception{ if(correct>total) throw new Exception(“Invalid values”); }
2 异常的处理过程 • Throw语句会使得一个异常被抛掷,其结果将导致程序控制的转换,即转向处理异常的catch块。形式: throw new Exception(“描述字符串”); • Throws是将本方法产生的异常不处理,而是抛给上层调用者。
§1.3 创建自己的异常类 • 创建自己的异常类 继承Exception及其子类,多数情况下为非运行时异常。如 class MyException extends Exception{ … String say(){…} } • 在程序中使用自己的异常类 class UseMyException{ … try{ throw new MyException(); }catch(MyException e){System.out.println(e.say()); } }
小结 • JAVA异常处理机制及处理过程 • 异常处理与程序的结合使用 • 异常,运行时异常,非运行时异常, Error,try-catch-finally,throw,throws
习题 • 解释JAVA异常处理机制及处理过程 • 解释异常,运行时异常,非运行时异常
UsingExceptions.java public class UsingExceptions { public static void main( String args[] ) { try { method1(); } catch ( Exception e ) { System.err.println( e.getMessage() + "\n" ); } } public static void method1() throws Exception { method2(); } public static void method2() throws Exception { method3(); } public static void method3() throws Exception { throw new Exception( "Exception thrown in method3" ); } }
UsingExceptions.java public class UsingExceptions { public static void main( String args[] ){ try { throwException(); } catch ( Exception e ) { System.err.println( "Exception handled in main" ); } } public static void throwException() throws Exception {try { System.out.println( "Method throwException" ); throw new Exception(); } catch( RuntimeException e ) {System.err.println( "Exception handled in " + "method throwException" ); } finally { System.err.println( "Finally is always executed" ); } } }
UsingExceptions class DivideByZeroException extends ArithmeticException { public DivideByZeroException() { super( "Attempted to divide by zero" ); } public DivideByZeroException( String message ) { super( message ); } }
public class ExceptionExample { public static void main( String args[] ){ try { int number1 =1; int number2 =0; double result = quotient( number1, number2 ); } catch ( DivideByZeroException dbze ) { System.err.println("Attempted to Divide by Zero" +dbze.toString() ); } }
public double quotient( int number1, int number2 ) throws DivideByZeroException { if (number2 == 0 ) throw new DivideByZeroException(); else return ( double ) number1 / number2; } }