变量可能尚未初始化

时间:2011-11-27 10:04:39

标签: java variables initialization

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 ;
                       ^

3 个答案:

答案 0 :(得分:7)

您永远不会将值分配给Feb,那么您希望这种比较能达到什么目的?

if (Feb >= 19)

考虑一下 希望通过这种比较实现的目标,然后找出需要改变的内容以实现目标。

通常,在明确分配之前,您无法从局部变量中读取 - 换句话说,直到编译器能证明您已经通过一些执行路径,为其赋值。

然而,我建议你仔细考虑一下整体设计,而不是试图用声明点分配的值进行编译。例如,您可能希望将双鱼座,白羊座等更改为枚举值。

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

答案 1 :(得分:3)

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

此外,代码中的某些代码路径会使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

您应该使用Feb中的值为MarchZodiacSign分配一些有用的值,依此类推。然后还要确保无论最终采用哪个代码路径,都会分配{{1}}。

此外,您的算法存在根本问题。您每个月都不需要变量。您只需输入两个变量:日期和月份,以及黄道十二宫的第三个变量。

答案 2 :(得分:-2)

更改以下行

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

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

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