自定义异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

比如说,代码中少了一个分号,那么运行出来结果是提示是错误 java.lang.Error; 如果你用 System.out.println(1/0) ,那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

从上面可以大概了解到什么是异常,一些异常都是 Java 内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中没有定义过,那如果Java内部定义的异常无法完成我们的需求的时候该怎么办呢?

例如,年龄负数问题,考试成绩负数问题,这时就需要我们自定义异常。 ,这时候就需要一个自定义异常了。

简言之:当Java中提供的异常不能满足我们的需求时,就需要自定义异常了,也就是说在开发中根据自己业务的异常情况来定义异常类。

那么该如何定义异常呢?

下面对如何定义异常进行简述以及演示:

如何自定义异常

  • 实现步骤

    1. 定义异常类
    2. 写继承关系
    3. 提供空参构造
    4. 提供带参构造
  • 注意

    • 一般地,用户自定义异常类都是 RuntimeException 的子类
    • 自定义异常类通常需要编写几个重载的构造器
    • 自定义异常需要提供 serialVersionID
    • 自定义的异常通过 throw 抛出
    • 自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型;
  • 建议:保留两种构造器的形式

    • 无参构造

    • 带给父类的message属性赋值的构造器

  • 自定义异常的语法形式为:

    <class><自定义异常名><extends><Exception>
    

    语法示例:

    public class XXXExcepiton extends Exception | RuntimeException{
        {空参构造方法}
        {带给父类的message属性赋值的构造方法}
    }
    
    • 在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。

    • 自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。

自定义异常需要注意什么

  • 自定义异常类一般都是以Exception结尾,说明该类是一个异常类
  • 自定义异常类,必须的继承Exception或者RuntimeException
    • 继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws,要么try…catch
    • 继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)

自定义异常示例

实例说明:

  • 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,超出这个范围是异常数据不能赋值。需要重新录入,一直录到正确为止。

代码示例:

异常类

public class AgeOutOfBoundsException extends RuntimeException {
    public AgeOutOfBoundsException() {
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

学生类

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 18 && age <= 25){
            this.age = age;
        }else{
            //如果Java中提供的异常不能满足我们的需求,我们可以使用自定义的异常
            throw new AgeOutOfBoundsException("年龄超出了范围");
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

public class ExceptionDemo12 {
    public static void main(String[] args) {
        // 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,
        // 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。

        Student s = new Student();

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.nextLine();
        s.setName(name);
       while(true){
           System.out.println("请输入年龄");
           String ageStr = sc.nextLine();
           try {
               int age = Integer.parseInt(ageStr);
               s.setAge(age);
               break;
           } catch (NumberFormatException e) {
               System.out.println("请输入一个整数");
               continue;
           } catch (AgeOutOfBoundsException e) {
               System.out.println(e.toString());
               System.out.println("请输入一个符合范围的年龄");
               continue;
           }
       }
        System.out.println(s);

    }
}

以上内容是我对Java自定义异常的理解,如有错误(或内容不全),欢迎指正(或补充)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值