Решение проблемы с поиском ошибки «переменная не может быть инициализирована»

1

Моя программа Java принимает входные данные от пользователя в командной строке. У пользователя есть выбор: он может указать файл с открытым текстом в качестве ввода с опцией -inputfile, или он может оставить эту опцию неуказанной, и в этом случае программа вводит данные из System.in. (Я наблюдал это поведение в некоторых программах, которые поставляются предварительно с моим дистрибутивом Ubuntu, поэтому я считаю, что это приемлемая практика.)

Поэтому я inBR BufferedReader (inBR), который читает из файла, если он есть, и Scanner (inScanner), который читает из System.in противном случае. Только один из этих объектов фактически создается, а другой остается нулевым. Позже, когда программа считывает строку из ввода, у меня есть следующий код:

String line;
if (inBR != null) {
    line = inBR.readLine(); (1)
} else {
    line = inScanner.nextLine(); (2)
}

Который дает мне variable inBR might not have been initialized времени ошибки компиляции variable inBR might not have been initialized и variable inScanner might not have been initialized в строках (1) и (2) соответственно.

Какое приемлемое решение здесь? Я подумал, "инициализируйте переменную, которая должна быть пустой как объект, чтобы заткнуть компилятор". Но это всего лишь взломать; конечно, лучший способ.

Кроме того, почему это исключение во время выполнения, как исключение NullPointerException?

EDIT: inScanner.readLine() => inScanner.nextLine()

  • 0
    Я думаю, что вам нужно показать нам больше кода, например, где вы инициализируете inBR и inScanner
  • 3
    Инициализируйте их, чтобы обнулить, когда вы объявляете их.
Показать ещё 1 комментарий
Теги:

3 ответа

4
Лучший ответ

Объявление их таким образом позволило бы избежать ошибки компиляции:

BufferedReader inBR = null;
Scanner inScanner = null;

Конечно, вы все равно должны дать им фактические значения перед их доступом, или вы получите NullPointerException.

  • 0
    Ух ты, я тупой. Хорошо. Благодарю. Я видел другие ответы типа SO и предположил, что они почему-то не работают в моем случае. «Инициализированный» означает, что указатель на объект создан, даже если этот указатель указывает на ноль?
  • 1
    @Mickeysofine В Java это называется ссылкой (не указателем), но да, это означает, что ссылка инициализирована, и ее можно инициализировать нулем.
1

В java все используемые переменные должны быть инициализированы в какой-то момент.

public void example(){
  String name;

  if(name == null) return null;

}

В приведенном выше примере имя переменной не было инициализировано. Существует несколько способов решения этой проблемы:

public void example1(){
  String name = null;

  if(name == null) return null;
}

Это решило бы проблему.

Это также решило бы проблему

public void exapmle2(){
  String name = "";

  if(name == null) return null;

}
0

Выполните условие, предоставляется ли файл. Например, если файл предоставлен, создайте буферный считыватель и установите строку немедленно. В противном случае создайте сканер и установите строку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню