【了解Java自定义异常】以用户密码登录程序为例


活动地址:CSDN21天学习挑战赛

目录

​一、自定义异常

1.1 自定义异常的步骤

1.2 以用户登录时密码输入多次为例自定义异常

二、异常处理的注意事项


​一、自定义异常

        使用Java内置的异常类可以描述在编程时出现的大部分通用的异常情况,但是,在实际程序编写中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的个性化问题,此时可以创建自己的异常类,即自定义异常类

1.1 自定义异常的步骤

        1)创建一个继承 Exception 或 RuntimeException的子类

        形式如下:

        class  自定义异常类名   extends  Exception{

                        

                        类体;

                }

         2)使用异常

                若 某一个方法(函数) 的方法体将产生异常,则应在 该方法 声明时,通过 throw关键字抛出该自定义异常对象,该方法 的声明形式如下:

        [函数返回值类型]   方法 ([参数列表]) throws  自定义异常类名  {

                        方法体;

                }

                若 该方法 要抛出多个异常,可以声明多个异常类,并用逗号隔开。

1.2 以用户登录时密码输入多次为例自定义异常

        示例要求:①用户登录程序:用户输入用户名后有3次输入密码的机会,输入正确显示欢迎信息;输入q表示用户主动结束登陆,输出再见信息;
        ②如3次输入密码错误,则产生异常,捕获此异常,输出账户锁定信息。

//自定义异常类TooManyTimesWrongLogin,表示用户登录错误的次数过多

package Exception;

import java.util.*;

public class Exception_05{
    public static void main(String[] args) {   //主函数
        User user;
        String userName;
        @SuppressWarnings("resource")                 //@SuppressWarnings : 选择性地取消特定代码段(类或方法)中的警告。
        Scanner reader = new Scanner(System.in);
        System.out.println("请输入用户名:");
        userName = reader.next();

        try {
            user = check(userName);               //用户名及密码的验证函数:可能存在异常(密码输入超过三次)
        }catch(TooManyTimesWrongLogin e) {
            System.out.println("对不起,您的账户已被锁定,请联系...");
            return;
        }catch(Exception e) {
            System.out.println(e);
            return;
        }
        if(user.loginSuccess)
            System.out.println(user.userName+"欢迎你!");
        else
            System.out.println(user.userName+"再见!");

    }


    //定义产生异常的方法:定义的某一个类(Exception_05)中的 某一个方法(check)可能产生某个类型(TooManyTimesWrongLogin)的异常,声明时用throw语句


    public static User check(String userName) throws TooManyTimesWrongLogin{
        String password;
        @SuppressWarnings("resource")
        Scanner reader = new Scanner(System.in);

        for (int i=0;i<3;i++) {
            System.out.println("请输入密码,您还有"+(3-i)+"次机会,输入Q或q表示取消登录。");
            password = reader.next();
            if(userName.equals("User")&&password.equals("123456"))           //只有在输入为“User”,输入密码为“123456”时,验证通过
                return new User(userName,true);
            else if(password.equalsIgnoreCase("Q"))
                return new User(userName,false);
        }
        //这里设置:如果三次登陆均没有成功,并且没有退出,就输出该用户的ip地址
        throw new TooManyTimesWrongLogin(userName,"10.10.10.25");
    }
}
class TooManyTimesWrongLogin extends Exception{
    //自定义异常类,继承Exception类
    String userName;
    String IPAdress;
    TooManyTimesWrongLogin(String userName,String IPAdress){
        this.userName = userName;
        this.IPAdress = IPAdress;
    }
}
class User{
    String userName;
    boolean loginSuccess;
    User(String userName,boolean loginSuccess){
        this.userName = userName;
        this.loginSuccess = loginSuccess;
    }
}

        运行结果如下:

 

二、异常处理的注意事项

        由于异常的调用会占据较大内存,应尽量减少异常的使用:

                1)如果使用简单的编程可以完成检查的操作,尽量不用异常去替代。

                如:输入密码错误三次则退出程序,编程是可以实现的:将“throw new TooManyTimesWrongLogin(userName,"10.10.10.25");”抛出异常的代码换成“ System.exit(0);  ”等退出操作。

                2)最好不要到处使用异常,更不要在循环体中使用

                3)不要捕获了一个异常却又不对它做任何处理

                4)通常将异常交给方法的调用者去处理

可以定义两个自定义异常类,例如: ```java public class InvalidUsernameException extends Exception { public InvalidUsernameException(String message) { super(message); } } public class InvalidPasswordException extends Exception { public InvalidPasswordException(String message) { super(message); } } ``` 其中,`InvalidUsernameException` 表示用户名不合法,`InvalidPasswordException` 表示密码不合法。这两个异常类继承自 `Exception` 类,可以通过 `super(message)` 方法传入错误信息。 在用户登录时,可以抛出这两个异常类,例如: ```java public void login(String username, String password) throws InvalidUsernameException, InvalidPasswordException { if (username == null || username.trim().isEmpty()) { throw new InvalidUsernameException("用户名不能为空"); } if (password == null || password.trim().isEmpty()) { throw new InvalidPasswordException("密码不能为空"); } // 进行实际的登录操作 } ``` 在上述代码中,如果用户名或密码为空,就会抛出相应的异常。调用 `login` 方法的代码可以通过 `try-catch` 块来处理异常。例如: ```java public static void main(String[] args) { String username = "test"; String password = ""; try { login(username, password); } catch (InvalidUsernameException ex) { System.out.println("用户名不合法:" + ex.getMessage()); } catch (InvalidPasswordException ex) { System.out.println("密码不合法:" + ex.getMessage()); } } ``` 在上述代码中,由于密码为空,会抛出 `InvalidPasswordException` 异常,程序会输出相应的错误信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锅小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值