【问题标题】:Variable uninitialized - must I set a variable, rather than just add to it in an if statement?变量未初始化 - 我必须设置一个变量,而不是在 if 语句中添加它吗?
【发布时间】:2013-07-17 06:36:17
【问题描述】:

我正在尝试构建一个基本的重量计算器,但遇到了“变量 weightOut 可能尚未初始化”错误。谷歌似乎表明这是因为我需要初始化 "weightOut" 而不是仅仅设置它 " = weightIn * .78 " 。这是真的?这是我的代码。

 Scanner keyboard = new Scanner(System.in);

          int weightIn, planetNumber;
          double weightOut;

          System.out.print("What is your weight? ");
          weightIn = keyboard.nextInt();

          System.out.println("I have information for the following planets: ");
          System.out.println("   1. Venus ");
          ...

          System.out.print("What planet are you going to? ");
          planetNumber = keyboard.nextInt();

          if( planetNumber == 1 )
          {
              weightOut = weightIn * 0.78;
          }
          ...

         System.out.println("Your weight would be " + weightOut + 
                  " on that planet.");

【问题讨论】:

  • 减速时weightOut的值未知(对于所有局部变量都是如此)。编译器担心您可能会在代码中处于未知状态时依赖此值。就个人而言,我认为您应该对其进行初始化以确保除非您在您的 else 分支中提供默认值,否则您的 if 语句会提供默认值
  • 啊!等等,我当前的 else 语句是 else { System.out.println("I don't understand."); } 我可以将其更改为 else { weightOut = 0 } 以不产生错误吗?
  • 你可能会发现编译器会停止抱怨......
  • 但这会是不好的形式,我敢肯定吗?我想知道如何绕过编译器错误很有趣,但这样做的目的是学习好的代码,所以我将遵循其他答案并使初始化成为一种习惯。谢谢大家!
  • 是的,我不会这样做,如果您的代码运行多个页面,则不清楚该值的实际含义。它也更安全,恕我直言

标签: java variables initialization


【解决方案1】:

局部变量不使用默认值初始化。局部变量在使用前应初始化。

double weightOut = 0.0;

如果if 语句在运行时从未真正执行过怎么办?编译器实际上担心,如果在运行时局部变量无法获取值并且您在其他地方使用它,它应该给它的值没有默认值!

【讨论】:

  • +1 for 如果 if 语句在运行时从未真正执行过怎么办? - 另请注意,weightIn 可能未成功读取。
  • 这是有道理的,但我不应该设置 weightOut = 1,否则我的 if 语句不会全部为 0 吗?此外,为什么当我在代码开头设置 weightOut = 1 时,我没有得到 weightIn 和 planetNumber 的错误?是不是因为依赖扫描仪输入比依赖扫描仪输入的变量要少,我不知道,棘手?编辑:啊,如果我最初将 weightIn 设置为 0,我看到 weightOut 不会为 0,因为它应该由扫描仪输入更改。现在越来越清楚了,谢谢。
  • @komali_2 这取决于你的逻辑!
【解决方案2】:

在java中方法/局部变量应该被初始化。未初始化的变量可能会产生意想不到的结果,因此会引发这种情况。在您的代码中,如果不满足封闭的if 条件,则永远不会设置weightOut 的值。您需要使用一些默认值初始化以下变量:

  int weightIn = 0;
  int planetNumber = 0;
  double weightOut = 0.0d;

【讨论】:

    【解决方案3】:

    不输入if-branch,变量会有什么值?

    要解决这个问题,请在末尾添加一个 else-branch:

    if (...)
        myVar = x;
    else if (...)
        myVar = z;
    else
        myVar = y;
    

    在 else-branch 中设置值而不是设置一些默认初始值不仅使编译器满意,而且还可以防止您提交编译器抱怨的错误:如果稍后您添加的代码使用在 if 语句中设置正确值之前的变量,您仍然会从编译器收到错误消息,而不是在运行程序时出现意外结果。

    【讨论】:

    • 啊,我有一个 else 声明,我只是没有包含它,但这是真的,谢谢!
    【解决方案4】:

    你需要将“weightOut”初始化为0,因为没有初始化就不能使用局部变量。 在您的情况下,您在 if 条件中分配值并且该值无效,因为 在 java 中局部变量的值是在运行时决定的。这就是你出错的原因。

    【讨论】:

      【解决方案5】:

      如果行星编号为0怎么办?

      你应该这样做:

      double weightOut = 0;

      【讨论】:

        猜你喜欢
        • 2023-02-06
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多