2011-11-27 119 views
1
import java.util.Scanner; 

public class ZodiacSign{ 

     public static void main(String args[]){ 

     Scanner input = new Scanner(System.in); 
     int Feb,March,ZodiacSign,Pisces,Aquarius,Aries,Taurus; 

     int selection; 
     System.out.println("Feb"); 

     System.out.println("Feb 1,2,3,4\n Feb 5,6,7,8\n Feb 9,10,11,12\n Feb 13,14,15,16\n Feb 17,18,19,20\n Feb 21,22, 23, 24\n Feb25,26,27,28\n March 1,2,3,4\n March 5,6,7,8\n March 9,10,11,12\n March 13,14,15,16\n March17,18,19,20\n March 21,22,23,24\n March 25,26,27,28\n March 29,30,31"); 
     System.out.println("Please enter your date of birth"); 
     System.out.println("Please enter your month of birth"); 


     selection = input.nextInt(); 
     if(Feb>= 19){ 
      ZodiacSign = Pisces ; 
      System.out.println("Your zodiac sign is Pisces"); 
     } 
     else 
     { 
      System.out.println("Your zodiac sign is Aquarius"); 
     } 
     if(March>=22){ 
      ZodiacSign = Aries; 
      System.out.println("Your zodiac sign is Aries"); 
     } 
     else 
     { 
      System.out.println("Your zodiac sign is Taurus"); 
     } 
      System.out.println("End of Program"); 



     } 
} 

它给我的四个错误:变量可能尚未初始化

ZodiacSign.java:19:error: variable Feb might not have been initialized 
       if(Feb>= 19){ 
       ^
ZodiacSign.java:20:error: variable Pisces might not have been initialized 
         ZodiacSign= Pisces ; 
           ^
ZodiacSign.java:27:error: variable March might not have been initialized 
     if(March>= 22){ 
      ^
ZodiacSign.java:28:error: variable Aries might not have been initialized 
      ZodiacSign= Aries ; 
        ^

回答

-2

更改以下行

int Feb,March,ZodiacSign,Pisces,Aquarius,Aries,Taurus; 

int Feb=0,March=0,ZodiacSign=0,Pisces=0,Aquarius=0,Aries=0,Taurus=0; 

方法变量需要一些初始分配在使用之前。所以对所有其他方法变量也要这样做。

+2

它们不需要默认值。在阅读之前,他们必须被明确地分配 - 这不是一回事。 –

+0

是的,我同意。那更精确。我编辑了我的回复。 – Santosh

+0

虽然我不认为这是正确的做法。 (我也建议使用“局部变量”而不是“方法变量”这个更常见的术语。) –

7

你永远不会指定值到Feb,那么你期望这个比较实现什么?

if (Feb >= 19) 

想想你真的实现与比较的东西,然后制定出你需要改变,使其发生什么。

一般情况下,你不能从一个局部变量看它之前明确赋值 - 换句话说,直到编译器可以证明,你会一直通过给它分配一个值,一些执行路径。

但是,我并不是试图用声明中的值来编译它,而是建议你仔细考虑一下整体设计。例如,您可能想要将双鱼座,白羊座等改为枚举值。

此外,Java代码通常使用局部变量的名称pascalCase

3

您正在阅读从未写入过的变量,例如,您从第一个if声明中的Feb中读取而没有写入任何内容。

此外,通过您的代码的一些代码路径会使ZodiacSign局部变量未初始化,一旦您尝试读取该局部变量,就会产生相同的错误。就拿这一点:

if(Feb>= 19){ 
    ZodiacSign = Pisces ; 
    System.out.println("Your zodiac sign is Pisces"); 
} 
else 
{ 
    System.out.println("Your zodiac sign is Aquarius"); 
} 

如果Feb小于19 ZodiacSign不会一直写的代码片段的结束。第二个条件也可以将ZodiacSign未分配。

你缺少的是实际使用从输入中读取的值来设置局部变量。也就是说,在

selection = input.nextInt(); 

你应该selection使用该值一些有用的值赋给FebMarch等。然后还要确保ZodiacSign被分配,而不管哪个代码路径最终被占用。

此外,这里的算法存在一个基本问题。你不需要每个月都有一个变量。你的输入只需要两个变量:日期和月份,以及十二生肖的三分之一。