百知教育 - 孙帅 - 15_异常处理
01_异常的概念和分类
-
异常的分类:
- Throwable 异常的父类
- Error 错误 严重 不可避免 不可处理
- Exception 异常 可以处理
- RuntimeException子类 未检查异常 可以避免 可处理可不处理
- 非RuntimeException子类,包括Exception 已检查异常 不可避免 必须处理
- Throwable 异常的父类
02_异常的产生和传递
03_声明抛出异常
-
常见异常:
- EOFException、FileNotFoundException是IOException的子类
-
异常的处理:
- 声明抛出 throws
- 谁调用谁处理
-
代码:
package day18; import java.io.EOFException; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.Throwable; import java.lang.Exception; public class TestException{ public static void main(String[] args) throws Throwable{ System.out.println("main 1"); ma(0); System.out.println("main 2"); } static void ma(int i) throws Exception{ System.out.println("ma 1"); mb(i); System.out.println("ma 2"); System.out.println("ma 3"); } static void mb(int i) throws IOException, BZException{ System.out.println("mb 1"); mc(i); System.out.println("mb 2"); } static void mc(int i) throws EOFException, FileNotFoundException, BZException{ System.out.println("mc 1"); if(i == 0) throw new NullPointerException(); if(i == 1) throw new EOFException(); if(i == 2) throw new FileNotFoundException(); if(i == 3) throw new BZException(); System.out.println("mc 2"); System.out.println("mc 3"); } } class BZException extends Exception{ }
-
运行结果:
04_捕获异常
-
try-catch
- 当有多个catch时,先写catch子类异常,再写catch父类异常
-
异常的方法:
- printStackTrace(): 打印异常 栈追踪信息
- getMessage(): 返回异常信息
-
代码:
package day18; import java.io.EOFException; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.Throwable; import java.lang.Exception; public class TestException{ public static void main(String[] args){ System.out.println("main 1"); ma(0); System.out.println("main 2"); } static void ma(int i){ try{ System.out.println("ma 1"); mb(i); System.out.println("ma 2"); } catch(IOException e){ System.out.println("Catch IOException"); } catch(BZException e){ System.out.println("Catch BZException"); } catch(Exception e){ //System.out.println("Catch Exception"+e.getMessage()); e.printStackTrace(); } System.out.println("ma 3"); } static void mb(int i) throws IOException, BZException{ System.out.println("mb 1"); mc(i); System.out.println("mb 2"); } static void mc(int i) throws EOFException, FileNotFoundException, BZException{ System.out.println("mc 1"); if(i == 0) throw new NullPointerException("空指针异常"); if(i == 1) throw new EOFException("文件意外终止"); if(i == 2) throw new FileNotFoundException("文件没找到"); if(i == 3) throw new BZException("我自己定义的异常"); System.out.println("mc 2"); System.out.println("mc 3"); } } class BZException extends Exception{ public BZException(){} public BZException(String message){ super(message); } }
-
运行结果:
05_finally
-
try-catch-finally
- finally: 无论如何都会执行 ,通常用来释放资源。
-
try-finally
-
System.exit(0)
强制退出 -
代码:
package day18; public class TestFinally{ public static void main(String[] args){ System.out.println(fn(2)); System.out.println(fn(0)); } static int fn(int a){ try{ //System.exit(0); int b = 6/a; return b; } catch(Exception e){ return 0; } finally{ System.out.println("hehe"); //return 2; } } }
-
运行结果:
06_finally改变变量值
-
代码:
package day18; public class TestFinally2{ public static void main(String[] args){ System.out.println(fn()); } static int fn(){ int a = 10; try{ a = 20; return a; } finally{ a = 30; } } }
-
运行结果:
07_方法覆盖对抛出异常的要求
-
方法覆盖:
子类方法不能抛出一个父类方法没有抛出的异常,即子类方法抛出的异常必须是父类方法抛出异常的 同类、子类 或者是 不抛 。 -
代码(编译通过):
package day18; import java.io.*; import java.sql.SQLException; public class TestOverrideException{ public static void main(String[] args){ Super s = new Sub(); try{ s.method(); } catch(IOException e){ } } } class Super{ public void method() throws IOException{} } class Sub extends Super{ @Override public void method() throws FileNotFoundException, EOFException{} }