2013-03-24 5 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."); 
     } 
    } 
} 

EDIT: Я попробовал, если заявление будучи

if (isPalindrome == true) 

и

if (isPalindrome) 

В обоих случаях Eclipse, говорит "Локальная переменная isPalindrome не может быть инициализирован," в этом если состояние.

FINAL EDIT:

С тех пор я двинулся дальше, и переписать этот код, однако я просто вернулся и сосредоточил свой исходный код, если кто-то еще смотрит на это.

Я инициализируется isPalindrome в начале кода:

Boolean isPalinddrome = True;

Я изменил условие-петли для:

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

Наконец я изменил if (isPalindrome = true) на if (isPalindrome)

+0

посмотрите на условия yoda, чтобы предотвратить эту ошибку. –

ответ

5

if (isPalindrome = true) должно быть if (isPalindrome == true) (или if (isPalindrome) лучше! На самом деле эта ошибка еще одна причина, почему бы не спрашивать, если someBoolean == true что плохой стиль)

Введя if (isPalindrome = true) вы присваиваете, опять же, значение true переменной isPalindrome. И поскольку вы только присваиваете ему значение, компилятор предупреждает вас о неиспользуемой переменной.

Это также хорошо знать это:

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

На самом деле это должно быть 'if (isPalindrome)' 'isPalindrome' уже имеет логическое значение, дополнительное сравнение не требуется. –

+1

Действительно. Я просто хотел, чтобы он знал, что при сравнении он должен использовать '=='. (Я отредактировал ответ для booleans) – Maroun

2

Вы должны определить некоторое логическое значение до isPalindrome в области main.

Например:

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, выполняется только настоящий блок, и компилятор видит, что isPalindrome никогда не имеет значения.

Теперь у вашего класса есть некоторые логические недостатки и некоторые программные ловушки.

  1. Если первый и последний символы не равны, то для isPalindrome установлено значение false, а затем программа продолжается. Вырваться из цикла; не позволяйте isPalindrome быть установленным на true позже. Кстати, ваша версия действительно заботится только о первом и последнем персонажах.
  2. Не пишите if (x == true). Просто напишите if (x).
  3. Не называть ваш логический isAnything. В конце концов, вы можете сделать это в классе JavaBean, а затем вы получите метод с именем isIsAnything или getIsAnything. Это раздражает ваших читателей.
  4. В будущем не записывайте весь свой код в методе main(String[]). Попросите основной метод использовать аргументы для построения экземпляра класса и использовать этот экземпляр. Таким образом, вы можете написать модульные тесты для класса; вы не можете для главного. Вы можете разбить код на несколько методов. Один проверяет наличие палиндрома, в то время как другой обеспечивает удобочитаемый результат.
  5. На самом деле это плохая идея использовать формы без аргументов String.toLowerCase() и String.toUpperCase(). В один прекрасный день вам может потребоваться написать интернационализированное приложение, и вам придется иметь дело с турецким языком. Вы можете в конечном итоге бормотать себе: «Какая чертовщина бесцеремонна?»
  6. Не используйте i и j как имена переменных здесь. Используйте имена, которые показывают цель переменной. Что-то вроде:

    для (INT запуска = 0, конец = phraseLetters.length - 1, начать < конец, начать ++, end--) { ... }

В конце концов, когда start проходит end, вы просто повторяетесь.

+0

Спасибо за советы. Теперь я понимаю ошибку с знаком =, но теперь Eclipse говорит: «Локальная переменная isPalindrome, возможно, не была инициализирована» в последнем условии if. – Ferret9

+0

Это потому, что цикл for не гарантирует ничего. Если строка пуста, цикл будет пропущен, поэтому isPalindrome никогда не будет установлен ни на что. Инициализировать его как истину; в конце концов, пустая строка - тривиальный палиндром. –

0

Здесь есть ошибка и плохая практика.

плохая практика не инициализировать variabale:

boolean isPalindrome = true; 

alththough всех примитивов в Java имеет значение по умолчанию (для булева этой лжи) это все-таки всегда лучше инициализировать в varibale явно в целях повышения кода.

ошибка находится в, если п:

if (isPalindrome = true) { 

в этой строке вы назначаете значение и не проверяя variabale, вся распайка вернуть значение присваивания означает, что это выражение всегда возвращает истину , Из-за этого ваш код всегда возвращает истину.

+0

Переменные экземпляра инициализируются, как вы говорите, но локальные переменные метода, выделенные в стеке, не являются. –

Смежные вопросы