Проблема с областью видимости локальных переменных и условных выражений - PullRequest
1 голос
/ 24 июня 2009

Я пытаюсь построить метод, который возвращает логическое значение:

public boolean isStringValid(String s){
    boolean isValid;
    String temp = null;     
    // only combinations of 'A','B','C' are allowed
    for (int i = 0; i < s.length(); i++)
    {
        temp = s.substring(i, i+1);
        if (temp.equals("A")|temp.equals("B")|temp.equals("C")){
            isValid= true;
        }else{
            isValid= false;
        }
    }   
    return isValid;
}

Но я получаю сообщение об ошибке компилятора о том, что "локальная переменная isValid, возможно, не была инициализирована".

То, что я пытаюсь сделать, это взять строку и проверить каждую букву, если в строке найдена любая буква, отличная от A, B или C, метод isStringValid должен вернуть false. Только после того, как каждая буква будет проверена и определена, что она является A, B или C, метод может вернуть true.

Полагаю, у меня возникли проблемы с определением области действия локальных переменных. Каков подходящий способ возврата метода из блоков if / else? Если это невозможно, что бы вы посоветовали, это лучший способ создать это?

Спасибо в авданс С наилучшими пожеланиями

Ответы [ 6 ]

10 голосов
/ 24 июня 2009

Что произойдет, если вы получите пустую строку в качестве аргумента?

Компилятор должен быть уверен, что вы всегда что-то возвращаете. Инициализируйте переменную isValid значением false, таким образом, если метод получит пустую строку, он просто вернет значение по умолчанию .

boolean isValid = false;

В Java вы не можете вернуть переменную, которая не может быть инициализирована, просто убедитесь, что во всех возможных потоках переменная установлена ​​с любым значением.

ОБНОВЛЕНИЕ: Это решит ваш вопрос, но я предлагаю вам взглянуть на ответы ниже, потому что логика вашего метода неверна

2 голосов
/ 24 июня 2009

Метод неправильный (кроме ошибки компилятора, которую объяснил Виктор). Если последняя буква - C, а все остальное - D, она вернет true. Кроме того, вы должны использовать символ, и вам нужно два бара (||) для логического или. Попробуйте:

public boolean isStringValid(String s){             
            // only combinations of 'A','B','C' are allowed
            for (int i = 0; i < s.length(); i++)
            {
                    char tempChar = s.charAt(i);
                    if (!(tempChar == 'A' 
                       || tempChar == 'B' 
                       || tempChar == 'C'))
                        return false;
            }       
            return true;
}

Если вы хотите вернуть false для пустых строк, сделайте это в начале:

if(s.length() == 0)
  return false;
2 голосов
/ 24 июня 2009

Возможно, for может фактически не зацикливаться. поэтому isValid не установлено.

0 голосов
/ 25 июня 2009

Обратите внимание, что ваш цикл будет возвращать только true или false в зависимости от последнего символа в вашей строке. То, что вы хотите сделать, это что-то вроде

public boolean isStringValid(String s) {
  for (char c : s.toCharArray()) {
    if (!('A' == c || 'B' == c || 'C' == c)) { 
      return false;
    }
  }       
  return true;
}
0 голосов
/ 24 июня 2009

Я согласен с ответами, в которых говорится, что вам следует инициализировать логическую переменную isValid.

Однако вы можете делать то, что хотите, с помощью регулярного выражения

/*
* returns false if s contains a character different from 'a' 'b' or 'c' 
*/
public boolean isStringValid(String s){
     return !Pattern.matches("($^|[^abc]+)",s);
}

[abc] означает, что вы проверяете, содержит ли s символ «a», «b» или «c»

[^ abc] означает, что вы проверяете, содержит ли s символ, который не является ни одним из 'a', 'b' или 'c'.

[^ abc] + означает, что вы проверяете, содержит ли s хотя бы один символ , который не содержит ни a, ни b, ни c.

$ ^ Означает пустые строки

0 голосов
/ 24 июня 2009

Переменная isValid является локальной переменной. В спецификации языка Java:

Локальная переменная (§14.4, §14.13) должна получить явное значение перед используется при любой инициализации (§14.4) или присвоение (§15.26), в способ, который может быть проверен компилятор использует правила для определенных назначение.

См. Раздел 4.5.5 Начальные значения переменных в спецификации языка Java:

http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html

Инициализируйте переменную false, чтобы начать с нее, а затем установите только значение true в правильной части вашего метода, т.е. здесь:

if (temp.equals("A")|temp.equals("B")|temp.equals("C")){
   isValid = true;
}

Удалите оператор else и дайте методу вернуться в нормальном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...