我的Java程序在命令行上从用户那里获取输入。用户可以选择:他可以使用-inputfile选项将纯文本文件指定为输入,或者可以不指定此选项,在这种情况下,程序将从System.in获取输入。 (我已经在Ubuntu发行版中预装的某些程序中观察到了这种行为,因此我推断这是可以接受的做法。)

因此,我制作了一个从文件读取的BufferedReaderinBR)(如果提供),否则制作了一个从Scanner读取的inScannerSystem.in)。实际上仅实例化了这些对象中的一个,另一个则保留为null。稍后,当程序从输入中读取一行时,我有以下代码:

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


这分别给了我第(1)和(2)行的编译时间错误variable inBR might not have been initializedvariable inScanner might not have been initialized

这里可接受的解决方案是什么?我考虑过,“将应该为null的变量初始化为对象,以关闭编译器。”但是,这只是一个hack。当然有更好的方法。

另外,为什么这不是运行时异常(如NullPointerException)?

编辑:inScanner.readLine()=> inScanner.nextLine()

最佳答案

以这种方式声明它们将避免编译错误:

BufferedReader inBR = null;
Scanner inScanner = null;


当然,在访问它们之前,您仍然必须给它们实际值,否则您将得到NullPointerException

10-04 10:08