Вы создаете массив булевых, не булево, и вы пытаетесь использовать его перед заполнением его с булевыми объектами, так что это не должно быть сюрпризом, что это будет бросить NPE.
Решения:
- Создать массив булевых и если инициализирован, он будет заполнен по умолчанию ложных значений.
- Создайте массив логических, если вы должны (например, если используете в JTable-модели), но убедитесь, что каждый элемент инициализирован действительным экземпляром Boolean перед использованием массива.
например, изменение от
Boolean[] bool = new Boolean[5];
к
boolean[] bool = new boolean[5];
или
Boolean[] bool = {Boolean.FALSE, Boolean.FALSE, Boolean.FALSE,
Boolean.FALSE, Boolean.FALSE};
Edit
Пожалуйста, поймите, что boolean является примитивным типом, и если логическая переменная явно не инициализирована, ей не присваивается значение, по умолчанию она равна false.
Boolean, с другой стороны, является ссылочным типом, который «блокирует» логическое значение, предоставляет ссылочную переменную, которая может использоваться вместо булевского примитива, где требуются ссылки, например, в коллекциях. Булева переменная, как и для всех ссылочных типов, по умолчанию имеет значение null, если явно не назначено экземпляру.
Edit 2
Обратите внимание, что если вы используете строки, вы столкнетесь с той же проблемой. Например
String unAssigned;
if (unAssigned.equals("foo") {
System.out.println("the method above throws a NPE");
}
или
String[] strings = new String[5];
// all the strings items above are null
Edit 3
Вы задаетесь вопросом, почему это не сделать то же самое: String s = new String();
- Вы создание новый объект String и присвоение его переменной
s
, поэтому s не является нулевым.
- С булевым массивом да, вы назначаете новый массив переменной, поэтому массив не является нулевым, но элементы, хранящиеся в массиве, равны нулю.
- Вы не используете массив строк в любом месте, так что это не где-то рядом с тем же. Давай, давайте сравним яблоки с яблоками, а не яблоками с апельсинами.
- Как в стороне, вы почти никогда не должны использовать
new String()
, поскольку он обходит пул строк и может привести к неэффективному коду с ненужным созданием дополнительных объектов String.
@Teo: Спасибо за ваши ответы, а также .. – user1050619