一、自定义异常类
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{
}
*/
}

340

被折叠的 条评论
为什么被折叠?



