2016-10-08 7 views
4

break; 문을 사용하여 for 루프를 종료하려고합니다. 무슨 일이 일어나고 무엇중첩 된 "if"문에서 중첩 된 "for"루프 중단

final int NUM_USERS = 6;      // Max Number of Users. 
UserInfo[] users = new UserInfo[NUM_USERS]; // Array of Users. 
int loginCounter = 0;      // Counts bad login attempts. 
int i = 0;         // Loop index variable. 
String userRole = "";      // Holds user's role text. 

for (loginCounter = 1; loginCounter <= 3; ++loginCounter) { 
     // Get User's Credentials. 
     System.out.println("Enter Username: "); 
     String username = input.next().toLowerCase(); 
     input.nextLine();      // Allows User to enter password. 
     System.out.println("Enter Password: "); 
     String password = input.nextLine(); 

     String hash = sysLogin.convertToMd5(password); 
     for (i = 0; i < users.length; ++i) { 
      if (username.equals(users[i].getUsername())) { 
       if (hash.equals(users[i].getHash())) { 
        userRole = users[i].getRole(); 
        sysLogin.goodLogin();  // Prints Good Login message. 
        break; 
       } 
      } else { 
       sysLogin.badLogin();   // Prints Bad Login message. 
      } 
     } 
    } 

:

코드는 usernamepassword 읽어 그것이 좋은 로그인되어 있는지 확인합니다, 다시, 사용자 이름과 암호를 묻는 돌아갑니다. 일어날 것으로 예상된다 무엇

:

가 성공적으로 로그인을 명중하면, 그것은 현재 사용자의 역할에 userRole을 설정 후 루프를 종료는 goodLogin 메시지가 표시됩니다.

+0

그리고 당신은 발생하는 어떤 문제가 있습니까? – Gendarme

+0

예기치 않은 결과가 발생하는 곳을보기 위해 디버거를 연결하고 코드를 단계별로 실행 해 보았습니까? –

+2

휴식은 사용자 목록을 반복하는 대부분의 for 루프에서 빠져 나가고 outtr 루프에서 벗어나지 않습니다. –

답변

1

당신은 라벨을 부착하는 라벨 (Java example about labels in branches)로 나눌 수 :

final int NUM_USERS = 6;      // Max Number of Users. 
UserInfo[] users = new UserInfo[NUM_USERS]; // Array of Users. 
int loginCounter = 0;      // Counts bad login attempts. 
int i = 0;         // Loop index variable. 
String userRole = "";      // Holds user's role text. 
OUTER: 
for (loginCounter = 1; loginCounter <= 3; ++loginCounter) { 
     // Get User's Credentials. 
     System.out.println("Enter Username: "); 
     String username = input.next().toLowerCase(); 
     input.nextLine();      // Allows User to enter password. 
     System.out.println("Enter Password: "); 
     String password = input.nextLine(); 

     // Convert password to MD5 hash. 
     String hash = sysLogin.convertToMd5(password); 
     for (i = 0; i < users.length; ++i) { 
      if (username.equals(users[i].getUsername())) { 
       if (hash.equals(users[i].getHash())) { 
        userRole = users[i].getRole(); 
        sysLogin.goodLogin();  // Prints Good Login message. 
        break OUTER; 
       } 
      else { 
       sysLogin.badLogin();   // Prints Bad Login message. 
      } 
      } 
     } 
    } 
+0

와우 ... 나는 특별하다 ... 지금 모두가 말한 것을 얻는다. 나는 잊어 버렸고, 나는 for 루프를 중첩했다. 모두에게 감사한다. 마킹 질문에 답했다. –

+0

라벨에 의존하는이 80 년대 코딩 스타일을 사용하지 말라. 가장 나쁜 말로 생각하면 매우 나쁜 관행으로 간주되며 코드를 디버그하기가 어렵고 장기적으로 유지 보수가 어렵습니다. (수정하기 어렵습니다) –

+0

@FedericoPeraltaSchaffner 이것은 제공된 코드의 빠른 해결책이었습니다. 이 예제에서 제공하는 로직을 구현하는 방법은 여러 가지가 있지만 정확한 질문이 있습니다 - 제공된 예제가 작동하지 않는 이유와이를 수정하는 방법 – ACV

2

break은 당신이 사용자 목록을 itterate 루프 내부의 탈옥 것, 그리고 외부 루프를.

당신은 루프에 실패 횟수에 다시 추가해야이

boolean login = false; 
do { 

    // Get User's Credentials. 
    System.out.println("Enter Username: "); 
    String username = input.next().toLowerCase(); 
    input.nextLine();      // Allows User to enter password. 
    System.out.println("Enter Password: "); 
    String password = input.nextLine(); 

    // Convert password to MD5 hash. 
    String hash = sysLogin.convertToMd5(password); 
    for (i = 0; i < users.length; ++i) { 
     if (username.equals(users[i].getUsername())) { 
      if (hash.equals(users[i].getHash())) { 

       login = true; 

       userRole = users[i].getRole(); 
       sysLogin.goodLogin();  // Prints Good Login message. 
       break; 
      } else { 

       sysLogin.badLogin();   // Prints Bad Login message. 
      } 
     } 
    } 
} while (login == false && failCondition == false); 

같은 몇 가지 일을 시도, 그러나 이것은 당신에게 더 예상 결과를 제공한다.

1

break; 문은 가장 안쪽 루프를 나눕니다. 가장 바깥 쪽 루프는 계속 실행됩니다.

가장 바깥 쪽 루프에는 bool success = false;과 같은 변수가 있어야합니다. 가장 안쪽 루프에 침입하기 전에 true 할당하고, 같은 가장 바깥 쪽 루프에 체크를 수행

if(success) break;

관련 문제