一、自定义异常类
Java 允许开发者根据业务需求,自定义专属异常类,用于处理项目中的业务异常(如密码非法、账号不存在、权限不足等场景)。
1.1 自定义异常分类规则
自定义异常的类型,由父类继承关系决定:
- 自定义运行时异常:自定义类继承
RuntimeException或其子类 特点:编译器不强制检测,代码可处理、可不处理 - 自定义编译时(受检)异常:自定义类继承
Exception(与 RuntimeException 无继承关系) 特点:编译器强制检测,代码中必须处理,否则编译报错
1.2 自定义异常类规范
自定义异常类,一般需要提供两个构造方法:
- 无参数的构造方法
- 有参数的构造方法,参数类型为 String,接收异常信息,利用
super(message)调用父类构造,为异常信息属性赋值
1.3 完整代码示例:密码校验自定义异常案例
package Test_02; import java.util.ArrayList; import java.util.Scanner; public class TestMyException { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入您的密码:"); String pasword = sc.next(); checkPassword(pasword); } //监测密码 public static void checkPassword(String psw) { try { if(psw.length()!=6) { //抛出异常,并且带有“此密码必须为6位”异常信息->抛出关于密码监测异常 throw new CheckedPasswordException("此密码必须为6位"); } System.out.println("密码输入正确...."); System.out.println("请继续一下的操作"); }catch(CheckedPasswordException c) { // String message = c.getMessage();//为用户做提示信息用的 // System.err.println(message); c.printStackTrace(); } } } //自定义编译期异常,继承Exception class CheckedPasswordException extends Exception { public CheckedPasswordException() {} public CheckedPasswordException(String message) { super(message); } }运行测试:输入长度不等于 6 的密码,会手动抛出我们自定义的
CheckedPasswordException异常,进入 catch 块打印异常栈信息。
二、方法重写(Override)异常约束规则
2.1 方法重写基础规则
- 子类的方法名,形参列表,返回值类型和父类相同(协变返回除外)
- 子类的访问修饰符权限大于等于父类权限(权限只能放宽,不能缩小)
2.2 重写异常核心规则(⭐面试重点)
一句话口诀:可少、可子、不可多、不可父
- ✅ 可以不抛出任何异常
- ✅ 可以抛出父类抛出异常的子类异常
- ❌ 不可以抛出比父类范围更大的异常(父类异常的父类)
- ❌ 不可以抛出父类没有的新编译时异常
细分说明:
- 如果父类方法没有抛出任何异常:子类重写方法也不能抛出编译时异常(运行时异常不受此限制,可以抛出)
- 如果父类方法抛出某个异常:子类重写方法只能抛出该异常、该异常的子类,或者不抛异常。
2.3 简单示例辅助理解
class Father{ public void test() throws IOException{ //父类抛出IOException } } class Son extends Father{ // ✅合法:抛出IOException子类FileNotFoundException @Override public void test() throws FileNotFoundException{ } // ✅合法:不抛出任何异常 /* @Override public void test(){ } */ // ❌非法:抛出IOException父类Exception,违反规则 /* @Override public void test() throws Exception{ } */ }