2017-04-10 123 views
0

我想知道是否有任何方法来声明一个不同大小的数组,这取决于是否满足if语句条件。然而,在输入这​​个代码到NetBeans后:java声明数组基于If语句

if(winner == true) 
    double data[][] = new double[16][5]; 
else 
    double data[][] = new double[14][5]; 

我收到一条错误信息,指出:变量声明这里不允许的。

为什么不允许?有什么办法可以完成我想要做的事情吗? Tia。

注意

正如作出提供的答案清楚了,我写这篇文章时,没有考虑范围。我道歉。感谢所有提供有用解决方案和见解的人。

+0

声明外部引用if并初始化它内部 – jmw5598

+0

问题是你有一个单独的代码范围声明和指定一个范围局部变量。该变量在设置后会立即超出范围,因此IDE假定您犯了一些错误。 – Wietlol

+1

您还可以:'双数据[] [] =新双赢[赢家? 16:14] [5];' – Oneiros

回答

11

另一种解决办法是:

double data[][] = new double[winner ? 16 : 14][5]; 

x ? a : b这个东西被称为“三元操作符”。如果x为真,则评估为a,否则为b

1

你必须声明你的阵列的if..else块外面,初始化你if..else块内部:

double data[][]; 

if(winner == true) 
    data = new double[16][5]; 
else 
    data = new double[14][5]; 
+2

如果你想成为偏执狂,那肯定是因为其他海报中的一个不公平,并且希望他自己的解决方案超越你的!老实说,我会建议删除你的答案,而不是提供超过上述3的答案,在这个过程中摆脱downvote。我向你提出建议,因为你已经得到了赞成,但我完全同意所有这些答案都是平等的;这只是愚蠢的看到相同的答案3次 – Aaron

+2

这可能是因为在任务期间的括号?我在宣告行上收到意想不到的标记。如果我将'data [] [] = new double [16] [5];'更改为'data = new double [16] [5];'它通过很好。 – DanielBarbarian

+2

哦,是的,这可能是我的错误,我已经修复它的原因@DanielBarbarian谢谢你的帮助 –

5

你应该这样做:

double data[][]; 
if(winner == true) // or just --> if (winner) 
    data = new double[16][5]; 
else 
    data = new double[14][5]; 

从本质上讲,当你在,如果声明它,你只能在if中使用它。它的范围是有限的,如果。

1

您不想在if块内声明变量,因为一旦退出该块,它就会超出范围。在if之前声明变量,然后在里面初始化它。

double data[][]; 

if(winner == true) 
    data = new double[16][5]; 
else 
    data = new double[14][5]; 
1

试试这个:

double data[][]; 
if(winner) 
    data = new double[16][5]; 
else 
    data = new double[14][5]; 
2

声明数组为IF函数,他们的arent再次使用,即时通讯里面不知道,如果这就是你错误的原因,但也许申报IF外的VAR声明

double data[][]; 

if(winner == true){ 
    data = new double[16][5]; 
}else{ 
    data = new double[14][5]; 
} 
-2

这是一个古老的角落的情况下,加花括号,你应该这样做:

 if(winner == true) { 
      double data[][] = new double[16][5]; 
     } 
     else { 
      double data[][] = new double[14][5]; 
     } 

这是由于这样的事实,你声明的局部变量的声明语句。这种行为在Java Puzzlers中有描述,它在JLS部分14.4中有介绍。

+1

不会有任何错误了,但错误是有一个很好的理由 – Aaron

+1

所以,而不是修复错误,你更喜欢“隐藏”它吗?聪明。 – Tom

+0

@Aaron和错误是什么?我认为这是一种未知的语言特征,因为它已被JLS在14.4节中涵盖。以下是Java Puzzlers的一部分:局部变量声明看起来像一个声明,但从技术上讲不是;它是一个局部变量声明语句[JLS 14.4]。 – comanitza

1

在if语句中只允许声明,但声明不是声明,所以不允许在该位置使用。

好吧,试试这样;

double data[][]; 
if(winner) 
    data=new double[16][5]; 
else 
    data=new double[14][5]; 
0

这是使用三元运算符的绝好机会。

double data[][] = (isWinner)?new double[16][5] : new double[14][5]; 

建议

  • 名称的布尔变量isWinner而不是winner,你可以 执行像上面的例子检查。通过删除条件 winner == true您的代码变得更容易阅读。
  • 使用ternary operator,它使您的代码更短,更清晰地阅读。