1、1,第六章 异常处理, 异常(Exception)的概念异常处理方法自定义异常类,2,1 public class HelloWorld 2 public static void main(String args ) 3 int i=0; 4 String greetings = “Hello World!”,”Hello!”, 5 “HELLO WORLD!”; 6 while ( i4) 7 System.out.println(greetingsi); 8 i+; 9 10 11 ,Hello World! Hello! HELLO WORLD! Java.lang.ArrayIndex
2、OutOfBoundsExceptionat HelloWorld.main(HelloWorld.java:7),3,异常的概念,异常 在程序运行时打断正常程序流程的任何不正常情况。 异常的情况 试图打开的文件不存在 网络链接中断 操作符越界 要加载类文件不存在Java中定义了各种异常,4,Throwable,Error,Exception,VirtualMachineError,AWTError,RuntimeException,IOException,EOFException,FileNotFoundException,ArithmeticException,NullPointerExc
3、eption,IndexOutOfBoundsException,Java中定义的异常,5,Java处理的异常,Error 很难恢复的严重错误,一般不由程序处理。RuntimeException 程序设计或实现上的问题,如数组越界、除零、空引用等。其它异常 通常是由环境因素引起的,并且可以被处理的。 如文件不存在,无效URL等。,6,Java异常类体系中的常见异常,ArithmeticException: 除0错导致的异常 NullPointerException: 当对象没有实例化时,就试图通过该对象的变量访问其数据或方法。 ArrayIndexOutOfBoundsException: 数
4、组越界异常 IOException: 输入/输出时可能产生的各种异常 SecurityException: 由浏览器中负责安全控制的SecurityManager类抛出,7,6.2 异常处理,异常处理 指程序获得异常并处理,然后继续程序的执行。 为了使程序安全,Java要求如果程序中调用的方法有可能产生某种类型的异常,那么调用该方法的程序必须采取相应动作处理异常。处理异常的方式 方式一:捕获并处理异常 方式二:将方法中产生的异常抛出,8,捕获与处理异常,try 语句块 catch 语句块 finally 语句块,9,try语句块,一般形式:try Java statements /一条或多条可
5、能产生例外的java语句。try 语句后必须跟随至少一个catch或finally语句块。,10,catch语句块,catch语句块提供异常处理 一般格式: catch (SomeThrowableObject variableName) Java statements SomeThrowableObject:能够被处理的异常类名,必须是Throwable类的子类 variableName: 是异常处理程序中能够引用的代表被捕获异常变量名称。 Java statements: 当捕获到异常时执行的Java语句。,11,finally语句块,finally 语句块 无论是否发生异常都要执行。 一
6、般用于关闭文件或释放其他系统资源。,12,捕获与处理异常示例,public static void main(String args)int i = 0 ;String greetings=“Hello World!”,”Hello!”,”HELLO!”;while (i4)try System.out.println(greetingsi);catch(ArrayIndexOutOfBoundsException e)System.out.println(“Re-setting Index Value”);i=-1;finallySystem.out.println(“This is alw
7、ays printed”);i+; ,Hello World! This is always printed Hello! This is always printed HELLO! This is always printed Re-setting Index Value This is always printed,13,多种异常的同时处理,14,异常处理可以针对这个体系中的任意一个类。 叶结点 具体、专用的异常处理; 中间结点 通用的异常处理。可以处理该结点及其子类类型的异常。,例:writeList 方法: try . . . catch (Exception e) System.er
8、r.println(“Exception caught: “ + e.getMessage(); ,15,异常处理try ,catch和finally 语句,1 try 2 / code that might throw a partcular exception 3 catch(MyExceptionType e) 4 / code to excute if a MyExceptionType exception is thrown 5 catch (Exception e) 6 / code to execute if a general Exception exception is th
9、rown 7 finally,16,示例(P.165,6-2:ListOfNumbers.java,import java.io.*; import java.util.Vector; public class ListOfNumbers private ArrayList list; private static final int size = 10;public ListOfNumbers () list = new ArrayList(size);for (int i = 0; i size; i+)list.add(new Integer(i); public void writeL
10、ist() PrintWriter out = new PrintWriter(new FileWriter(“OutFile.txt“);for (int i = 0; i size; i+)out.println(“Value at: ” + i + “ = ” + list.get(i);out.close(); ,17,public void writeList() PrintWriter out = null;try System.out.println(“Entering try statement“);out = new PrintWriter( new FileWriter(“
11、OutFile.txt“);for (int i = 0; i size; i+)out.println(“Value at: “ + i + “ = “ +list.get(i); catch (ArrayIndexOutOfBoundsException e) System.err.println(“Caught ArrayIndexOutOfBoundsException: “ +e.getMessage(); catch (IOException e) System.err.println(“Caught IOException: “ + e.getMessage(); finally
12、 if (out != null) System.out.println(“Closing PrintWriter“);out.close(); else System.out.println(“PrintWriter not open“); ,18,writeList方法中的try语句块的执行可能有三种情况: 出现了IOException出现了数组越界错误正常退出,Entering try statementCaught IOException: OutFile.txtPrintWriter not open,Entering try statement Caught ArrayIndexO
13、utOfBoundsException: 10 = 10 Closing PrintWriter,Entering try statement Closing PrintWriter,19,异常处理抛出异常,可能产生异常的方法表明将不处理该异常,而该异常将被抛到调用该方法的程序。 例:public void troublesome( ) throws IOException 如果一个异常在返回到main()时还未被处理,则程序将非正常终止。,20,例: public Object pop() throws EmptyStackException Object obj;if (size = 0)
14、throw new EmptyStackException();obj = objectAt(size - 1);setObjectAt(size - 1, null);size-;return obj; 抛出异常的throw语句: throw someThrowableObject;,异常处理抛出异常,如何修改例子6-2?,21,22,6.3自定义异常类,定义异常类,是Exception类的子类,可包含普通类的内容。 public class ServerTimeOutException extends Exceptionprivate String reason;private int p
15、ort ;public ServerTimeOutException(String reason, int port)this.reason = reason;this.port = port;public String getReason()return reason;public int getPort()return port; ,23,抛出产生的异常,public void connectMe(String serverName) throwsServerTimeOutExceptionint success ;int portToConnect = 80;success = open
16、(serverName, portToConnect);if(success= -1)throw new ServerTimedOutException(“Could not connect”,80);,24,获得异常并处理,public void findServer()tryconnectMe(defaultServer);catch(ServerTimeOutException e)System.out.println(“Server timed out, try another”);tryconnectMe(alternateServer);catch(ServerTimeOutException e1)System.out.println(“No server avaliable”);,