变量可能没有被初始化

变量可能没有被初始化

本文介绍了为什么我得到一个“变量可能没有被初始化"?我的开关块中的编译器错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用 switch 块时遇到变量可能尚未初始化"错误.

I'm encountering "a variable might not have been initialized" error when using switch block.

这是我的代码:

public static void foo(int month)
{
    String monthString;
    switch (month)
    {
        case 1: monthString = "January";
                break;
        case 2: monthString = "February";
                break;
    }
    System.out.println(monthString);
}

错误:

Switch.java:17: error: variable monthString might not have been initialized
        System.out.println (monthString);

据我所知,当您尝试访问尚未初始化的变量时会发生此错误,但是当我在 switch 块中为其分配值时我没有初始化它吗?

To my knowledge this error occurs when you try access a variable you have not initialized, but am I not initializing it when I assign it the value in the switch block?

同样,即使月份是编译时常量,我仍然会收到相同的错误:

Similarly, even if the month is a compile-time constant, I still receive the same error:

public static void foo()
{
    int month = 2;
    String monthString;
    switch (month)
    {
        case 1: monthString = "January";
                break;
        case 2: monthString = "February";
                break;
    }
    System.out.println(monthString);
}

推荐答案

如果 month 不是 12 则没有在被引用之前初始化 monthString 的执行路径中的语句.编译器不会假定 month 变量保留其 2 值,即使 monthfinal.

If month isn't 1 or 2 then there is no statement in the execution path that initializes monthString before it's referenced. The compiler won't assume that the month variable retains its 2 value, even if month is final.

JLS,第 16 章, 讨论明确赋值"以及变量在被引用之前可能被明确赋值"的条件.

The JLS, Chapter 16, talks about "definite assignment" and the conditions under which a variable may be "definitely assigned" before it's referenced.

条件布尔运算符 &&、|| 和 ? 的特殊处理除外: 对于布尔值常量表达式,流分析中不考虑表达式的值.

变量monthString在被引用之前没有明确赋值.

The variable monthString is not definitely assigned prior to being referenced.

switch 块之前初始化它.

Initialize it before the switch block.

String monthString = "unrecognized month";

或者在 switch 语句中以 default 的情况对其进行初始化.

Or initialize it in a default case in the switch statement.

default:
    monthString = "unrecognized month";

或者抛出异常

default:
    throw new RuntimeExpception("unrecognized month " + month);

这篇关于为什么我得到一个“变量可能没有被初始化"?我的开关块中的编译器错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-25 03:39