当前位置: 首页 > 知识库问答 >
问题:

编译器说“变量可能尚未初始化”,尽管我有一个标志变量来保证它[重复]

司徒胤
2023-03-14

下面是我的代码片段:

Someclass someObject;
boolean success = true;
try {
    someObject = someOperation();
} catch (Exception e) {
    success = false;
}
if (success) {
    int number = Integer.valueOf(someObject.someMethord());
}

在这条线内:

 int number = Integer.valueOf(someObject.someMethord());

Java编译器抛出错误并说

错误:变量someObject可能尚未初始化`。

但是,如果success等于true,那么someObject就不可能没有被初始化,为什么会出现这个错误?

共有3个答案

柯立果
2023-03-14

您可以这样更改您的声明:

Someclass someObject = null;

或者,您可以在try-get中执行所有操作,以确保某些Object将被正确初始化

try {
    Someclass someObject = someOperation();
    int number = Integer.valueOf(someObject.someMethod());
} catch (Exception e) {
    //...
}
羿昊英
2023-03-14

Java语言规范(JLS)确切地定义了编译器应该如何分析这样的代码。

在您的情况下,本地变量有些对象if块中使用之前,不会被明确赋值。JLS第16章中介绍的定义赋值定义了变量被认为赋值(初始化)的确切规则。

它分别分析tryif语句。在try之后,someObject没有明确分配,因为它没有在catch块中分配。在if中,条件可能是。如果它是true,则会出现一个错误,因为此时没有明确指定someObject

Java编译器不允许分析此代码并“弄清楚”只有在分配了someObject时,success才能为真,因为语言规则规定了必须执行的精确分析。这不是编译器不够智能的情况,而是Java语言标准过于严格的情况。

请注意,如果使用if(false)而不是if(success),则不会出现错误,因为JLS指定false是一个常量表达式,因此循环体永远不会执行。

无论如何,标志变量都是不必要的。将依赖代码移动到try,或在声明中将变量设置为null,并显式检查someObject!=null是所有更容易理解、更不容易出错的方法。

周伟泽
2023-03-14

编译器不会分析success标志与someObject变量初始化之间的关系。

就编译器而言,如果发生异常,someObject可能无法初始化。

您可以通过在捕获块中将变量设置为null来解决这个问题(而不是检查您的成功变量,检查某些对象!=null)。

或者,您可以将int Number=Integer.valueOf(一些bject.somemetord());语句移动到try块中。

 类似资料:
  • 问题内容: 我有一个方法创建一个,另一个方法更改字符串 我的编译器说它“可能尚未初始化”。 有人可以解释吗? 问题答案: 变量可能尚未初始化 在内部定义方法时,必须在其中初始化程序的每个变量中必须先使用一个值的地方。 同样重要的是,您的代码将永远无法正常运行,因为Java中的字符串是不可变的,因此您无法编辑字符串,因此应更改方法。 我将您的代码更改为类似的内容,但是我认为您的编辑方法应该做另一件事

  • 所以我已经在结果中声明了相关字符串的值,但是它仍然说我的变量“result”可能还没有初始化。 我正在尝试实现与此类似的输出。任何人都可以帮我吗?谢谢!

  • 我正在研究Euler Problem 9项目,其中说明: 毕达哥拉斯三元组是由三个自然数组成的集合 例如,3^2 4^2=9 16=25=52。 确实存在一个毕达哥拉斯三重态,其bc=1000。查找产品abc。 以下是我到目前为止所做的: 当我运行代码时,会出现以下错误: 注意:我的每个变量(a、b和c)都有不同的行号。 我想当我声明a、b和c为整数时,如果不赋值,默认值是0。 即使不是这样,在我

  • 我不知道这段代码有什么问题,也不知道为什么会出现错误: 变量isPrime可能尚未初始化 这是完整的代码:

  • 问题内容: 我得到错误: TestCounter.java:115:变量计数器可能尚未初始化counters [i] = new Counter(i); 而且我不知道如何解决它。我知道我的课程“” 有效。下面是我的代码,如果您可以看一下,我将非常高兴。此代码包装在类的main方法中。 问题答案: 您尚未创建数组,只是声明了变量。 您需要这样做: 或类似的东西

  • 在最后一行显示为时出错 :::: 变量结果可能尚未初始化 这是我的代码: