自定义异常的运用

自定义异常

什么是自定义异常,为什么要自定义异常?

  • 当java异常库中里面没有我想要去表达错误的问题异常,我就需要自己去定义一个异常来满足我们的需求,通过使用自己定义的异常来标记和处理某种错误情况

如何自定义异常?

  • 自定义异常分为自定义运行时异常,和自定义非运行时异常,自定义运行时异常,需要继承自RuntimeException或者任意运行时异常的类,自定义非运行时异常,需要继承自Exception或者任意非运行时异常的类。

简单的代码示例

  • 我们观察下面两份代码可以发现一个继承了exception,一个继承了RuntimeException,对于非运行时异常来说必须在方法上就标记这个异常,这样做是为了通知调用者必须处理或抛出这个异常。而对于运行时异常来说我们可以提前就采取方案来避免掉,不需要强制用try{}catch{}捕获处理

  • 继承Exception的代码演示:

    public static void main(String[] args) {
        try {
            throwCheckedException();
        } catch (MyCheckedException e) {
            System.out.println("捕获到非运行时异常:" + e.getMessage());
        }
    }

    public static void throwCheckedException() throws MyCheckedException {
        throw new MyCheckedException("这是一个非运行时异常");
    }

    public static class MyCheckedException extends Exception {
        public MyCheckedException(String message) {
            super(message);
        }
    }
  • 继承RuntimeException的代码演示:
    public static void main(String[] args) {
        try {
            throwRuntimeException();
        } catch (MyRuntimeException e) {
            System.out.println("捕获到运行时异常:" + e.getMessage());
        }
    }

    public static void throwRuntimeException() {
        throw new MyRuntimeException("这是一个运行时异常");
    }

    public static class MyRuntimeException extends RuntimeException {
        public MyRuntimeException(String message) {
            super(message);
        }
    }

一个小的demo演示

  • 很简单,就是自定义了一个异常来处理年龄超出范围的情况,如果通过setAge 方法传入的年龄超出了范围,就会抛出 AgeOutOfBoundsException 异常,并有一个描述错的信息

  • AgeOutOfBoundsException类:

public class AgeOutOfBoundsException extends RuntimeException {

    public AgeOutOfBoundsException(){
        super();
    }
    
    public AgeOutOfBoundsException(String msg){
        super(msg);
    }
}
  • Student类:
public class Student {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 130) {
            throw new AgeOutOfBoundsException("年龄越界异常了,age:" + age);
        }
        this.age = age;
    }
}
  • 运行:
    public static void main(String[] args) {
        Student student = new Student();
        student.setAge(131);
    }
    //输出:AgeOutOfBoundsException: 年龄越界异常了,age:131

再来一个稍微难一点的Demo

  • 定义了一个自定义异常类InsufficientFundsException,表在取钱操作中余额不足的情况
public class InsufficientFundsException extends Exception {

    //多余的钱
    private double amount;

    public InsufficientFundsException(double amount) {
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }

    public String getMessage() {
        return "钱还差这么多:" + amount;
    }
}
  • 这是一个账户,功能有存钱,取钱和获取余额和卡号,在存钱的方法里就是将我存入的金额加到余额上面,取钱的方法是如果取款的金额小于等于余额时直接从余额中扣除就好,反之出现余额不足时则抛出自定义异常
public class Account {

    private double balance;
    private int number;

    public Account(int number) {
        this.number = number;
    }

    //存钱
    public void deposit(double amount) {
        balance += amount;
    }

    //取钱
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount <= balance) {
            balance -= amount;
        } else {
            double needs = amount - balance;
            throw new InsufficientFundsException(needs);
        }
    }

    //返回余额
    public double getBalance() {
        return balance;
    }

    //返回卡号
    public int getNumber() {
        return number;
    }
}
  • 首先创建一个账户,卡号为10001,然后存进去了100,接着进行取钱,去了100,因为余额足够,所以取款成功,接着再取600,因为余额不足所以抛出InsufficientFundsException异常,并提示错误信息
    public static void main(String[] args) {
        Account c = new Account(10001);
        System.out.println("存入100元");
        c.deposit(100);
        try {
            System.out.println("取100元");
            c.withdraw(100.00);
            System.out.println("取600元");
            c.withdraw(600.00);
        } catch (InsufficientFundsException e) {
            System.out.println("抱歉,你的余额不足 " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    //错误信息:InsufficientFundsException: 钱还差这么多:600.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 中,我们可以通过自定义异常来处理特定的异常情况。自定义异常类必须继承于 Exception(或其子类)或者 Throwable 类。 以下是一个自定义异常的示例代码: ```java public class MyException extends Exception { public MyException(String message) { super(message); } } ``` 在这个示例中,我们定义了一个名为 MyException 的自定义异常类,它继承于 Exception 类。在这个类中,我们通过构造函数传入一个字符串类型的参数 message,然后调用了父类 Exception 的构造函数,将这个参数传递给父类。这样,在抛出这个异常时,我们可以携带一些额外的信息,帮助我们更好地理解异常的原因。 在使用这个自定义异常类时,我们可以像使用其他异常一样进行操作,例如: ```java public void doSomething() throws MyException { // some code if (someCondition) { throw new MyException("This is my custom exception message."); } // some more code } ``` 在这个示例中,我们定义了一个方法 doSomething(),并且声明了它会抛出一个 MyException 异常。在方法中,我们可以进行一些操作,并且在满足某些条件时,通过 throw 语句抛出我们定义的自定义异常类 MyException。在抛出异常时,我们可以传递一些信息,以便更好地理解异常的原因。 总之,自定义异常类可以帮助我们更好地处理特定的异常情况,并且可以携带一些额外的信息,帮助我们更好地理解异常的原因。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值