变量可能尚未初始化

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

你永远不会 Feb 分配一个值,所以你期望这个比较能达到什么目的?

 if (Feb >= 19) 

想想你通过这种比较真正想要达到的目标,然后找出你需要改变的东西来实现它。

通常,在明确赋值之前,您无法从局部变量中读取 – 换句话说,直到编译器可以certificate您已经通过某个执行路径为其赋值。

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

此外,Java代码通常将pascalCase名称用于局部变量。

你正在阅读从未写过的变量,例如你在第一个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无论哪条代码路径最终被采用。

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

更改以下行

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

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

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