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 赋了一个值。 那么为什么它没有被初始化?
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
但忘记更新另一个条件,你将在运行时得到一个异常。