1. 自定义异常 1.1 定义方式 ① 必须继承自Exception或Exception的子类 ,常用RuntimeException ② 必须提供无参构造 方法; ③ 必须提供String message的1参构造 方法,super(message); 备注:受查异常CheckedException和运行时异常RuntimeException的定义方式没有区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class SexMismatchException extends Exception { public SexMismatchException () {} public SexMismatchException (String msg) { super (msg); } }class AgeInputException extends RuntimeException { public AgeInputException () {} public AgeInputException (String msg) { super (msg); } }
1.2 自定义异常的抛出 Exception受查异常(告知调用者使用该方法时必须处理):声明 :①需要声明该异常,传递出去; ②声明的异常类型最好与抛出的异常类型一致抛出 :throw new 自定义异常类名(异常提示字符串);
RuntimeException运行时异常: 声明:可声明/可不声明抛出 :throw new 自定义异常类名(异常提示字符串);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 class Student { private int age; private String sex; public Student () {} public String getSex () { return this .sex; } public void setSex (String sex) throws SexMismatchException { if ("男" .equals(sex) || "女" .equals(sex)) { this .sex = sex; } else { throw new SexMismatchException ("性别只能为男/女!" ); } } public int getAge () { return this .age; } public void setAge (int age) { if (age > 0 && age < 123 ) { this .age = age; } else { throw new AgeInputException ("年龄的范围0~123!" ); } } }
1.3 自定义异常的捕获
【提示】 打印红色字体的错误信息使用(serr):System.err.println(e.getMessage());
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class TestDefinedException { public static void main (String[] args) { Student s = new Student (); try { s.setAge(250 ); } catch (AgeInputException e) { System.out.println("运行时异常:" + e.getMessage()); } catch (Exception e) { e.printStackTrace(); } try { s.setSex("嬲" ); } catch (SexMismatchException e) { System.err.println(e.getMessage()); } catch (Exception e) { e.printStackTrace(); } } }
2. 异常中的方法覆盖 声明了异常的方法覆盖注意事项: - 父类/接口
方法名、参数列表、返回值类型必须和父类相同(覆盖的要求 );
父类中方法没有声明异常 ,则子类中也不可以声明异常 ;
父类中方法声明了异常 ,子类重写后可声明也可不声明 ,如果声明则必须是与其相同或其异常子类 ;
子类可以声明比父类更多 的异常,但必须小于 父类的异常类(即异常子类) - 即子类不能抛出比父类更多、更宽的异常 。
父类中的方法有异常抛出的声明,示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Super { public void method () throws Exception { System.out.println("method() in Super" ); } }class Sub extends Super { public void method () throws RuntimeException,ClassNotFoundException { System.out.println("method() in Sub" ); } }
接口中的抽象方法有异常抛出的声明,示例:
1 2 3 4 5 6 7 8 9 10 11 interface Printable { public void print () throws RuntimeException; }class MyClass implements Printable { public void print () throws ArithmeticException, NullPointerException{ } }
PS:普通继承和接口的实现,对于异常的使用上没有任何区别。