可是下面的循环却在每一次验证后都还有2次的机会,也就是提示我还有2次机会
这个应该就是for循环的错误了吧 ,,大侠们帮忙找找错误在哪里出现 ,,又应如何解决呢?
f=true;
Scanner scanner = new Scanner(System.in);
ac: do{
System.out.print("\n"+"验证用户信息!"+"\n"+"输入用户名:");
sc5 = scanner.next();
System.out.print("输入用户密码:");
sc6 = scanner.next();
username = sc5;
password = sc6;
dd: for(int i=3;i>=1;i--){
if(i==0){
System.out.println("对不起你输入3次机会已过,登陆失败,请退出!");
break;
}
else{
if(user.getUsername().equals(username) && user.getPassword().equals(password)){
System.out.println("恭喜你登陆成功!");
f = false;
break ac;
}else{
System.out.println("用户名或密码错误!验证失败!你还有"+(i-1)+"次机会");
f = false;
i=i-1;
break dd;
}
}
}
}while(f==false);
13 个解决方案
#1
额 格式刚刚命名很努力的整理好了 ,,可是发帖后怎么又成这样了 ,,,汗,,各位大侠不要见怪,,将就一下。。
#2
改改写代码的习惯,各个职能分开成不同的方法不就容易多了
public class TestCheck {
// 模拟用户名密码
private int seed = 0;
public String getMsg(int times, boolean result) {
if (result == true && times <= 3) {
return "成功!";
}
else if (times > 3) {
return "超过3次验证失败!";
}
else {
return "失败!";
}
}
public boolean check(String acc, String pwd) {
boolean isok = false;
// 校验逻辑
return isok;
}
public String[] getAccPwd() {
String[] arrAccPwds = new String[] {
String.valueOf(this.seed), String.valueOf(this.seed)
};
this.seed++;
return arrAccPwds;
}
public static void main(String[] args) {
boolean loginstate = false;
TestCheck check = new TestCheck();
for (int i = 0; loginstate;) {
String[] arrAccPwds = check.getAccPwd();
loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
check.getMsg(i, loginstate);
}
}
}
#3
漏了行跳出循环
public class TestCheck {
// 模拟用户名密码
private int seed = 0;
public String getMsg(int times, boolean result) {
if (result == true && times <= 3) {
return "成功!";
}
else if (times > 3) {
return "超过3次验证失败!";
}
else {
return "失败!";
}
}
public boolean check(String acc, String pwd) {
boolean isok = false;
// 校验逻辑
return isok;
}
public String[] getAccPwd() {
String[] arrAccPwds = new String[] {
String.valueOf(this.seed), String.valueOf(this.seed)
};
this.seed++;
return arrAccPwds;
}
public static void main(String[] args) {
boolean loginstate = false;
TestCheck check = new TestCheck();
for (int i = 0; loginstate;) {
String[] arrAccPwds = check.getAccPwd();
loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
check.getMsg(i, loginstate);
if (loginstate) break;
}
}
}
#4
代码还得调啊 ,调了一下,可以直接试着运行了
public class TestCheck {
// 模拟用户名密码
private int seed = 1;
public String getMsg(int times, boolean result) {
if (result == true && times < 3) {
return "成功!";
}
else if (times >= 2) {
return "超过3次验证失败!";
}
else {
return "失败!你还有" + String.valueOf(2-times) + "次机会!";
}
}
public boolean check(String acc, String pwd) {
boolean isok = false;
// 校验逻辑
return isok;
}
public String[] getAccPwd() {
String[] arrAccPwds = new String[] {
String.valueOf(this.seed), String.valueOf(this.seed)
};
this.seed++;
return arrAccPwds;
}
public static void main(String[] args) {
boolean loginstate = false;
TestCheck check = new TestCheck();
for (int i = 0; !loginstate;) {
String[] arrAccPwds = check.getAccPwd();
loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
String msg = check.getMsg(i++, loginstate);
System.out.println(msg);
if (loginstate) break;
}
}
}
#5
内循环break+if条件判断
#6
boolean flag = false;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(j>i){
flag = true;
break;
}
if(flag){
flag = false;
break;
}
}
}
#7
方法一:标号中转(就是在外层for循环定义标号,break直接break到标号,有多少层跳多少层)(不推荐)
方法二:标志判断(第一层前定义个boolean变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)
方法二:标志判断(第一层前定义个boolean变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)
#8
在外循环设置一个标记变量,用于内循环,不满足就跳出,这样说应该很明白吧?
#9
设置一个标记就可以实现
#10
break label 和 continue label
#11
呵呵 别的就不说了 LZ 看见输入框上面的那个#图标么? 点一下 把代码放在那个中间,就不用你去调代码格式了 ^_^
#12
lable:for(;;){
for(;;){
break lable;
}
}
#13
break lable;
#1
额 格式刚刚命名很努力的整理好了 ,,可是发帖后怎么又成这样了 ,,,汗,,各位大侠不要见怪,,将就一下。。
#2
改改写代码的习惯,各个职能分开成不同的方法不就容易多了
public class TestCheck {
// 模拟用户名密码
private int seed = 0;
public String getMsg(int times, boolean result) {
if (result == true && times <= 3) {
return "成功!";
}
else if (times > 3) {
return "超过3次验证失败!";
}
else {
return "失败!";
}
}
public boolean check(String acc, String pwd) {
boolean isok = false;
// 校验逻辑
return isok;
}
public String[] getAccPwd() {
String[] arrAccPwds = new String[] {
String.valueOf(this.seed), String.valueOf(this.seed)
};
this.seed++;
return arrAccPwds;
}
public static void main(String[] args) {
boolean loginstate = false;
TestCheck check = new TestCheck();
for (int i = 0; loginstate;) {
String[] arrAccPwds = check.getAccPwd();
loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
check.getMsg(i, loginstate);
}
}
}
#3
漏了行跳出循环
public class TestCheck {
// 模拟用户名密码
private int seed = 0;
public String getMsg(int times, boolean result) {
if (result == true && times <= 3) {
return "成功!";
}
else if (times > 3) {
return "超过3次验证失败!";
}
else {
return "失败!";
}
}
public boolean check(String acc, String pwd) {
boolean isok = false;
// 校验逻辑
return isok;
}
public String[] getAccPwd() {
String[] arrAccPwds = new String[] {
String.valueOf(this.seed), String.valueOf(this.seed)
};
this.seed++;
return arrAccPwds;
}
public static void main(String[] args) {
boolean loginstate = false;
TestCheck check = new TestCheck();
for (int i = 0; loginstate;) {
String[] arrAccPwds = check.getAccPwd();
loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
check.getMsg(i, loginstate);
if (loginstate) break;
}
}
}
#4
代码还得调啊 ,调了一下,可以直接试着运行了
public class TestCheck {
// 模拟用户名密码
private int seed = 1;
public String getMsg(int times, boolean result) {
if (result == true && times < 3) {
return "成功!";
}
else if (times >= 2) {
return "超过3次验证失败!";
}
else {
return "失败!你还有" + String.valueOf(2-times) + "次机会!";
}
}
public boolean check(String acc, String pwd) {
boolean isok = false;
// 校验逻辑
return isok;
}
public String[] getAccPwd() {
String[] arrAccPwds = new String[] {
String.valueOf(this.seed), String.valueOf(this.seed)
};
this.seed++;
return arrAccPwds;
}
public static void main(String[] args) {
boolean loginstate = false;
TestCheck check = new TestCheck();
for (int i = 0; !loginstate;) {
String[] arrAccPwds = check.getAccPwd();
loginstate = check.check(arrAccPwds[0], arrAccPwds[1]);
String msg = check.getMsg(i++, loginstate);
System.out.println(msg);
if (loginstate) break;
}
}
}
#5
内循环break+if条件判断
#6
boolean flag = false;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(j>i){
flag = true;
break;
}
if(flag){
flag = false;
break;
}
}
}
#7
方法一:标号中转(就是在外层for循环定义标号,break直接break到标号,有多少层跳多少层)(不推荐)
方法二:标志判断(第一层前定义个boolean变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)
方法二:标志判断(第一层前定义个boolean变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)
#8
在外循环设置一个标记变量,用于内循环,不满足就跳出,这样说应该很明白吧?
#9
设置一个标记就可以实现
#10
break label 和 continue label
#11
呵呵 别的就不说了 LZ 看见输入框上面的那个#图标么? 点一下 把代码放在那个中间,就不用你去调代码格式了 ^_^
#12
lable:for(;;){
for(;;){
break lable;
}
}
#13
break lable;