Моя программа 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()
Объявление их таким образом позволило бы избежать ошибки компиляции:
BufferedReader inBR = null;
Scanner inScanner = null;
Конечно, вы все равно должны дать им фактические значения перед их доступом, или вы получите NullPointerException
.
В 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;
}
Выполните условие, предоставляется ли файл. Например, если файл предоставлен, создайте буферный считыватель и установите строку немедленно. В противном случае создайте сканер и установите строку.