java 变量y可能没有在循环的if中初始化

j13ufse2  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(89)
import java.util.Scanner;
public class RPS
{
public void show()
{
    int i;
    System.out.println("1 - Rock          2 - Paper        3 - Scissor");
    Scanner in = new Scanner(System.in);
    i = in.nextInt();
    double x = Math.random();
    int y;
    if(x<=0.33)
    {
        y=1;
    }
    else if(x>0.33 && x<0.67)
    {
        y=2;
    }
    else if(x>=0.67)
    {
        y=3;
    }
    for(;;)    
    {
        if(i==y)
        System.out.println("It's a draw!");
        else if(i==1 && y==2)
        System.out.println("Computer wins!");
        else if(i==1 && y==3)
        System.out.println("You win!");
        else if(i==2 && y==1)
        System.out.println("You win!");
        else if(i==2 && y==3)
        System.out.println("Computer wins!");
        else if(i==3 && y==1)
        System.out.println("Computer wins!");
        else if(i==3 && y==2)
        System.out.println("You win!");
        else
        System.out.println("Error!");
    }
    }
 }

怎么了?它给出了一个错误,变量y可能没有在for循环的if中初始化。我已经在前面的if-else部分给y赋值了。那么为什么它没有被初始化呢?

nkoocmlb

nkoocmlb1#

javac不够聪明,无法意识到你的条件构造方式,其中一个总是为真。
你可以重写if语句,让javac意识到一个分支总是会被触发:

int y;
if(x<=0.33)
{
    y=1;
}
else if(x>0.33 && x<0.67)
{
    y=2;
}
else // This only triggers when x >= 0.67, so no need to check
{
    y=3;
}

现在javac看到,如果前两个不触发,最后一个会触发,所以y总是有一个值。
你也可以添加一个带有错误的else分支,以防有人破坏条件:

int y;
if(x<=0.33)
{
    y=1;
}
else if(x>0.33 && x<0.67)
{
    y=2;
}
else if(x >= 0.67)
{
    y=3;
}
else 
{
    // This should never happen
    throw new IllegalArgumentException("Something's gone terribly wrong for " + x);
}

这也可以编译,如果有人后来决定扭曲数字,并将第一个条件转换为x <= 0.2,但忘记更新其他条件,您将在运行时获得异常。

相关问题