1、1 1 1学习目标 理解异常和异常处理 区别异常的类型:Error(严重的)vs.Exception(不严重的),必检异常和免检异常 在方法头中声明异常 在方法中抛出异常 使用 try-catch 块处理异常 解释异常的传播 finally 子句 声明断言2 2 2三类错误语法错误 syntax errors运行错误runtime errors逻辑错误logic errors.3 3 3运行错误 import javax.swing.JOptionPane;public class Test public static void main(String args)String input=JO
2、ptionPane.showInputDialog(null,Please enter an integer);int number=Integer.parseInt(input);/Display the result JOptionPane.showMessageDialog(null,The number entered is +number);System.exit(0);跳过其余行,程序终止.4 4 4捕捉运行错误 import javax.swing.JOptionPane;public class Test public static void main(String args)
3、try String input=JOptionPane.showInputDialog(null,Please enter an integer);int number=Integer.parseInt(input);/Display the result JOptionPane.showMessageDialog(null,The number entered is +number);catch(Exception ex)JOptionPane.showMessageDialog(null,Incorrect input:an integer is required);System.out
4、.println(Execution continues.);System.exit(0);-5 5 5异常类 LinkageError Error AWTError AWTException Throwable ClassNotFoundException VirtualMachineError IOException Exception RuntimeException Object ArithmeticException NullPointerException IndexOutOfBoundsException Several more classes Several more cla
5、sses Several more classes IllegalArgumentException 6 6 6系统错误 LinkageError Error AWTError AWTException Throwable ClassNotFoundException VirtualMachineError IOException Exception RuntimeException Object ArithmeticException NullPointerException IndexOutOfBoundsException Several more classes Several mor
6、e classes Several more classes IllegalArgumentException 系统错误是由 JVM抛出并在Error类中描述的。Error类描述内部的系统错误。如果发生,除了通知用户尽量稳妥的结束程序外,几乎什么也不能做。7 7 7异常 LinkageError Error AWTError AWTException Throwable ClassNotFoundException VirtualMachineError IOException Exception RuntimeException Object ArithmeticException Null
7、PointerException IndexOutOfBoundsException Several more classes Several more classes Several more classes IllegalArgumentException 异常是由Exceptions 类描述的。Exceptions 类描述由程序和外部环境引起的错误,这些错误能通过程序捕获和处理。8 8 8运行异常 LinkageError Error AWTError AWTException Throwable ClassNotFoundException VirtualMachineError IO
8、Exception Exception RuntimeException Object ArithmeticException NullPointerException IndexOutOfBoundsException Several more classes Several more classes Several more classes IllegalArgumentException 运行错误由 RuntimeException 类描述的,编程错误如不合适的转换、访问一个越界数组或数值错误等。9 9 9必检异常和免检异常RuntimeException,Error 以及它们的子类都称
9、为免检异常 unchecked exceptions。免检异常反映程序中不可重获的逻辑错误。所有的其他异常都称为必检异常 checked exceptions,意思是指编译器会强制程序员检查并处理它们。101010必检异常和免检异常 LinkageError Error AWTError AWTException Throwable ClassNotFoundException VirtualMachineError IOException Exception RuntimeException Object ArithmeticException NullPointerException In
10、dexOutOfBoundsException Several more classes Several more classes Several more classes IllegalArgumentException 免检异常111111理解异常处理method1()try invoke method2;catch(Exception ex)Process exception;method2()throws Exception if(an error occurs)throw new Exception();捕获异常 抛出异常 声明异常121212声明异常Throws可以声明异常:pub
11、lic void myMethod()throws IOExceptionpublic void myMethod()throws IOException,OtherException131313抛出异常当程序检查到一个错误后,创建一个适当类型异常的实例并抛出它,称为抛出异常。抛出异常使用throw throw new TheException();TheException ex=new TheException();throw ex;141414抛出异常举例/*Set a new radius*/public void setRadius(double newRadius)if(newRad
12、ius=0)radius=newRadius;else throw new IllegalArgumentException(Radius cannot be negative);151515捕获异常try statements;/Statements that may throw exceptionscatch(Exception1 exVar1)handler for exception1;catch(Exception2 exVar2)handler for exception2;.catch(ExceptionN exVar3)handler for exceptionN;161616
13、捕获异常 main method .try .invoke method1;statement1;catch(Exception1 ex1)Process ex1;statement2;method1 .try .invoke method2;statement3;catch(Exception2 ex2)Process ex2;statement4;method2 .try .invoke method3;statement5;catch(Exception3 ex3)Process ex3;statement6;method3抛出一个异常171717注从一个通用父类可以派生出多种异常类。在
14、catch子句中指定异常的顺序是非常重要的。如果父类的catch子句出现在子类的catch子句之前,就会导致编译错误。Java强迫程序员处理必检异常。181818Example 声明、抛出和捕获异常问题:演示声明、抛出和捕获异常。改写6.10节中的setRadius 方法。TestCircleWithExceptionRunCircleWithException191919Example GUI 程序中的异常GUI程序出现异常,在控制台上输出错误信息,用户界面处理可以继续进行。编写程序,创建一个用户界面进行整数除法。IntegerDivisionRun202020重新抛出异常try state
15、ments;catch(TheException ex)perform operations before exits;throw ex;212121finally 子句try statements;catch(TheException e)handling e;finally finalStatements;222222何时使用异常一个方法出现异常时,如果想让该方法的调用者处理异常,应该创建一个异常对象并抛出。如果能在发生异常的方法中处理异常,那么就不需要抛出异常。一般来说,项目中多个类上发生的共同异常,应该考虑作为异常类处理。发生在个别方法中的简单错误最好进行局部处理,不要抛出异常。232
16、323何时使用异常当必须处理不可预料的错误时,应该使用try catch块。简单的、可预料的不要使用。try System.out.println(refVar.toString();catch(NullPointerException ex)System.out.println(refVar is null);if(refVar!=null)System.out.println(refVar.toString();else System.out.println(refVar is null);最好替换为:242424用户自定义的异常系统定义的异常主要用来处理系统可以预见的较为常见的运行错误,
17、对于某个应用所特有的运行错误,需要自己创建用户自定义的异常类,用于处理用户程序中特定的逻辑运行错误。例:方法例:方法void ccs(int i)if(i10)throw(new MyException(i);elseSystem.out.println(ccs is:+i);主程序中加入:主程序中加入:tryccs(1);ccs(5);ccs(20);ccs(30);catch(MyException e)System.out.println(Exception is:+e.toString();可见,可见,catch语句应跟在语句应跟在try语句后,当语句后,当try中的语句在执行时产生一
18、个中的语句在执行时产生一个异常后,被启动的异常处理会自动捕捉,并跳到异常后,被启动的异常处理会自动捕捉,并跳到catch语句去执行。语句去执行。272727创建系统异常类RunRadiusExceptionF可以通过扩展Exception类或其子类来创建自己的异常类。CircleWithRadiusExceptionTestCircleWithRadiusException282828断言断言 assertion 是java的语句,它允许对程序提出一个判断(假设)。断言包含一个布尔表达式,在程序运行中,它应该是真。断言用于确保程序的正确性,避免逻辑错误。292929断言assert 声明断言:
19、assert assertion;assert assertion:detailMessage;assertion是一个布尔表达式detailMessage 是一个基本类型值或一个对象值。303030执行断言示例public class AssertionDemo public static void main(String args)int i;int sum=0;for(i=0;i 10&sum 5*10:sum is +sum;313131运行带断言的程序默认情况下断言不起作用。为使它们有效,使用开关enableassertions,或 ea:java ea AssertionDemo断言无效:disableassertions 或 da java ea:package1 da:Class1 AssertionDemo323232断言使用switch(month)case 1:.;break;case 2:.;break;.case 12:.;break;default:assert false:Invalid month:+month