Java - 异常(四)- 自定义异常的详解和练习

2023-12-14 23:41:33

目录

🐶第七章 自定义异常

7.1 概述

1. 为什么需要自定义异常类:

2. 什么是自定义异常类:

3. 异常类如何定义:

7.2 自定义异常的练习

🐶第八章 异常练习题


🐶第七章 自定义异常

7.1 概述

1. 为什么需要自定义异常类:

我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常类。,例如年龄负数问题,考试成绩负数问题。

在上述代码中,发现这些异常都是JDK内部定义好的,但是实际开发中也会出现很多异常,这些异常很可能在JDK中没有定义过,例如年龄负数问题,考试成绩负数问题.那么能不能自己定义异常呢?

2. 什么是自定义异常类:

在开发中根据自己业务的异常情况来定义异常类.

自定义一个业务逻辑异常: LoginException。一个登陆异常类。

3. 异常类如何定义:
  • 自定义一个编译期异常: 自定义类 并继承于java.lang.Exception

  • 自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException

7.2 自定义异常的练习

要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。

首先定义一个注册异常类LoginException:

// 业务逻辑异常
public class LoginException extends Exception {
    /**
     * 空参构造
     */
    public LoginException() {
    }

    /**
     *
     * @param message 表示异常提示
     */
    public LoginException(String message) {
        super(message);
    }
}

模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。

public class Demo {
    // 模拟数据库中已存在账号
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {     
        //调用方法
        try{
              // 可能出现异常的代码
            checkUsername("nill");
            System.out.println("注册成功");//如果没有异常就是注册成功
        }catch(LoginException e){
            //处理异常
            e.printStackTrace();
        }
    }

    //判断当前注册账号是否存在
    //因为是编译期异常,又想调用者去处理 所以声明该异常
    public static boolean checkUsername(String uname) throws LoginException{
        for (String name : names) {
            if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
                throw new LoginException("亲"+name+"k已经被注册了!");
            }
        }
        return true;
    }
}

实例1:

自定义异常类

/**
 * 自定义异常类:NoLiFeValueException,继承自RuntimeException
 * 1)提供空参和有参构造
 * 2)在有参构造中,需要调用父类的有参构造,把异常信息传入。
 */
class NoLiFeValueException extends RuntimeException{

    static final long serialVersionUID=1L;

    public NoLiFeValueException() {
    }

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

Person类


/**
 * 属性:名称(name)和生命值(lifeValue)
 * 提供setter和getter方法
 * 在setLifeValue(int lifeValue)方法中,首先判断,如果lifeValue为负数,就抛出NoLiFeValueException
 * 异常信息为:生命值不能为负值:xx
 * 然后再给成员LifeValue赋值
 * 提供空参构造
 * 提供有参构造:使用setXxx方法给name和lifeValue赋值。
 *
 */
class Person{
    public Person() {
    }

    public Person(String name, int lifeValue) {
        setName(name);
        setLifeValue(lifeValue);
    }

    public String getName() {
        return name;
    }

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

    private String name;
    private int lifeValue;
    public void setLifeValue(int lifeValue){
        if(lifeValue<0){
            throw new NoLiFeValueException("生命值不能为负数"+lifeValue);
        }
        this.lifeValue=lifeValue;
    }
}

测试类:

package test;

public class TestDemp02 {

    public static void main(String[] args) {
        //使用满参构造方法创建Person对象,生命值传入一个负数
        //由于一旦遇到异常,后面的代码将不再执行,所以需要注释掉上面的代码
        Person person=new Person("刘伯温",10);
       // Person person1=new Person("刘伯温",-10);

        //使用空参构造创建Person对象
        //调用setLifeValue(int lifeValue)方法,传入一个正数,运行程序
        Person person1=new Person();
        person1.setLifeValue(10);
        //调用setLifeValue(int lifeValue)方法,传入一个负数,运行程序
        person1.setLifeValue(-10);
    }
}

结果:

🐶第八章 异常练习题

package test;

import java.util.Scanner;

public class DivisionDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num1 = scanner.next();
        String num2 = scanner.next();
        try {
            System.out.println(divide(num1, num2));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private static int divide(String num1, String num2) throws NumberFormatException, ArrayIndexOutOfBoundsException, ArithmeticException, BelowZeroException {
        int a=Integer.parseInt(num1);
        int b=Integer.parseInt(num2);
        if (a < 0 || b < 0) {
            //手动抛出异常类对象
            throw new BelowZeroException("不能输入负数");
        }
        return a / b;
    }

}

class BelowZeroException extends Exception {
    static final long serialVersionUID = 1L;

    public BelowZeroException() {
    }

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


}

?结果:

文章来源:https://blog.csdn.net/weixin_40968325/article/details/135005644
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。