2013-03-07 106 views
1

我一直收到一个错误变量F3可能没有初始化在你看到的最后一行代码上。在java中的if语句中初始化一个变量?

我在做什么错?

{ 
    Float F1,F2, F3; 

    F1 = Float.parseFloat(
     JOptionPane.showInputDialog("Enter a number and press ok.")); 


    F2 = Float.parseFloat(
     JOptionPane.showInputDialog("Enter a second number and press ok.")); 

    if(F1 >= F2) 
    { 

     F3=(F1 * F2) + (F1 * 2); 
    } 
    if(F2 >= F1) 
    { 
     F3 =(F1 + F2) + (F2 * 5); 
    } 

    DecimalFormat dec = new DecimalFormat("##.##"); 


    JOptionPane.showMessageDialog(null,"Your calculations are:" +(F3),"Caculations", JOptionPane.INFORMATION_MESSAGE); 
+4

请勿使用以大写字母开头的变量名称。坚持命名约定。 – 2013-03-07 15:53:44

回答

2

按照JLS的情况下:必须有一个明确 指定值时

每一个局部变量和每一个空白的最后一个字段其价值的任何访问发生。

另外从§14.4.2

如果声明符不具有初始化表达式,然后每 参考变量必须由 赋值给变量的执行,一个或编译期前面发生时间错误。

随着代码的出现,有可能在它被使用之前(代码片段的最后一行)没有任何东西被分配到F3。使用F3 = null

+0

Float F1,F2,F3 = null;它的工作表示感谢 – TitanC 2013-03-07 16:14:20

+0

局部变量可以保持未初始化。问题在于编译器如何看到它不能清楚理解的条件,以便知道变量始终会用值初始化。 – 2013-03-07 16:18:38

+0

我如何避免将来? – TitanC 2013-03-07 16:22:08

8

你或许应该使用的if/else代替如果/当这里,让编译器知道F3总是被设置为一个值。

下面的代码就相当于你的if/if语句:

if(F1 > F2) //The = here will always be overridden by the other if clause in your original statement so it's redundant. 
{ 
    F3=(F1 * F2) + (F1 * 2); 
} 
else 
{ 
    F3 =(F1 + F2) + (F2 * 5); 
} 
+0

我被告知我必须使用两个if语句,否则我会这样做 – TitanC 2013-03-07 16:10:29

0

当你声明一个变量F3 null分配给它。因为你如果条件有可能是这个变量不会被分配任何价值

+1

实际上它总是会被分配一个值,只是编译器不够聪明而无法看到它。 – ddmps 2013-03-07 16:05:11

+0

你说得对。没有注意到 – jonasnas 2013-03-07 16:13:39

1

您的代码就相当于:

if(F1 > F2) { 
    F3 = (F1 * F2) + (F1 * 2); 
} else { 
    F3 = (F1 + F2) + (F2 * 5); 
} 

这应该让错误消失。

0

试试这个

Float F1=0,F2=0, F3=0; 
0

最好的办法是使用if-else语句,并没有分配到空的变量。如果else语句对人类和编译器更好。指定null是没有意义的,并且使编译器无法检查未初始化的问题以便将来进行修改,如果不检查它,则可能会得到NullPointerException。