9.3.1 自定义异常类设计

  1. 自定义异常一般要提供构造方法和toString()方法
  2. class MyException extends Exception{
  3. String id;
  4. public MyException(String str){
  5. id=str;
  6. }
  7. public String toString() {
  8. return "我是异常:"+id;
  9. }
  10. }

9.3.2 抛出异常

  • 系统定义的运行异常由系统在运行程序过程中自动抛出;
  • 用户设计的异常,要通过throw语句抛出。
    1. public class TestException {
    2. public static void main(String a[]) {
    3. try {
    4. throw new MyException("一个测试异常");
    5. } catch (MyException e) {
    6.    System.out.println(e);
    7. }
    8. }
    9. }

    9.3.3 方法的异常声明

    方法中异常抛出的方式:
    (1)在方法内对异常进行捕获处理;
    (2)将异常处理交给外部调用程序:在方法头使用throws子句列出该方法可能产生哪些异常。
    throw语句和throws子句的差异性
    返回类型 方法名(参数列表) throws 异常类名列表 { //出现在方法头

    throw 异常类名 //出现在方法内

    }
    ```java (1)对异常捕获处理: public static void main(String a[]) { try{ char c = (char) System.in.read() ;
    System.out.println(“你输入的字符是:”+ c);
    }catch(java.io.IOException e){ } }

(2)方法头throws列出可能产生哪些异常。 public static void main(String a[]) throws IOException { char c = (char) System.in.read() ; //存在异常 System.out.println(“你输入的字符是:”+ c);
}

  1. <a name="IlAYk"></a>
  2. #### 没在程序中消化掉的异常,虚拟机将在控制台显示。
  3. 在调用带异常的方法时
  4. 1. **调用者处理异常---消化掉(try –catch –finally);**
  5. try{<br />System.in.read(); <br /> } catch …
  6. 2. **调用者不处理,在调用者的方法头声明异常(throws ...)。**
  7. public static void main(String a[]) throws IOException { <br />char c = (char) System.in.read() ; <br /> ….<br />}
  8. 3. 没消化的异常被虚拟机收到,则在控制台显示错误。
  9. - **方法覆盖时,子类方法的throws子句中异常不能超出父类的范围。**
  10. - **子类方法也可不抛出异常。**
  11. - **若父类方法没有异常声明,子类的覆盖方法也不能有异常。**
  12. class E1 extends Exception { }<br />class E2 extends E1 { }<br />class TestParent { <br /> public void fun(boolean f) throws E1 { }<br />}<br />public class Test extends TestParent { <br /> //---X— <br />}<br />下面哪些方法可以放在—X—位置并通过编译。<br />A. public void fun(boolean f) throws E1 { }<br />B. public void fun(boolean f) { }<br />C. public void fun(boolean f) throws E2 { }<br />D. public void fun(boolean f) throws E1,E2 { }<br />E. public void fun(boolean f) throws Exception { }
  13. ```java
  14. class FindRoot{
  15. static double[] root(double a, double b, double c)throws IllegalArgumentException {
  16. double x[]=new double[2];
  17. if (a== 0) {
  18. throw new IllegalArgumentException("a 不能为零."); 系统异常类
  19. }
  20. else {
  21. double disc = b*b - 4*a*c;
  22. if (disc < 0) 异常是有条件产生
  23. throw new IllegalArgumentException("无实数解!");
  24. x[0]=(-b + Math.sqrt(disc)) / (2*a);
  25. x[1]=(-b - Math.sqrt(disc)) / (2*a);
  26. return x;
  27. }
  28. }
  29. public static void main(String arg[]) {
  30. try {
  31. double x[] = root(2.0,5,3);
  32. System.out.println("方程根为:"+x[0]+","+x[1]);
  33. }catch(Exception e) { System.out.println(e); }
  34. }
  35. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. try { method();
  4. }catch(Exception e) {System.out.println("*");}
  5. }
  6. static void method() {
  7. try { wrench();
  8. System.out.println("a");
  9. }catch(ArithmeticException e) {//换成catch(NullPointerException e)
  10. System.out.println("b");
  11. }finally {
  12. System.out.println("c");
  13. }
  14. System.out.println("d");
  15. }
  16. static void wrench()throws NullPointerException {
  17. throw new NullPointerException();
  18. }
  19. }
  20. 运行结果:
  21. c
  22. *
  23. 换成catch(NullPointerException e)后
  24. 运行结果:
  25. b
  26. c
  27. d