【问题标题】:Wy is this code illegal in terms of variable initialization?为什么这段代码在变量初始化方面是非法的?
【发布时间】:2022-01-09 06:59:24
【问题描述】:
import java.util.*;

class Example {

  public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    System.out.print("Input an integer : ");
    int num = input.nextInt();
    int y;
    if (num > 100) {
      y = 200;
    }
    if (num < 100) {
      y = 200;
    }
    if (num == 100) {
      y = 200;
    }
    System.out.println(y);
  }
}

错误:

Example.java:19: error: variable y might not have been initialized
    System.out.println(y);

                   ^

【问题讨论】:

  • 如果没有输入任何if-分支,则永远不会初始化y。由于访问未初始化的局部变量是非法的,因此编译器会产生错误。编译器无法推断必须输入三种情况之一。我建议在第二种情况下使用else if,在第三种情况下使用else。这将解决问题。

标签: java variables initialization


【解决方案1】:

如果没有输入任何if-分支,则永远不会初始化y 。由于访问未初始化的局部变量是非法的,因此编译器会生成错误(如JLS, §16 中所定义)。编译器无法推断必须输入这三种情况之一。

我建议在第二种情况下使用else if,在第三种情况下使用else:

import java.util.Scanner;

class Example {

  public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    System.out.print("Input an integer : ");
    int num = input.nextInt();
    int y;
    if (num > 100) {
      y = 200;
    }
    else if (num < 100) {
      y = 200;
    }
    else /* if (num == 100) */ {
      y = 200;
    }
    System.out.println(y);
  }
}

Ideone demo

【讨论】:

    【解决方案2】:

    Javac 不进行流分析。换句话说,您知道num &gt; 100num &lt; 100num == 100true,但javac 不知道。 在这种情况下,您可以像这样将ifelse ifelse 组合起来:

        if (num > 100) {
          y = 200;
        } else if (num < 100) {
          y = 200;
        } else { // num == 100 must be true
          y = 200;
        }
    

    您也可以为y 分配一些值(例如0),但上述解决方案更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2015-09-06
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多