• 1. 第7课 异常
  • 2. 学习目标掌握并能够处理Java异常 能够创建自定义异常类
  • 3. 本课内容Java异常的概念和处理机制(★) Java异常的分类 异常的捕获、处理和抛出 使用用户自定义异常
  • 4. 异常什么时候发生 编译器能够发现的错误是语法错误,不是异常 而在程序运行期间,由于各种原因而导致的错误或不期待出现的情况,就叫异常
  • 5. 异常是什么 int a=6; int b=0; System.out.println(a/b) Exception in thread "main" java.lang.ArithmeticException: / by zero
  • 6. 常见异常RuntimeException 错误的类型转换 数组下标越界 空指针访问 IOExeption 从一个不存在的文件中读取数据 越过文件结尾继续读取 连接一个不存在的URL
  • 7. 常见异常public class Test{ public static void main(String[] args) { String friends[]={"lisa","bily","kessy"}; for(int i=0;i<5;i++) { System.out.println(friends[i]); } System.out.println("\nthis is the end"); } } Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Test.main(Test.java:13)
  • 8. 常见异常public class Test { public static void main(String[] args) { String a = null; if(a.equals("hello")){ System.out.println("hello"); } } } Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)
  • 9. 常见异常public class Test{ public static void main(String[] args) { String friends[]={"lisa","bily","kessy"}; for(int i=0;i<5;i++) { System.out.println(friends[i]); } System.out.println("\nthis is the end"); } }
  • 10. 程序Test运行结果:java Test lisa bily kessy Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:3 at Test.main(Test.java:13)
  • 11. 每种异常都是使用一个java类表示 每个具体的异常都是使用对应的java类的实例来表示 程序发生了一个异常,通常称程序抛出一个异常。这里所谓抛出异常,就是产生一个对于异常类的实例。
  • 12. 2. Java异常分类Java程序运行过程中所发生的异常事件可分为两类: 错误(Error):JVM系统内部错误、资源耗尽等严重情况 异常(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: 对负数开平方 空指针访问 试图读取不存在的文件 网络连接中断
  • 13. 异 常 类 层 次
  • 14. 已检查异常(Check Exception)和未检查异常(unCheck Exception)已检查异常(Check Exception) 在某些情况下异常的发生是可预期的,例如使用输入/输出功能时,可能由于硬件环境问题,使得程序无法正常从硬件取得输入或输出。这种错误是 可预测的,这类异常为可控异常,编译器必须要求你明确处理可控异常。 未检查异常(unCheck Exception) 像ArithmeticException异常,并不一定可预测发生,编译器不要求你一定要处理,对于执行时异常如果没有处理,则异常会一直往外丢,最后由JVM来处理。JVM所做的就是显示异常堆栈信息,之后结束程序。
  • 15. 3. 异常处理机制(★) 把异常捉住Java程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。 当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。 如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。 程序员通常只能处理异常(Exception),而对错误(Error)无能为力。
  • 16. 捉住处理异常public class Test{ public static void main(String[] args) { String friends[]={"lisa","bily","kessy"}; try { for(int i=0;i<5;i++) { System.out.println(friends[i]); } } catch(ArrayIndexOutOfBoundsException e) { System.out.println("index err"); } System.out.println("\nthis is the end"); } }
  • 17. 程序Test运行结果:java Test lisa bily kessy index err this is the end
  • 18. 4. 捕获异常 多种异常,一并处理 捕获异常是通过try-catch-finally语句实现的。 try{ ...... //可能产生违例的代码 }catch( ExceptionName1 e1 ){ ...... //当产生ExceptionName1型违例时的处置措施 }catch( ExceptionName2 e2 ){ ...... //当产生ExceptionName2型违例时的处置措施 } [ finally{ ...... //无条件执行的语句 } ]
  • 19. 捕获异常try 捕获异常的第一步是用try{…}语句块选定捕获异常的范围 catch 在catch语句块中是对异常对象进行处理的代码,每个try语句块可以伴随一个或多个catch语句块,用于处理可能产生的不同类型的异常对象。与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。 getMessage( ) 方法,用来得到有关异常事件的信息 printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。
  • 20. 捕获异常finally 捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。 可分三种情况:1、不产生违例 ; 2、产生违例,在catch中捕获 ; 3、产生违例,未在catch中捕获。 finally语句块是任选的
  • 21. Common com=null; try { com = (Common) Class.forName("generclass.lession6.Plane").newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); //throw e.fillInStackTrace(); } catch(Exception e) { e.printStackTrace(); } finally{ System.out.println("finally over"); } System.out.println("ssss");
  • 22. 5. 声明抛弃异常 throw 和 throws如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应声明抛弃异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理 public void readFile(String file) throws FileNotFoundException { …… // 读文件的操作可能产生FileNotFoundException类型的违例 FileInputStream fis = new FileInputStream(file); ..…… } 若想自行丢出异常,可以使用throw 如:throw new ArithmeticException();
  • 23. 创建用户自定义异常类用户自定义异常类MyException,用于描述数据取值范围错误信息: class MyException extends Exception { private int idNumber; public MyException(String message, int id) { super(message); idNumber = id; } public int getId() { return idNumber; } }
  • 24. class MyException extends Exception { public MyException() {} public MyException(String msg) { super(msg); } } class Devide{ public int division(int x,int y) throws MyException { if(y==0){ throw new MyException("被零除了"); } return x/y; } public int division1(int x,int y) { int a=0; try{ a = x/y; } catch(Exception e){ e.printStackTrace(); } return a; } }
  • 25. public class DevideException { public static void main(String[] args){ Devide d = new Devide(); try { d.division(10,0); System.out.println("hello1"); } catch (MyException e) { //System.out.println(e.getMessage()); e.printStackTrace(); } finally{ System.out.println("hello"); } System.out.println("hello1"); System.out.println("hello"); } }
  • 26. 嵌套异常处理嵌套异常处理
  • 27. class MyException1 extends Exception { } class MyException2 extends Exception { } public class DeepExcp { static void f1() throws MyException1 { throw new MyException1(); } static void f2() throws MyException2 { throw new MyException2(); }
  • 28. public static void main(String[] args) { try { try { f1(); f2(); } catch (MyException2 e2) { System.out.println("处理异常2"); } finally { System.out.println("第一个finally处理!"); } } catch (MyException1 e1) { System.out.println("处理异常1"); } finally { System.out.println("第二个finally处理!"); } }
  • 29. 重写和异常import java.io.*; public class Father { public void methodA() throws IOException{} } class Son1 extends Father { public void methodA() throws EOFException{} } class Son2 extends Father { public void methodA() throws Exception{} }
  • 30. 重写方法不能抛出比被重写方法范围更大的异常类型 public class A { public void methodA() throws IOException { …… } } public class B1 extends A { public void methodA() throws FileNotFoundException { …… } } public class B2 extends A { public void methodA() throws Exception { …… } }
  • 31. 异常使用的原则非运行时异常必须捕获或声明,运行时异常则不必 自定义异常从Exception继承,并且不要作为RuntimeException的子类 在方法内能如能处理异常则处理,否则交由上层方法处理
  • 32. 链式异常class ChainExcDemo { static void demoproc() { NullPointerException e = new NullPointerException("top layer"); // add a cause e.initCause(new ArithmeticException("cause")); throw e; } public static void main(String args[]) { try { demoproc(); } catch (NullPointerException e) { // display top level exception System.out.println("Caught: " + e); // display cause exception System.out.println("Original cause: " + e.getCause()); } } }
  • 33. 时间和日期处理Date类 DateFormat 类 SimpleDateFormat 类
  • 34. SimpleDateFormatSimpleDateFormat myFmt; myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); SimpleDateFormat:     y 年     M 月     d 日     h 时 在上午或下午 (1~12)     H 时 在一天中 (0~23)     m 分     s 秒     S 毫秒     E 星期     D 一年中的第几天     F 一月中第几个星期几     w 一年中第几个星期     W 一月中第几个星期     a 上午 / 下午 标记符     k 时 在一天中 (1~24)     K 时 在上午或下午 (0~11)     z 时区 myFmt.format(d)方法 格式化相应的日期
  • 35. 简单的时间和日期处理
  • 36. 字符串转时间
  • 37. 小结学习了Java异常处理机制(try、catch、finally结构) 学习了自定义异常类
  • 38. 问题如何定义自定义异常 写出至少三种异常类的名字并解释其表示的错误意义 写一下异常的类结构图,并解释每个分支的意义 写出异常处理的三个关键字,并解释。 解释throw 与throws的区别。
  • 39. 作业写一个方法检查一个字符串是否为一个email,并且写出测试程序。