两个嵌套的for循环语句如何实现在内层循环没结束跳到外层去?

时间:2021-08-09 20:30:12
在下面的代码中原想让验证登陆3次失败就不能在验证了。
可是下面的循环却在每一次验证后都还有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变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)

#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变量,如果内层要跳出就设置一下,外层每次要判断这个变量,看是不是内层要跳出去)

#8


在外循环设置一个标记变量,用于内循环,不满足就跳出,这样说应该很明白吧?

#9


设置一个标记就可以实现

#10


break label 和 continue label

#11


呵呵  别的就不说了  LZ 看见输入框上面的那个#图标么?  点一下 把代码放在那个中间,就不用你去调代码格式了 ^_^

#12


lable:for(;;){
for(;;){
break lable;
}
}

#13


break lable;