Java代码中混用三元运算符、if/else及switch可行吗?程序中断求助
解决Scanner混合nextInt()和nextLine()导致程序中途停止的问题
你的程序中途停止的核心原因是**Scanner.nextInt()只读取整数内容,不会处理输入后的换行符**:
当你输入选项数字(比如1)并按下回车时,nextInt()只取走了数字,回车产生的换行符还留在输入缓冲区里。后续执行type.nextLine()时,它会直接读取这个空的换行符,导致switch语句匹配不到任何case,直接走default分支输出"Thank you!",看起来就像程序中途停止了。
修复方案
最简单的修复方式是在nextInt()之后,额外调用一次type.nextLine()来消耗掉残留的换行符:
/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license */ package com.operators; import java.util.Scanner; /** * * @author Casner */ public class Operators { public static void main(String[] args) { Scanner type = new Scanner(System.in); System.out.print("Welcome to Chip and Burger Joint, would you like to order? please type Yes or No: "); String st = type.nextLine(); String b = "You are now leaving Chip and Burger Joint"; String c = "Start your order: " ; String ord = "Yes".equals(st)? c:b; System.out.println(ord); if(ord.equals(c)){ System.out.print("You have 3 options: 1. Chips only, 2. Burger only, 3. Meal, Please Choose: "); int ord1 = type.nextInt(); // 新增:消耗掉nextInt()残留的换行符 type.nextLine(); if(ord1 == 1){ System.out.print("Please enter MM for mini, S for small, M for medium and L for large: "); String chips = type.nextLine(); switch(chips){ case "MM": System.out.println("You picked mini chips"); break; case "S": System.out.println("You picked small chips"); break; case "M": System.out.println("You picked medium chips"); break; case "L": System.out.println("You picked large chips"); break; default: System.out.println("Thank you!"); } } else if(ord1 == 2){ System.out.print("Please enter C for Chicken burger or B for Beef burger: "); String burger = type.nextLine(); switch(burger){ case "C": System.out.println("You picked Chicken burger"); break; case "B": System.out.println("You picked Beef burger"); break; // 修复漏写的break,避免匹配后执行default default: System.out.println("Thank you!"); } } else if(ord1 == 3){ System.out.println("Please enter CM for chicken burger meal or BM for beef burger meal"); String bm = type.nextLine(); switch(bm){ case "CM": System.out.println("You picked Chicken burger meal"); break; case "BM": System.out.println("You picked Beef burger meal"); break; default: System.out.println("Thank you!"); } } else System.out.println("Thank You!"); } //System.out.println("Thank you!"); } }
另外还顺便修复了一个小问题:第二个switch的case "B"后面原本漏写了break,会导致匹配到B时,先输出牛肉汉堡,再执行default输出"Thank you!",现在已经补上。
另一种更稳健的方案(可选)
如果想彻底避免这类缓冲区问题,可以统一用nextLine()读取所有输入,再把需要整数的部分手动转换:
// 替换原来的nextInt()部分 System.out.print("You have 3 options: 1. Chips only, 2. Burger only, 3. Meal, Please Choose: "); String ordStr = type.nextLine(); int ord1 = Integer.parseInt(ordStr);
这种方式可以更好地处理用户输入非整数的情况(比如输入字母),不过需要额外添加异常处理来防止转换失败。
内容的提问来源于stack exchange,提问作者Tshepo
相关产品推荐
相关产品推荐

