Java验证用户名和密码

假设在某仓库管理系统的登录界面中需要输入用户名和密码,其中用户名只能由 6~10 位数字组成,密码只能有 6 位,任何不符合用户名或者密码要求的情况都视为异常,并且需要捕获并处理该异常。

下面使用自定义异常类来完成对用户登录信息的验证功能,实现步骤如下。

1)编写自定义异常类 LoginException,该类继承自 Exception。在 LoginException 类中包含两个构造方法,分别为无参的构造方法和含有一个参数的构造方法,代码如下:
public class LoginException extends Exception {
    public LoginException() {
        super();
    }
    public LoginException(String msg) {
        super(msg);
    }
}

2)创建测试类 Test08,在该类中定义 validateLogin() 方法,用于对用户名和密码进行验证。当用户名或者密码不符合要求时,使用自定义异常类 LoginException 输出相应的异常信息。validateLogin() 方法的定义如下:
public boolean validateLogin(String username,String pwd) {
    boolean con = false;    // 用户名和密码是否正确
    boolean conUname = false;    // 用户名格式是否正确
    try {
        if (username.length() >= 6 && username.length() <= 10) {
            for (int i = 0;i < username.length();i++) {
                char ch = username.charAt(i);    // 获取每一个字符
                if (ch >= '0' && ch <= '9') {    // 判断字符是否为0~9的数字
                    conUname = true;    // 设置 conUname 变量值为 true
                } else {    
                    // 如果字符不是0~9的数字,则拋出LoginException异常
                    conUname = false;
                    throw new LoginException("用户名中包含有非数字的字符!");
                }
            }
        } else {    
            // 如果用户名长度不在6~10位之间,拋出异常
            throw new LoginException("用户名长度必须在6〜10位之间!");
        }
        if (conUname) {    // 如果用户名格式正确,判断密码长度
            if (pwd.length() == 6) {    
                // 如果密码长度等于6
                con=true;    // 设置con变量的值为true,表示登录信息符合要求
            } else {    // 如果密码长度不等于6,拋出异常
                con = false;
                throw new LoginException("密码长度必须为 6 位!");
            }
        }
    } catch(LoginException e) {    
        // 捕获 LoginException 异常
        System.out.println(e.getMessage());
    }
    return con;
}
3)在 Test08 类中添加 main() 方法,调用 validateLogin() 方法,如果该方法返回 true,则输出登录成功的信息。main() 方法的定义如下:
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("用户名:");
    String username = input.next();
    System.out.println("密码:");
    String password = input.next();
    Test08 lt = new Test08 ();
    boolean con = lt.validateLogin(username,password);    // 调用 validateLogin() 方法
    if (con) {
        System.out.println("登录成功!");
    }
}

在本程序的 validateLogin() 方法中使用条件控制语句和  for 循环语句分别对用户名和密码进行了验证。任何不符合用户名或者密码要求的情况都拋出自定义异常 LoginException,并在 catch 语句中捕获该异常,输出异常信息。

运行程序,当用户输入的用户名含有非数字字符时将拋出 LoginException 异常,执行 catch 语句块中的代码打印异常信息,如下所示。
用户名:
xiake8!
密码:
123456
用户名中包含有非数字的字符!

当用户输入的用户名长度不在 6~10 位时同样会拋出 LoginException 异常并打印异常信息,如下所示。
用户名:
administrator
密码:
123456
用户名长度必须在6~10位之间!

当用户输入的登录密码不等于 6 位时也会拋出 LogWException 异常,并打印出异常信息,如下所示。
用户名:
20181024
密码:
12345
密码长度必须为 6 位!

当用户输入的用户名和密码都符合要求时,则打印登录成功的信息,如下所示。
用户名:
20181024
密码:
123456
登录成功!

推荐文章
编程有哪些数据类型?

各编程语言数据类型C语言编程数据类型一、基本类型1、整型1)、短整型2)、基本整型3)、长整型2、字符型3、实型(浮点型)1)、单精度型2)、双精度型4、枚举类型二、构造类型1、数组类型2、结构体类型

MySQL使用SELECTI...INTO OUTFILE导出表数据

通过对数据表的导入导出,可以实现MySQL数据库服务器与其它数据库服务器间移动数据。导出是指将MySQL数据表的数据复制到文本文件。数据导出的方式有多种,本节主要介绍使用SELECTI...INTOO

Java基础/框架一对一答疑指导

h1{ color:#B22222; font-family:SegoePrint; padding:20px20px } tabletr:nth-child(odd){ backgr

C语言三色旗问题

有一根绳子,上面有红、白、蓝三种颜色的旗子。绳子上旗子的颜色并没有顺序,现在要对旗子进行分类,按照蓝色、白色、红色的顺序排列。只能在绳子上进行移动,并且一次只能调换两面旗子,怎样移动才能使旗子移动的次

JSP JSTL <c:catch>标签:捕获异常标签

标签是JSTL中处理程序异常的标签,它还能够将异常信息保存在变量中。 语法:  ……存在异常的代码 参数说明: var:可以指定存储异常信息的变量。这是一个可选项,如果不需要保存异常信息,

Linux /boot/grub/目录分析

本章第一节就已经讲过,BIOS在进行完成系统检测之后,就会找到第一个可以启动的设备,并读取该设备的MBR(主引导记录)以及加载MBR中的bootloader(启动引导程序),这个启动引导程序可以具有菜

Java Swing JFrame和JPanel:窗口容器和面板容器

在Swing中,任何其他组件都必须位于一个顶层容器中。JFrame窗口和JPanel面板是常用的顶层容器,本节详细介绍这两个容器的使用方法。 JFrame窗口 JFrame用来设计类似于Window

邮件系统配置视频教程(橡皮树老师出品6集)

视频讲解了如何在RHEL5上安装Postfix+Dovecot+MySQL+Postfixadmin+Spamassassin系统。 视频目录: [bbk1099]--邮件系统的体系结构以及Re

strspn和strcpn函数,C语言strspn和strcpn函数详解

strspn函数表示从字符串s的第一个字符开始,逐个检查字符与字符串accept中的字符是否不相同,如果不相同,则停止检查,并返回以字符串s开头连续包含字符串accept内的字符数目。其函数原型的一般

JS replaceChild()方法:替换节点

JavaScriptreplaceChild()方法可以将某个子节点替换为另一个。用法如下: nodeObject.replaceChild(new_node,old_node) 其中参数 new_

深度优先生成树和广度优先生成树(详解版)

前面已经给大家介绍了有关生成树和生成森林的有关知识,本节来解决对于给定的无向图,如何构建它们相对应的生成树或者生成森林。 其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是

JS创建HTML元素

在JavaScript中,使用document对象的createElement()方法能够根据参数指定的标签名称创建一个新的元素,并返回新建元素的引用。用法如下: varelement=docume

PHP设计模式之单例模式与工厂模式

设计模式不是一套具体的语言框架,而是一种行之有效的编码规范,是前人经过反复使用并总结出来的编写代码的经验。使用设计模式的目的是为了提高代码可重用性,让代码更容易被他人理解,同时保证代码可靠性。合理使用

Java数据类型:基本数据类型和引用数据类型

前面我们提到Java语言是强类型语言,编译器存储在变量中的数值具有适当的数据类型。学习任何一种编程语言都要了解其数据类型,本文将详细介绍Java中的数据类型。 Java语言支持的数据类型分为两种:基

安卓接口和type-c接口有什么区别?

安卓接口和type-c接口的区别typec和安卓接口在接口的外形上有很大的区别,typec接口要宽一些,安卓接口的接头就要窄一些了。另外typec接口上下都是一样的大小,但是安卓接口看起来更像一个圆角

C语言左值与右值详解

左值是用来指明一个对象的表达式。最简单的左值就是变量名称。左值(lvalue)之所以称为“左”(以首字母为L,代表left),是因为一个左值表示一个对象,它可以出现在赋值运算符(assignmento

JSP PageContext.handlePageException()方法:抛出异常

该方法用于抛出异常,不进行处理。 语法1 handlePageException(Exceptione) 参数说明: e:Exception对象。 示例 本示例在首页面产生异常,在erro

JS绑定事件(静态绑定+动态绑定)

在基本事件模型中,JavaScript支持以下两种绑定方式。 静态绑定 把JavaScript脚本作为属性值,直接赋予给事件属性。 示例 在下面示例中,把JavaScript脚本以字符串的形式传递

Linux工作管理简介(通俗易懂)

工作管理指的是在单个登录终端(也就是登录的Shell界面)同时管理多个工作的行为。也就是说,我们登陆了一个终端,已经在执行一个操作,那么是否可以在不关闭当前操作的情况下执行其他操作呢? 当然可以,我

Qt foreach关键字用法(无师自通)

Qt提供一个关键字foreach(实际是里定义的一个宏)用于方便地访问容器里所有数据项。 foreach关键字用于遍历容路中所有的项,使用foreach的句法是: foreach(variable