我必须在Java中的每个if else语句中初始化一个变量吗?[duplicate]

628mspwn  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(142)
    • 此问题在此处已有答案**:

Variable might not have been initialized in an if/else if statement(1个答案)
昨天关闭。

int outsideTem = 10;
    String output;
    if(outsideTem < 0){
        //output = "Grab a coat";// i get an error if i comment out this line but why?
        //System.out.println(output);
    }
    else if(outsideTem < 15){
        output = "Grab a cardigan";
        //System.out.println(output);
    }
    else{
        output = "HOT!!!";
        //System.out.println("HOT!!!");
    }
    System.out.println(output);

如果我注解掉if块中的变量,会得到一个错误。但是我之前尝试过初始化它,它是有效的。但是我不知道为什么

int outsideTem = 10;
    String output = "";// tried this and it is working but not sure why
    if(outsideTem < 0){
        //output = "Grab a coat";// i get an error if i comment out this line but why?
        //System.out.println(output);
    }
    else if(outsideTem < 15){
        output = "Grab a cardigan";
        //System.out.println(output);
    }
    else{
        output = "HOT!!!";
        //System.out.println("HOT!!!");
    }
    System.out.println(output);
jk9hmnmh

jk9hmnmh1#

是的,变量在使用之前需要初始化。您试图在print语句中使用变量。如果outsideTemp小于0,并且该行被注解掉,您希望Java在该行中打印什么?
但是,你不需要在if中初始化,你可以在声明变量时就已经初始化了。
因此,以下方法可行:

public class Application {

    public static void main(String[] args) {
        int outsideTem = 10;
        // initialize here
        String output = "";
        if(outsideTem < 0){ // unused if here, but compiling code
            //output = "Grab a coat";
            //System.out.println(output);
        }
        else if(outsideTem < 15){
            output = "Grab a cardigan";
            //System.out.println(output);
        }
        else{
            output = "HOT!!!";
            //System.out.println("HOT!!!");
        }
        System.out.println(output);
    }

}
dkqlctbz

dkqlctbz2#

我是否必须在Java的每个if else语句中初始化一个变量?
是的!但是只适用于local变量。一个局部变量在被引用之前必须被赋值。但是赋值可以发生在引用它的同一个语句中。在Java Language Specification中读Definite Assignment。这里是一些摘录。
例16-1考虑语句和表达式结构的确定赋值
Java编译器识别出k在代码中被访问之前(作为方法调用的参数)被明确赋值:

{
    int k;
    if (v > 0 && (k = System.in.read()) >= 0)
        System.out.println(k);
}

因为只有当表达式的值:

v > 0 && (k = System.in.read()) >= 0

为true,并且只有在执行了对k的赋值(更准确地说,是求值)时,该值才为true。
类似地,Java编译器将在代码中识别:

{
    int k;
    while (true) {
        k = n;
        if (k >= 5) break;
        n = 6;
    }
    System.out.println(k);
}

变量k由while语句明确地赋值,因为条件表达式True永远不会具有值False,所以只有break语句才能使while语句正常完成,并且k在break语句之前被明确地赋值。

{
    int k;
    while (n < 4) {
        k = n;
        if (k >= 5) break;
        n = 6;
    }
    System.out.println(k);  /* k is not "definitely assigned"
                               before this statement */
}

必须被Java编译器拒绝,因为在这种情况下,就明确赋值规则而言,while语句不能保证执行其主体。

相关问题