变量可能尚未初始化
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
中的值为Feb
, March
等分配一些有用的值。 然后还要确保分配ZodiacSign
无论哪条代码路径最终被采用。
此外,这里的算法存在根本问题。 您每个月都不需要变量。 您只需输入两个变量:日期和月份,以及黄道十二宫的第三个变量。
更改以下行
int Feb,March,ZodiacSign,Pisces,Aquarius,Aries,Taurus;
至
int Feb=0,March=0,ZodiacSign=0,Pisces=0,Aquarius=0,Aries=0,Taurus=0;
方法变量在使用之前需要一些初始赋值。 所以对所有其他方法变量也这样做。
- Java中的数组以及它们如何存储在内存中
- Java 8函数式编程中’reduce’函数的第三个参数的目的
- 在处理程序中组装一个Netty消息
- 什么是Java的java.util.concurrent包的.NET等价物?
- 线程“main”中的exceptionjava.lang.UnsatisfiedLinkError:资源路径中找不到jnidispatch(/ com / sun /jna/win32-x86/jnidispatch.dll)
- 如何在JGit中从一个git分支硬重置到另一个?
- 映射值是应该以常量还是枚举声明?
- Spring Data JPA:创建一个抽象存储库
- 在spring security中禁用特定URL的缓存