Java汽车模拟程序操作后菜单重复显示问题求助
Java汽车模拟程序菜单重复显示问题解决
问题根源
使用Scanner.nextInt()读取整数时,只会读取数字部分,输入时按下的换行符会留在输入缓冲区中。当循环回到input.nextLine()读取选项时,会直接读取这个空的换行符,导致opzione为空字符串,循环条件!opzione.equalsIgnoreCase("exit")仍然成立,于是菜单会被再次打印,出现重复显示的情况。
解决方法
在每个input.nextInt()之后,添加input.nextLine()语句,用于消费掉缓冲区中残留的换行符,确保下一次input.nextLine()能正确读取用户输入的选项。
修改后的TestAutomobile类代码
package esercizio4; import java.util.Scanner; public class TestAutomobile { public static void main(String[] args) { System.out.println("Benvenuto in questa sessione di simulazione di guida"); System.out.println("Crea la tua macchina"); Scanner input = new Scanner(System.in); System.out.println("Inserisci la marca"); String marca = input.nextLine(); System.out.println("Inserisci il modello"); String modello = input.nextLine(); Automobile auto = new Automobile(marca, modello); String opzione = ""; while(!opzione.equalsIgnoreCase("exit")) { Automobile.stampaOpzioni(); opzione = input.nextLine(); switch(opzione) { case "1": auto.accendi(); break; case "2": auto.spegni(); break; case "3": System.out.println("Quanta benzina vuoi aggiungere? (capienza max 10 litri)"); int benzina = input.nextInt(); input.nextLine(); // 新增:消费换行符 auto.addBenzina(benzina); break; case "4": System.out.println("Di quanto vuoi accelerare? (velocità max 200 kmh)"); int kmh = input.nextInt(); input.nextLine(); // 新增:消费换行符 auto.accelera(kmh); break; case "5": System.out.println("Di quanto vuoi decelerare?"); kmh = input.nextInt(); input.nextLine(); // 新增:消费换行符 auto.decelera(kmh); break; case "6": auto.ferma(); break; case "7": System.out.println(auto); break; } }//Chiusura while input.close(); System.out.println("Hai terminato la simulazione"); System.out.println("Arrivederci"); } }
额外优化提示
- Automobile类的accelera方法逻辑修正:当前逻辑中多个if语句会独立判断,比如车辆未启动时会执行多个分支,建议改为else if链式结构:
public void accelera(int kmh) { if(!accesa) { System.out.println("Errore: la macchina è spenta"); } else if(velocita + kmh > 200) { System.out.println("Errore: non puoi andare a piu di 200 kmh"); } else { setVelocita(getVelocita() + kmh); System.out.println("Hai accelerato di " + kmh + "kmh"); System.out.println("Stai andando a " + getVelocita() + "kmh"); } }
- Automobile类的decelera方法逻辑修正:同样调整为else if链式结构,避免重复判断:
public void decelera(int kmh) { if(!accesa) { System.out.println("Errore: la macchina è spenta"); } else if(velocita <= 0) { System.out.println("Sei già fermo"); } else { setVelocita(Math.max(getVelocita() - kmh, 0)); System.out.println("Hai decelerato di " + kmh + "kmh"); System.out.println("Stai andando a " + getVelocita() + "kmh"); } }
- addBenzina方法边界处理:当前未处理添加后超过最大容量的情况,建议修改为:
public void addBenzina(int benzina) { int livMaxSerbatoio = 10; if(benzina <=0 ){ System.out.println("Errore: inserisci un valore positivo"); } else if(this.benzina + benzina > livMaxSerbatoio) { int aggiungibile = livMaxSerbatoio - (int)this.benzina; this.benzina = livMaxSerbatoio; System.out.println("Non c'è abbastanza spazio: puoi aggiungere massimo " + aggiungibile + " litri"); } else { this.benzina += benzina; System.out.println("Hai inserito " + benzina + " litri"); } }
内容的提问来源于stack exchange,提问作者Bartolomeo Cenisio
相关产品推荐
相关产品推荐

