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

问题描述 投票:0回答:1
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 赋了一个值。 那么为什么它没有被初始化?

java variables
1个回答
0
投票

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
但忘记更新另一个条件,你将在运行时得到一个异常。

© www.soinside.com 2019 - 2024. All rights reserved.