Java高中毕业判定程序无输出问题排查求助
兄弟,我仔细扒了你的代码,问题其实挺集中的,咱们一个个说透:
核心问题汇总
1. 多个Scanner实例搞乱了输入流
你居然创建了8个Scanner对象都绑定System.in!这在Java里是绝对的大忌——多个Scanner会抢占同一个输入流,导致程序经常卡在等待输入的状态:你以为已经输入完所有内容了,但实际上某个Scanner还在蹲你输入下一个值,自然就走不到输出语句。
解决办法:只创建一个Scanner实例,所有输入都用它来读取,省心又不出错。
2. 变量作用域错误,判断条件里的变量根本不存在
你看你定义math1、english1这些变量的位置:
if (math >= 4) { boolean math1 = true; // 这个变量只在这个大括号里有效! } else { boolean math1 = false; // 出了else块就没了! }
到最后那个判断条件if(art1 && hope1 && gpa1 && hours1 && gpa1 && studies1 && science1 && english1 && math1 == true)的时候,这些math1、english1都是未定义的!编译器其实应该报错,但你可能没注意,就算勉强运行,程序也会因为找不到这些变量直接终止,根本到不了输出环节。
解决办法:把这些布尔变量提前在方法开头定义好,不要在if/else块里重新定义,只在块里赋值就行。
3. 逻辑嵌套完全颠倒,大部分路径走不到输出
你的if-else嵌套逻辑完全错了!比如只要math >=4,程序就会执行第一个if块里的代码,然后直接跳出这个if,后面的所有判断都不会执行,自然不会走到最后的输出语句。毕业资格应该是所有条件同时满足,而不是嵌套着层层判断。
解决办法:把嵌套的if改成平行的条件判断,每个条件单独检查,最后用逻辑与(&&)把所有条件组合起来。
4. 重复读取输入,导致程序卡住
你已经读取过一次HOPE的输入了:
char hope = physed3.next().charAt(0);
但后面又写了:
if (physed3.next().charAt(0) == (89)) physed = true;
这等于让用户再输入一次HOPE的Y/N,用户根本不知道要输入两次,程序就卡在这等输入,当然没输出。
解决办法:用之前已经读取的hope变量来判断,不要重复读取输入。
修正后的完整代码
package gradrequirment; import java.util.Scanner; public class graduation { public static void main(String[] args) { // 只创建一个Scanner实例,搞定所有输入 Scanner scanner = new Scanner(System.in); // 提前定义所有需要的布尔变量 boolean math1, english1, science1, studies1, hours1, gpa1, physed, art; System.out.println("Enter your GPA, service hours, and credits for each class.\n"); System.out.println("Enter GPA:"); double GPA = scanner.nextDouble(); System.out.println("Enter Service Hours:"); int hours = scanner.nextInt(); System.out.println("Enter Y/N if you have taken HOPE."); char hope = scanner.next().toUpperCase().charAt(0); // 转大写,兼容小写输入 System.out.println("Enter How Many Math Credits You Have:"); int math = scanner.nextInt(); System.out.println("Enter English Credits:"); int english = scanner.nextInt(); System.out.println("Enter Science Credits:"); int science = scanner.nextInt(); System.out.println("Enter Social Studies Credits:"); int studies = scanner.nextInt(); System.out.println("Enter Y/N if You Have A Fine Art Credit."); char arts = scanner.next().toUpperCase().charAt(0); // 用简洁的方式给布尔变量赋值,替代繁琐的if-else math1 = math >= 4; english1 = english >= 4; science1 = science >= 3; studies1 = studies >= 3; hours1 = hours >= 100; gpa1 = GPA >= 2.0; physed = hope == 'Y'; art = arts == 'Y'; // 所有条件同时满足才符合毕业资格 if(math1 && english1 && science1 && studies1 && hours1 && gpa1 && physed && art) { System.out.println("You Have Graduated!"); } else { System.out.println("You Have Not Graduated. Try Harder!"); } scanner.close(); } }
额外优化点
- 把输入的字符转成大写(
toUpperCase()),用户输入小写y/n也能识别,更友好; - 简化布尔变量的赋值:比如
math1 = math >=4;,比冗长的if-else简洁易读; - 去掉了多余的中间变量
hope1、art1,直接用physed和art就行,减少冗余。
内容的提问来源于stack exchange,提问作者TurboKiller

