2013-03-24 3 views
0

입력 된 단어가 회문인지 아닌지를 테스트하려고합니다 (앞뒤 철자가 같음). 내가 볼 수있는 것부터는 작동하지만 Eclipse는 "로컬 변수 isPalindrome의 값은 사용되지 않습니다"라고 말하지만 사용됩니다. 문제는 단어가 회문이 아니더라도 그것이라고 말합니다.로컬 변수가 사용되지 않습니다.

import java.util.Scanner; 

public class Palindrome { 
    public static void main(String[] args) { 
     String phrase; 
     char[] phraseLetters; 
     int endChar; 
     boolean isPalindrome; 

     Scanner input = new Scanner(System.in); 
     System.out.println("Enter a word or phrase."); 
     phrase = input.nextLine(); 
     input.close(); 

     phrase = phrase.toLowerCase(); 
     phrase = phrase.replaceAll(" ",""); 
     phraseLetters = phrase.toCharArray(); 

     endChar = phraseLetters.length - 1; 

     for (int i = 0; i < phraseLetters.length; i++) { 
      if (phraseLetters[i] != phraseLetters[endChar]) { 
       isPalindrome = false; 
      } else { 
       isPalindrome = true; 
       endChar -= 1; 
      } 
     } 

     if (isPalindrome = true) { 
      System.out.println("This word or phrase entered is a palindrome."); 
     } else { 
      System.out.println("This word or phrase is not a palindrome."); 
     } 
    } 
} 

편집 : 나는이에 "지역 변수 isPalindrome가 초기화되지 않았을 수 있습니다"이클립스는 말한다 두 경우 모두

if (isPalindrome == true) 

if (isPalindrome) 

을되는 경우 문을 시도 조건 일 경우.

최종 편집 : 이후에 이동하고,이 코드를 다시 한

그러나 나는 그냥 가서 사람이 여전히이 보이는 경우 내 원래의 코드를 수정했습니다.

for (int i = 0; (i < phraseLetters.length) && (isPalindrome); i++)

마지막으로 내가 if (isPalindrome)

+0

이 오류를 방지하기 위해 yoda 조건을 살펴보십시오. –

답변

5
if (isPalindrome = true) 변경 : Boolean isPalinddrome = True;

내가에 대한 루프 조건을 변경 :

나는 코드의 시작 부분에 isPalindrome 초기화

if (isPalindrome = true)은 0이어야합니다.(또는 if (isPalindrome)! 사실이 오류는 변수 isPalindrome에 다시 값 true을 할당하고 if (isPalindrome = true)을 입력하여 나쁜 스타일)

입니다 someBoolean == true 묻는하지 왜 또 다른 좋은 이유입니다. 그리고 값을 할당하기 만하면 컴파일러에서 약 사용하지 않는 변수에 대해 경고합니다.

그것은이를 아는 것도 좋다 : 그래서

At run time, the result of the assignment expression is the value of the variable after the assignment has occurred. The result of an assignment expression is not itself a variable.

, 당신이 만약 조건이 항상 만족 다음 if (isPalindrome = true)을 수행 할 때.

+1

실제로'is (isPalindrome)''isPalindrome'이 이미 불리언 값을 가지고 있다면 여분의 비교는 불필요합니다. –

+1

실제로. 나는 단지 그가 비교할 때'=='를 사용해야한다는 것을 알고 싶었다. (나는 부울에 대한 답을 편집했다) – Maroun

2

main 범위의 부울 값을 isPalindrome으로 지정해야합니다. 예를 들어

:

boolean isPalindrome = true 
+1

이해가 가지 않는다 ... – Darwind

+0

네가 맞아. 죄송합니다. –

+1

사실, 그것은 다소 의미가 있습니다 ...OP가 끝 부분에서 잘못된 할당으로 사례를 수정하면 (테스트 대신 true를 지정하는 경우) 그는 "Palindrome.java:30 : 변수 isPalindrome이 초기화되지 않았을 수 있습니다"라는 새로운 오류로 실행됩니다. 그 이유는 for 루프를 입력하지 않으면 초기화되지 않기 때문입니다. – Fredrik

1

당신은 오타가 있습니다. 경우 조건에서

if (isPalindrome = true) 
{ 
    System.out.println("This word or phrase entered is a palindrome."); 
} 
else 
{ 
    System.out.println("This word or phrase is not a palindrome."); 
} 

봐. == 대신 =를 사용했습니다. 따라서 isPalindrome을 true로 설정하면 true 블록 만 실행되고 컴파일러에서는 isPalindrome이 중요하지 않은 것으로 간주합니다.

이제 클래스에 몇 가지 논리 결함과 프로그래밍 트랩이 있습니다. 첫 번째와 마지막 문자가 동일하지 않은 경우

  1. , isPalindrome false로 설정 한 다음 프로그램은 계속됩니다. 루프에서 벗어나십시오. isPalindrome을 나중에 true으로 설정하지 마십시오. 덧붙여서, 귀하의 버전은 처음과 마지막 문자에 대해서만 실제로 관심이 있습니다.
  2. if (x == true)을 쓰지 마십시오. if (x)으로 작성하십시오.
  3. 부울을 isAnything으로 지칭하지 마십시오. 결국 자바 빈즈 클래스에서이 작업을 수행 할 수 있으며, isIsAnything 또는 getIsAnything이라는 메소드로 끝납니다. 이것은 독자들을 귀찮게 할 것입니다.
  4. 나중에 모든 코드를 main(String[]) 메서드로 작성하지 마십시오. main 메소드가 인수를 사용하여 클래스의 인스턴스를 구성하고 해당 인스턴스를 사용하게하십시오. 이렇게하면 클래스에 대한 단위 테스트를 작성할 수 있습니다. 당신은 메인을위한 수 없습니다. 코드를 몇 가지 방법으로 나눌 수 있습니다. 다른 하나는 사람이 읽을 수있는 결과물을 제공하는 반면, 하나는 회문이되는 것을 확인합니다.
  5. String.toLowerCase()String.toUpperCase()의 인수가없는 형식을 사용하는 것은 실제로 바람직하지 않습니다. 언젠가는 국제화 된 응용 프로그램을 작성해야 할 수도 있습니다. 그러면 터키어 로캘을 처리해야합니다. "도대체 무슨 점이 없습니까?"
  6. ij을 변수 이름으로 사용하지 마십시오. 변수의 목적을 나타내는 이름을 사용하십시오. 뭔가 같은 : 대한

    (INT 시작 = 0, 끝 = phraseLetters.length - 1; < 끝을 시작, 시작 ++, end--) 결국 { ... }

startend으로 전달됩니다.

+0

팁 주셔서 감사합니다. 나는 이제 = 기호로 실수를 인식하지만, 이제 Eclipse는 최종 if 조건에서 "로컬 변수 isPalindrome이 초기화되지 않았을 수 있습니다."라고 말합니다. – Ferret9

+0

왜냐하면 for 루프는 아무 것도 할 수 없기 때문입니다. 문자열이 비어 있으면 루프가 건너 뜁니다. 따라서 isPalindrome은 절대로 아무것도 설정되지 않습니다. 사실로 초기화하십시오. 결국, 빈 문자열은 하찮은 회문입니다. –

0

여기에 오류가 있으 십니다. 이 순서 향상에 명시 적으로 varibale을 초기화하기 위해 여전히 항상 더 나은 자바 (부울 것이 거짓) 기본값이 모든 프리미티브 alththough

boolean isPalindrome = true; 

:

나쁜 관행는 variabale를 초기화하지 않는 것입니다 코드 이식성.

if (isPalindrome = true) { 

이 줄은 값을 할당하고 variabale을 확인하지, 모두의 할당은이 표현이 항상 true를 돌려줍니다 것을 의미 할당의 값을 반환에 :

오류는 경우 절에 . 이 때문에 항상 코드가 다시 실행됩니다.

+0

인스턴스 변수는 말한대로 초기화되지만 스택에 할당 된 메서드 로컬 변수는 초기화되지 않습니다. –