【问题标题】:Java variable undefined but it is define at the beginningJava 变量未定义,但它是在开头定义的
【发布时间】:2018-11-19 22:27:21
【问题描述】:

我的代码是在罗马等价物中转换一些整数。说整数 5 是罗马等价的“V”等等。我正在使用开关盒进行转换。但是它会抛出一个错误,即作为字符串类型变量的变量符号,这是未定义的。我在代码的顶部声明了这个变量。

换算表是这样的:

 Symbol       Value
  I             1
  V             5
  X             10
  L             50
  C             100
  D             500
  M             1000
import java.util.Scanner;

//Integer to Roman Conversion
public class integer_roman {
public static void main(String args[]){
    Scanner in= new Scanner(System.in);

    System.out.println("Enter the Integer number");
    int number= in.nextInt();
    String symbol;
    switch (number){
        case 1:
            symbol="I";
            break;
        case 5:
            symbol="V";
            break;
        case 10:
            symbol="X";
            break;
        case 50:
            symbol="L";
            break;
        case 100:
            symbol="C";
            break;
        case 500:
            symbol="D";
            break;
        case 1000:
            symbol="M";
            break;
    }
    System.out.println(symbol);
}
}

错误: 错误:(34, 28) java: 变量符号可能没有被初始化

我无法找出问题所在。如果有人有任何想法,请分享。

【问题讨论】:

  • 编译器不能保证symbol 在被使用时已经被赋值。局部变量没有分配默认值,因此它们是“未定义的”。定义局部变量时为其分配“默认值”
  • “未初始化”!=“未定义”! “未初始化”意味着它没有(初始)值; “未定义”表示未定义或声明。由于您的开关中没有default,因此变量可能会在没有任何值的情况下结束 -> 错误未初始化。 switch 可能不是最适合您的情况(假设这里有一些东西)

标签: java string switch-statement java.util.scanner


【解决方案1】:

这个:

String symbol;

是变量symbol 的声明,但它不做任何初始化。
后来,switch 块并没有涵盖变量 number 可能具有的所有可能值,因此即使在 switch 块之后,symbol 仍将保持未初始化状态。
这就是编译器抱怨的原因,因为不可能在赋值的右侧打印或使用未初始化的变量。
最好一开始就这样初始化:

String symbol = "undefined";

所以如果在switch 块中symbol 没有得到任何值,undefined 将被打印。

【讨论】:

    【解决方案2】:

    首先将消息打印给用户,然后使用Scanner 获取他的输入。

    其次,添加一个default: 来初始化symbol,以防用户键入除了switch 语句中定义的情况之外的其他内容。

    public static void main(String args[]){
            System.out.println("Enter the Integer number");
            Scanner in= new Scanner(System.in);
    
            int number= in.nextInt();
            String symbol = null;
            switch (number){
                case 1:
                    symbol="I";
                    break;
                case 5:
                    symbol="V";
                    break;
                case 10:
                    symbol="X";
                    break;
                case 50:
                    symbol="L";
                    break;
                case 100:
                    symbol="C";
                    break;
                case 500:
                    symbol="D";
                    break;
                case 1000:
                    symbol="M";
                    break;
                default:
                    symbol="Uknown number."
            }
            System.out.println(symbol);
        }
    

    【讨论】:

      【解决方案3】:

      感谢您的有益讨论。关于定义我被认为是空的字符串有很多理论。

      String symbol=null;
      

      效果很好。我不知道变量可以用未定义或空值定义。所以我很困惑。但是没有必要降级这篇文章。我写了一个完整的代码。只停留在一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        相关资源
        最近更新 更多