题目
假设用户账号为:admin,密码为123,编写用户登陆案例。
要求
请将登陆定义为login方法, 并将login方法写在UserService类中
思路
题目给定了账号和密码,所以登陆时可以直接判断用户的输入是否和给定的账号密码一致;我的设计是用户如果输错账号或者密码三次就直接退出程序;其中的逻辑看似简单,但要完全覆盖也是要花点时间的。
知识点
封装、Scanner类
实现过程
import java.util.Scanner;
public class UserService {
public static final String ACCOUNT = "admin";// 账号
private int password = 123;// 密码
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public UserService() {
super();
// TODO Auto-generated constructor stub
}
public void login() {
System.out.println("****欢迎使用本系统****");
Scanner input = new Scanner(System.in);
// 输入三次账号都错误就退出程序
for (int i = 0; i < 3; i++) {
System.out.println("请输入你的账号:");
String acc = input.next();
int count = 0;// 控制密码输入次数,三次错误退出程序
if (acc.equals(ACCOUNT)) {
while (true) {
count++;
System.out.println("请输入您的密码:");
//如果下次输入是int类型的则继续,否则提示输入错误
if (input.hasNextInt()) {
int pw = input.nextInt();
if (pw == password) {
System.out.println("恭喜你登录成功!");
break;
} else {
if (count < 3) {
System.out.println("您输入的密码有误,请重新输入。");
continue;
} else {
System.out.println("您本次错误输入的次数已达上限,欢迎下次的来访,再见!");
break;
}
}
} else {
if (count < 3) {
System.out.println("您输入的密码有误,请重新输入。");
input.next();
continue;
} else {
System.out.println("您本次错误输入的次数已达上限,欢迎下次的来访,再见!");
break;
}
}
}
break;
} else if (i == 2) {
System.out.println("你输入的账号次数已达上限,欢迎下次使用。");
} else {
System.out.println("您输入的账号有误,请重新输入。");
}
}
}
}
值得注意的问题
next() 与 nextLine() 区别
next():
1、一定要读取到有效字符后才可以结束输入。以空格、回车、Tab键都会视为结束符。。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。
我在之前的编程过程中遇到过这种情况:
如下代码,前面使用nextInt()接收10,后面打算用nextLine()去接收"hello",然后发现并没有成功接收"hello"就结束了。后面根据求助老师和查找资料发现:nextInt()只接收一行中的int类型的值,然而int后面的 \n 是未被读取的,然后再用nextLine()时,刚好读取了这个 \n 导致后面的String未读取,也就是a = 10; s = “\n”
Scanner input = new Scanner(System.in);
int a = input.nextInt();//假如输入10
String s = input.nextLine();//假如输入"hello"
在本次练习中也是遇到了相同的情况,
if (input.hasNextInt()) {
int pw = input.nextInt();
...
...
...
} else {
if (...) {
...
input.next();//如果键盘输入的不是int类型的值,循环会直接跳过,所以要用next()接收掉错误的值
...
...
}
所以以后在使用Scanner类的时候还是需要多注意的