Java:使用while循环校验Scanner输入的int变量时未初始化问题求助
解决Java局部变量未初始化编译错误及输入校验问题
Java里方法内定义的局部变量不会像类成员变量那样自动赋默认值,必须显式赋值后才能使用。你最初的代码里int birthDay;只声明了变量但没赋值,直接在while (birthDay > 31)里做判断,编译器必然会报错“变量未初始化”。
你尝试的int birthDay = myScanner.nextInt();其实已经解决了未初始化的问题,如果还是遇到相同的编译错误,先检查代码是否确实替换完成,或者重启IDE/命令行重新编译——大概率是编译器缓存或者代码没保存的问题。
不过你的输入校验逻辑还有漏洞,比如用户输入0、负数也会通过,输入非数字还会导致程序崩溃,给你优化后的完整代码:
import java.util.Scanner; public class MyStarSign { public static void main(String[] args) { Scanner myScanner = new Scanner(System.in); System.out.println("What month were you born?"); String birthMonth = myScanner.next(); System.out.println("You were born in " + birthMonth + "?"); System.out.println("What day of the month were you born?"); int birthDay = -1; // 初始化一个肯定不符合条件的值,确保进入循环 // 校验:必须是1-31之间的有效整数 while (birthDay < 1 || birthDay > 31) { // 先判断输入是否为整数,避免非数字输入导致程序崩溃 if (!myScanner.hasNextInt()) { System.out.println("请输入有效的数字!"); myScanner.next(); // 吃掉无效输入,防止死循环 continue; } birthDay = myScanner.nextInt(); if (birthDay < 1 || birthDay > 31) { System.out.println("请输入1-31之间的有效日期!"); } } System.out.println("你的出生日期是:" + birthMonth + " " + birthDay); } }
优化说明:
- 用
-1初始化birthDay,保证第一次能进入循环做校验 - 增加非整数输入的判断逻辑,避免程序崩溃
- 校验范围调整为
1-31,覆盖负数、0等无效情况
内容的提问来源于stack exchange,提问作者dietCokeIsTheDevil
相关产品推荐
相关产品推荐

