2012-09-22 7 views
2

가능한 중복 사용 방법 :
How do I compare strings in Java?자바 : switch 문을

내가 자바의 switch 문을 사용하는 방법을 이해하는 데 문제가 있어요. case 문 중 하나에서 메서드를 실행 한 후에도 여전히 기본 문으로 이동하여 실행합니다. 코드는 다음과 같습니다.

Scanner scanner = new Scanner(System.in); 
String option = null; 

while (option != "5") { 
    ShowMenu(); 
    option = scanner.nextLine(); 
    switch (option) { 
     case "1": ViewAllProducts(); break; 
     case "2": ViewProductDetails(scanner); break; 
     case "3": DeleteProduct(scanner); break; 
     case "4": AddProduct(scanner); break; 
     case "5": break; 
     default: System.out.println("Invalid option. Please try again."); break; 
    } 
} 

위의 코드는 기본 방법입니다. 예를 들어 사례 "4"를 실행 한 후 "잘못된 옵션"을 인쇄합니다.

+1

'while (! "5". equals (option)) {}' – adatapost

+0

와우 여야합니다. 모두들 고마워요 .. C# 코더가되어 주셔서, 이것은 매우 이상합니다. C#에서는이 문제가 없습니다. 위의 내용은 전혀 문제가되지 않습니다. 매우 흥미로운 LOL. – Matt

+0

문제는 참조 평등 대 값의 동일성이며 C#에도이 문제가 있지만 다행스럽게도 C#의 String은 '=='연산자를 오버로드합니다. – Premraj

답변

1

내가 새로운 옵션을 읽기 전에 다시 초기화 스캐너 참조하는 코드를 수정하고 .. 당신은 당신의 코드를 약간 변경하고, 바람직하게는 필요한 출력을 얻기 위해 할-동안 사용할 수 있다고 생각합니다. .

Scanner scanner = new Scanner(System.in); 
    String option = null; 

    ShowMenu(); 
    option = scanner.nextLine(); 

    while (!"5".equals(option)) { 
     switch (option) { 
      case "1": ViewAllProducts(); break; 
      case "2": ViewProductDetails(scanner); break; 
      case "3": DeleteProduct(scanner); break; 
      case "4": AddProduct(scanner); break; 
      case "5": break; 
      default: System.out.println("Invalid option. Please try again..."); break; 
     } 
     ShowMenu(); 
     scanner = new Scanner(System.in); // Add this here 

     option = scanner.nextLine(); // Use brand new scanner without any problem.. 
    } 

나머지, 당신은

+0

다른 답변과 의견에 대해 설명해 주셔서 감사합니다. – Matt

+0

@Matt. 환영합니다 :) –

+0

주의 : 새로운 스캐너를 만들어야하는 이유 *를 이해하지 못하는 경우, 이것은 단지 "부두 프로그래밍"입니다. –

6

당신은 (대신 값의 참조를 비교하는 - use equals method for value equality)를 당신의 동안 조건에 ==로 문자열을 비교하는 루프로 변경해야하지만, 다음 -

그것은 운영자 동안 완벽 인해 operator overloading C#으로 작동
while (!option.equals("5")) 

오버로드가 not allowed in java입니다 ("+하는 것은"문자열과 숫자에 대한 과부하하지만) 문자열

+0

정답을 주셔서 감사합니다. 그러나 이유를 설명해 주시면 도움이 될 것입니다. 그래서 첫 번째로 +1 하겠지만 사미르는 "대답"으로 표기됩니다 – Matt

+0

@Matt - 괜찮습니다 .. 나는 여전히 설명을 추가했습니다. – Premraj

+0

제 편집을 참조하십시오. 아직 해결되지 않았습니다. – Matt

7
while (!option.equals("5")){...} 

사용 .equals() 비교.

== 문자열 refrences (메모리 위치) .equals() 내가 문제가있는 동안 루프의 상태에 생각 문자열 값

1

비교. while(!"5".equals(option))으로 조건을 변경 한 다음 문제를 실행 해보십시오.

희망이 도움이됩니다.

1

귀하의 스캐너 .nextLine()은 잠시 동안 사용하지 않아야합니다. 그리고 일반적으로 스위치 케이스와 함께 사용하는 것이 더 낫습니다 .. 그럼, 함께 갈 수 있습니다. ..

사용자가 독서를 할 때 스위치 케이스를 사용하는 것이 일반적입니다. 이 - 알

boolean flag = false; 
do { 
    String option = scanner.nextLine(); 
    switch (option) { 
     case "1": break; 
     case "2": break; 
     default : flag = true; 
        break; 
    } 
} while(! flag); 

그리고 하나 중요한 것은 : - 문자열은 자바 문자열 비교에 대한 자바 ..

일반적으로 불변이다, 당신은 당신이 경우 등호() 함수를 사용한다 그들의 가치를 비교하고 싶습니다. 그리고 또한,이 equ를 재정의 할 것을 제안합니다. 클래스의 두 인스턴스를 비교하기 위해 클래스의 als() 및 hashcode() 메서드를 사용합니다 (나중에 만들 경우).

실제로 ==와 equals() 사이에는 큰 차이가 있습니다. 실제로 문자열을 만드는 방법에 따라 달라집니다. 예 :,이 코드를 가정하자 : - 위의 코드에서

String a = "5"; 
String b = new String("5"); 
String c = "5"; or String c = a; 

System.out.println("a == b?" + (a == b)); // Will Print false 
System.out.println("a.equals(b)?" + a.equals(b)); // Will Print true.. 

System.out.println("a == c?" + (a == c)); // Will Print true 
System.out.println("a.equals(c)?" + a.equals(c)); // Will Print true.. 

를, 당신의 문자열 참조 'A'와 'C'는 "5"로 표현 같은 객체를 가리키고있다. "새로운"연산자를 사용하여 문자열을 만들 때 항상 새로운 객체를 만들기 때문에 참조 "b"가 다른 객체 "5"를 가리키는 반면,

이제 == 연산자은 두 문자열 참조 등호() 함수는 두 개의 스트링 객체에 포함 된 실제 값을 비교 ..

반면, 동일한 객체 또는 다른 비교 점 인 것은 그래서 프로그램의 출력은 이제 .. 은 방금 설명 명백 할 것이다 이것은 당신의 "옵션"참조가 "5"와 같은 값을 가지고 있는지를 확인하기 위해 equals() 함수를 사용해야하기 때문입니다.

는 지금, 나는

+0

감사합니다. 나는 당신의 솔루션을 시험해 볼 것입니다. – Matt

0

나는에 새로운 각 기능에 스캐너를 통과 중단하고 만든 .. 사용자 입력을 읽기 위해 다양한 방법의 차이를 알고, 내가 제공된 링크에서 읽을 수 있습니다 대신에 각 함수 안에. 문제가 해결되었습니다. 그래서, 그 문제를 알아 냈습니다.하지만 이유를 알고 싶습니다.

SSCE를 게시 한 경우 그 질문에 대답 할 수 있습니다. 불행히도, 당신이 묘사하는 행동은 우리에게 보여주지 않은 코드와 관련이 있습니다.

이것은 자바 또는 정상적인 버그입니까?

매우있을 수 있음 이것은 Java 버그입니다. Scanner 코드는 몇 년 동안 Java로 작성되었으며 중요한 버그는 이전에 발생하여 수정되었을 가능성이 큽니다.

반면에 Scanner을 메서드로 전달하면 아무런 차이가 없다고 생각할 수 있습니다. 그 자체는입니다.

그러나 결론은 SSCE가 없으면 코드가 실제로 무엇을하고 있는지 파악할 수없고 근본 원인을 설명 할 수 있다는 것입니다.

내가 왜 이것이 문제가되는지 이해할 수 있다면 나중에 다른 클래스와 함께 피할 수 있습니다.이 문제가 Scanner에서만 발생하지 않는다면?

SSCE가 없으면 이해할 수 없습니다.

관련 문제