【问题标题】:Trouble finding solution to "variable might not have been initialized" error无法找到“变量可能尚未初始化”错误的解决方案
【发布时间】:2014-07-30 16:58:55
【问题描述】:

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

所以我创建了一个从文件中读取的BufferedReader (inBR),如果提供的话,以及一个从System.in 读取的Scanner (inScanner)。这些对象中只有一个被实际实例化,另一个保留为空。稍后,当程序从输入中读取一行时,我有以下代码:

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

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

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

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

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

【问题讨论】:

  • 我认为您需要向我们展示更多代码,例如您初始化 inBR 和 inScanner 的位置
  • 声明它们时将它们初始化为 null。
  • 这不是运行时异常,因为它不是在运行时发生的;它发生在编译时。

标签: java


【解决方案1】:

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

BufferedReader inBR = null;
Scanner inScanner = null;

当然,在访问它们之前你仍然需要给它们实际值,否则你会得到NullPointerException

【讨论】:

  • 哇,我真笨。好的。谢谢。我看到了像这样的其他 SO 答案,并认为它们在我的情况下不起作用,出于某种原因。 “已初始化”意味着创建了指向对象的指针,即使该指针指向 null?
  • @Mickeysofine 在Java中叫引用(不是指针),没错,就是引用被初始化了,可以初始化为null。
【解决方案2】:

在 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;

}

【讨论】:

    【解决方案3】:

    设置是否提供文件的条件。例如,如果提供了文件,则立即创建缓冲阅读器并设置行。否则,创建一个扫描仪并设置行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多