Почему я должен инициализировать переменную? - PullRequest
1 голос
/ 16 февраля 2020

Мой код проверяет, имеет ли данная строка определенный формат. Первый символ строки должен быть заглавной буквой, а остальная часть строки должна быть любым числом от 1 до данного измерения.

Если первый символ строки содержит строку из алфавита массив, тогда код проверяет, содержит ли остальная часть числа число из массива чисел. Чтобы быть действительной координатой, оба условия должны быть истинными, если одно из них является ложным, оно не является действительной координатой. Я хочу вернуть логическое значение isValidCoordinate, но, тем не менее, IntelliJ говорит мне, что мне нужно инициализировать координату isValid. Почему я должен его инициализировать, логическое выражение зависит от условий «если».

Спасибо.

public static boolean validCoordinate(String coordinate, int dimension) {
        boolean isValidCoordinate;
        String [] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        int [] numbers = new int [dimension];
        int one = 1;
        for(int i = 0; i < dimension; i++){
            numbers[i] = one + i;
        }
        for(int i = 0; i < dimension; i++){
            if((Character.toString(coordinate.charAt(0))).contains(alphabet[i])) {
                for(int j = 0; j < dimension; j++) {
                    if ((coordinate.substring(1)).contains(Integer.toString(numbers[j]))) {
                        isValidCoordinate = true;
                    }
                    else {
                        isValidCoordinate = false;
                    }
                }

            }
            else {
                isValidCoordinate = false;
            }

        }

        return isValidCoordinate;
    }

Это мой окончательный код:

public static boolean validCoordinate(String coordinate, int dimension) {
        boolean isValidCoordinate;
        String [] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        int [] numbers = new int [dimension];
        int one = 1;
        for(int i = 0; i < dimension; i++){
            numbers[i] = one + i;
        }
        for(int i = 0; i < dimension; i++){
            if((Character.toString(coordinate.charAt(0))).contains(alphabet[i])) {
                for(int j = 0; j < dimension; j++) {
                    if ((coordinate.substring(1)).contains(Integer.toString(numbers[j]))) {
                        isValidCoordinate = true;
                    }
                    else {
                        isValidCoordinate = false;
                    }
                }

            }
            else {
                isValidCoordinate = false;
            }

        }

        return true;
    }

Ответы [ 3 ]

3 голосов
/ 16 февраля 2020

Все случаи внутри for l oop покрыты, но не случай, когда dimension равен 0.

Метод будет go прямо к return isValidCoordinate;, где переменная еще не инициализирован.

2 голосов
/ 16 февраля 2020

Вполне возможно, что ваш для l oop никогда не будет введен (например, если dimension == 0). В этом случае вы никогда не будете присваивать значение isValidCoordinate, но попытаетесь вернуть значение этой переменной в последнем выражении вашего метода.

Каково будет значение isValidCoordinate в в таком случае?

Это не будет иметь никакого значения.

Поэтому компилятор заставляет вас присвоить начальное значение isValidCoordinate, чтобы убедиться, что оно имеет значение до к нему обращаются.

РЕДАКТИРОВАТЬ:

После ваших комментариев я предлагаю вам исключить переменную boolean и использовать вместо нее операторы возврата:

public static boolean validCoordinate(String coordinate, int dimension) {
    String [] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    int [] numbers = new int [dimension];
    int one = 1;
    for(int i = 0; i < dimension; i++){
        numbers[i] = one + i;
    }
    for(int i = 0; i < dimension; i++){
        if((Character.toString(coordinate.charAt(0))).contains(alphabet[i])) {
            for(int j = 0; j < dimension; j++) {
                if ((coordinate.substring(1)).contains(Integer.toString(numbers[j]))) {
                    return true;
                }
            }
        }
    }

    return false;
}

Таким образом, вы не нужно беспокоиться о разрыве вложенных циклов, когда для переменной boolean установлено значение true.

0 голосов
/ 16 февраля 2020
import java.util.regex.*;

public static boolean validCoordinate(String coordinate, int dimension)
{
    Pattern p = Pattern.compile("[A-Z]+");
    Matcher m = p.matcher(coordinate);
    return m.matches();
}
...