Предупреждения «Условие всегда ‘true'» и «Индекс массива выходит за пределы»

#java #android #android-studio #for-loop #indexoutofboundsexception

#java #Android #android-studio #для цикла #исключение indexoutofboundsexception

Вопрос:

Я пытаюсь разработать свое первое приложение для Android с использованием Android studio и получаю пару предупреждений, от которых, похоже, не могу избавиться во внутреннем конструкторе класса:

  1. В цикле for он предупреждает, что условие завершения всегда истинно. Однако этот wanring отображается только для внутреннего col цикла for, а не для внешнего row цикла for.
  2. При назначении grid[row][col] он предупреждает, что индекс массива [row] выходит за рамки, но не о том, что индекс [col] есть.

Я не понимаю, почему предупреждения вообще появляются, учитывая, что код, похоже, выполняется по назначению, но также и почему предупреждения появляются только для одного цикла for и одного индекса, когда, конечно, любая проблема также применима к другому? Любая помощь очень ценится!


 private class MyInnerClass {
    private final Character UNKNOWN = '.';

    // State data
    private String id;
    private Integer grid_size;
    private final Character[][] grid;

    // Constructor
    public MyInnerClass(String id, Integer grid_size) {
        // Check the grid size is in the permitted range
        String[] permitted_grid_sizes = getResources()
                .getStringArray(R.array.permitted_grid_sizes);
        int min_permitted_grid_size = Integer
                .parseInt(permitted_grid_sizes[0]);
        int max_permitted_grid_size = Integer
                .parseInt(permitted_grid_sizes[permitted_grid_sizes.length - 1]);
        if ((grid_size < min_permitted_grid_size) || (grid_size > max_permitted_grid_size)) {
            throw new IllegalArgumentException(
                    "specified grid size ("   grid_size   ") out of range");
        }

        // Initialise metadata
        this.id = id;
        this.grid_size = grid_size;

        // Initialise a blank grid
        this.grid = new Character[this.grid_size][this.grid_size];
        for (int row = 0; row < this.grid_size; row  ) {
            for (int col = 0; col < this.grid_size; col  ) {        // Gives warning "Condition 'col < this.grid_size' is always 'true'"
                this.grid[row][col] = UNKNOWN;                      // Gives warning "Array index is out of bounds" on [row]
            }
        }
    }

    ...
}
 

Комментарии:

1. Сохраняется ли проблема при перезапуске Android Studio? На первый взгляд кажется, что это проблема с их стороны

2. Похоже, это ошибка в Android Studio. Изменение поля grid_size с private Integer grid_size; на private int grid_size; удаляет предупреждение.

Ответ №1:

Я считаю, что проблема связана с вводом переменных. Поле grid_size имеет класс Integer, и вы сравниваете его с row и col которые имеют примитивный тип ‘int’.

grid_size == row сравнивает ссылку со значением.

Вероятно, происходит то, что ваша среда IDE обнаруживает эту проблему, но выдает вам неточные предупреждения.

Если вы перейдете grid_size на примитивный тип int , предупреждения должны исчезнуть.