我正在尝试学习循环的工作原理,这是我写的一个非常简单的登录系统。尽管此代码似乎存在错误
import java.util.Scanner;
public class Main {
static String password, loginPass, username, loginUser;
static Scanner sc = new Scanner(System.in);
static boolean login = true;
static boolean checkvalid = false;
public static void main(String[] args) {
System.out.println("Enter a desired username: n");
username = sc.nextLine();
System.out.println("Enter a desired password: n");
password = sc.nextLine();
System.out.println("Thank you, please log in.n");
while (login) {
checkvalid = false;
System.out.println(" ------------------ n" + "Username: n");
loginUser = sc.nextLine();
System.out.println("Password: n");
loginPass = sc.nextLine();
if (loginUser.equals(password) && (loginPass.equals(username))) {
checkvalid = true;
} else {
checkvalid = false;
}
}
for (;;){
if (checkvalid = true){
login = false;
System.out.println("You have logged in.");
}else if (checkvalid = false){
System.out.println("Incorrect username or password");
login = true;
}
}
}
}
它反复要求我以前输入的"所需登录凭据"。请帮助我解决这个问题,谢谢!(
您永远卡在第一个循环中,因为您永远不会更改登录值。第二个循环也不需要,您可以将代码移至时循环中的条件中。尝试以下内容。
public static void main(String[] args) {
System.out.println("Enter a desired username: n");
username = sc.nextLine();
System.out.println("Enter a desired password: n");
password = sc.nextLine();
System.out.println("Thank you, please log in.n");
while (login) {
checkvalid = false;
System.out.println(" ------------------ n" + "Username: n");
loginUser = sc.nextLine();
System.out.println("Password: n");
loginPass = sc.nextLine();
if (loginUser.equals(username) && (loginPass.equals(password))) {
checkvalid = true;
login = false;
System.out.println("You have logged in.");
} else {
checkvalid = false;
System.out.println("Incorrect username or password");
}
}
}
while (login)
执行while
循环的主体,直到login
为false。段环的身体是在闭合卷曲支架上结束的部分。就您而言,这是身体的最后陈述:
if (loginUser.equals(password) && (loginPass.equals(username))) {
checkvalid = true;
} else {
checkvalid = false;
}
执行此if
之后,程序循环回到while循环主体的开头。它永远不会进入代码的其余部分(for(;;)
或打印"您已登录"的代码(,直到login
变为false(或有break
语句(。而且您永远不会将login
设置为while
循环中的false。唯一的位置login
设置为false,位于while
循环主体之外,只要您的程序粘在While Loop内,它就永远不会到达那里。
您可能想要将login
设置为false的代码 while
循环 - 而不是单独的循环中:
while (login) {
checkvalid = false;
System.out.println(" ------------------ n" + "Username: n");
loginUser = sc.nextLine();
System.out.println("Password: n");
loginPass = sc.nextLine();
if (loginUser.equals(password) && (loginPass.equals(username))) {
checkvalid = true;
} else {
checkvalid = false;
}
if (checkvalid == true){
login = false;
System.out.println("You have logged in.");
}else if (checkvalid == false){
System.out.println("Incorrect username or password");
login = true;
}
}
[我还修复了您犯的if (checkvalid = true)
错误,如评论中所述。不过,这最后可以简化:
if (checkvalid) { // you never have to use "== true" to check a boolean
login = false;
System.out.println("You have logged in.");
}else { // if we get here, checkvalid has to be false, no need to test it again
System.out.println("Incorrect username or password");
login = true;
}
还有其他方法可以更简化这一点,但这足以简化一个答案。]
我想知道为什么您将username
与loginPass
和password
与loginUser
进行比较,可能就是您想要的。我只是建议您省略checkvalid
。你可以做这样的事情
static boolean login = false;
while (!login) {
System.out.println(" ------------------ n" + "Username: n");
loginUser = sc.nextLine();
System.out.println("Password: n");
loginPass = sc.nextLine();
if (loginUser.equals(password) && (loginPass.equals(username))) {
System.out.println("You have logged in.");
login = true;
}
else {
System.out.println("Incorrect username or password");
}
}
尝试将该登录名保持为false,直到登录成功为止,因为在您之后,您会发现它令人困惑。
尝试一下:D
Scanner sc = new Scanner(System.in);
String x = sc.nextLine();// Put the user
while(!x.equals("John")) {
System.out.println("Wrong User, try again :D");
x = sc.nextLine();
}
sc.close();