2017-11-21 8 views
-1

저는 언젠가는이 일에 매달 렸고 누군가가 나를 안내 할 수 있는지 궁금해하고있었습니다. 사용자가 문자를 입력 할 수있게하려는 경우 스위치 케이스 중 하나와 일치하지 않으면 계속해서 사용자에게 질문해야합니다. 내 코드는 그 부분을 잘 처리한다. 이 문제는 사용자가 올바른 문자를 입력하려고 시도하고 내 코드가 특정 사례 대신 기본값을 계속 출력 할 때 발생합니다. 도움이 될 것입니다. 는사용자가 올바른 문자를 입력 할 때도 계속 반복합니다.

while(!flag){ 
      switch (endChar) { 
       case 'T': 
       case 't': 
        modFlags[0] = true; 
        flag = true; 
        break; 
      case 'P': 
      case 'p': 
       modFlags[1] = true; 
       flag = true; 
       break; 

      case 'W': 
      case 'w': 
       modFlags[2] = true; 
       flag = true; 
       break; 

      case 'L': 
      case 'l': 
       modFlags[3] = true; 
       flag = true; 
       break; 

      case 'I': 
       System.out.print("sd"); 
       fileName = updateFileName(sc, fileName); 
       flag = true; 
       break; 
      case 'i': 
       fileName = updateFileName(sc, fileName); 
       flag = true; 
       break; 

      case 'O': 
      case 'o': 
       break; 

      case 'D': 
      case 'd': 
       break; 

      case 'M': 
      case 'm': 
       modeBoth = true; 
       flag = true; 
       break; 

      case 'H': 
      case 'h': 
       showMenu = false; 
       flag = true; 
       break; 

      default: 
       System.out.println("Unknown Option."); 
       System.out.print("Enter action: "); 
       sc.next(); 
       break; 
       // flag = false; 
     } 

    } 
+1

어디에서'endChar'를 업데이트합니까? 루프를 돌 때마다 업데이트해야합니다. 너 지금 그걸 놓치고있어. –

+0

한 문자가 다른 메서드 (promptMenu)에서 반환되고 endChar에 할당됩니다. 그게 끝 문자를 업데이 트하지 않는 이유는 그것이 다시 같은 문자를 인쇄 계속하지만 나는 그 안에 다른 모든 것을 인쇄 promptMenu 메서드를하지 않고 endChar를 업데이 트하는 방법을 잘 모르겠다. – JRob

답변

1

당신이, 당신의 while 루프의 맨 처음에 단지 continue;를 사용하여 스위치 문의 기본 경우에 값 부분이 당신을 다시 가져 스캔을 이동하는 것이 좋습니다 제공하는 것에 기반 해 주셔서 감사합니다 while 루프의 시작 부분. 이렇게하면 코드를 다시 작성하지 않고 입력 값을 다른 값으로 읽습니다. 스위치의 아래쪽에

sc.next(); 

while(!flag){ 
     System.out.print("Enter action: "); 
     endChar = sc.next().charAt(0); 
     switch (endChar) { 
     case 'T': 
     case 't': 
      modFlags[0] = true; 
      flag = true; 
      break; 
     case 'P': 
     case 'p': 
      modFlags[1] = true; 
      flag = true; 
      break; 

     case 'W': 
     case 'w': 
      modFlags[2] = true; 
      flag = true; 
      break; 

     case 'L': 
     case 'l': 
      modFlags[3] = true; 
      flag = true; 
      break; 

     case 'I': 
      System.out.print("sd"); 
      fileName = updateFileName(sc, fileName); 
      flag = true; 
      break; 
     case 'i': 
      fileName = updateFileName(sc, fileName); 
      flag = true; 
      break; 

     case 'O': 
     case 'o': 
      break; 

     case 'D': 
     case 'd': 
      break; 

     case 'M': 
     case 'm': 
      modeBoth = true; 
      flag = true; 
      break; 

     case 'H': 
     case 'h': 
      showMenu = false; 
      flag = true; 
      break; 

     default: 
      continue; 
    } 

} 
+1

난 그냥 중간에 코멘트 이것을 고치기 위해 편집 할 때이 점이 무엇이 잘못되었는지를 알려줍니다. 좋은 대답, 그리고 내 upvote의 가치. –

+0

그래, 코드 붙여 넣기로 알았어. 고마워. OP는 원래 스캐너의 입력을 사이드 바로 호출 한 곳이면 어디에서나 제거 할 수 있습니다. – Mark

1

변경 당신이 현재하고있는 모두가 Scanner에서 String를 검색하고 그것으로 아무것도하지 않기 때문에

endChar = sc.next().charAt(0); 

합니다. 루프의 다음 반복에서 endChar의 값을 다르게하려면 String의 문자를 endChar에 할당해야합니다.