eclipse 重复选项菜单[复制]

omvjsjqw  于 12个月前  发布在  Eclipse
关注(0)|答案(1)|浏览(84)

此问题已在此处有答案

Scanner is skipping nextLine() after using next() or nextFoo()?(25个回答)
上个月关门了。
我在这个程序中遇到了一个我无法解释的问题。具体来说,当我选择选项3、4或5并完成操作时,选项菜单会在屏幕上打印两次。
我尝试使用if语句和switch case语句来解决这个问题,但问题仍然存在。

这是类:

package esercizio4;

public class Automobile {
    
    private String marca;
    private String modello;
    private double benzina;
    private boolean accesa;
    private double velocita;
    
    public Automobile(String marca, String modello) {
        this.marca = marca;
        this.modello = modello;
        setBenzina(1);
        setAccesa(false);
        setVelocita(0);
    }
    
    public String getMarca() {
        return marca;
    }
    
    public void setMarca(String marca) {
        this.marca = marca;
    }
    
    public String getModello() {
        return modello;
    }
    
    public void setModello(String modello) {
        this.modello = modello;
    }
    
    public double getBenzina() {
        return benzina;
    }
    
    public void setBenzina(double benzina) {
        this.benzina = benzina;
    }
    
    public boolean getAccesa() {
        return accesa;
    }
    
    public void setAccesa(boolean accesa) {
        this.accesa = accesa;
    }
    
    public double getVelocita() {
        return velocita;
    }
    
    public void setVelocita(double velocita) {
        this.velocita = velocita;
    }
    
    public void accendi() {
        if(getAccesa() == false && benzina > 0) {
            setAccesa(true);
            System.out.println("Hai acceso la macchina");
        } 
        else if(getAccesa() == true){ 
            System.out.println("La macchina è già accesa");
        }
        else if(getAccesa() == false && benzina == 0) {
            System.out.println("Errore: non c'è benzina");
        }
    }
    
    public void spegni() {
        if(getAccesa() == true) {
            setAccesa(false);
            System.out.println("Hai spento la macchina");
        } else {
            System.out.println("La macchina è già spenta");
        }
    }
    
    public boolean isAccesa() {
        if(getAccesa() == true) {
            System.out.println("La macchina è accesa");
        } else {
            System.out.println("La macchina è spenta");
        }
        return accesa;
    }
    
    public void addBenzina(int benzina) { //Problema: ripropone 2 volte il menu opzioni
        int livMaxSerbatoio = 10;
        if (benzina < livMaxSerbatoio) {
            this.benzina += benzina;
            System.out.println("Hai inserito " + benzina + " litri");
        } 
        else if(benzina > livMaxSerbatoio){
            System.out.println("Non c'è abbastanza spazio");
        } 
    }
    
    public void viewBenzina() {
        if(getBenzina() == 10) {
            System.out.println("Il serbatoio è pieno: 10 litri presenti");
        } else {
            System.out.println("Il livello di benzina è: " + getBenzina() + " litri");
        }
    }
    //DA MIGLIORARE
    public void accelera(int kmh) { //Problema: ripropone 2 volte il menu opzioni
        if(velocita < 200 && accesa == true) {
            setVelocita(getVelocita() + kmh);
            System.out.println("Hai accelerato di " + kmh + "kmh");
            System.out.println("Stai andando a " + getVelocita() + "kmh");
        }
        if(accesa == false) {
            System.out.println("Errore: la macchina è spenta");
        }
        else if(velocita > 200 && accesa == true) {
            System.out.println("Errore: non puoi andare a piu di 200 kmh");
        }
    }
    //DA MIGLIORARE
    public void decelera(int kmh) { //Problema: ripropone 2 volte il menu opzioni
        if(velocita > 0 && accesa == true) {
            setVelocita(getVelocita() - kmh);
            System.out.println("Hai decelerato di " + kmh + "kmh");
            System.out.println("Stai andando a " + getVelocita() + "kmh");
        }
        if(accesa == false) {
            System.out.println("Errore: la macchina è spenta");
        }
        else if(kmh > getVelocita()) {
            setVelocita(0);
        }
    }
    
    public void ferma() {
        if(velocita > 0 && accesa == true) {    
            for(int i = (int) getVelocita(); i >= 0; i--) {
                setVelocita(i);
                //System.out.println("Stai andando a " + getVelocita() + " kmh");               
            }
            System.out.println("Ti sei fermato");
        } else {    
            System.out.println("Sei già fermo");
        }
    }
    
    public boolean isInMoto() {
        if(getVelocita() > 0) {
            System.out.println("La macchina sta andando a " + getVelocita() + " kmh");
            return true;
        } else {
            System.out.println("La macchina è ferma");
        }       
        return false;
    }
    
    public String toString() {
        String toString = "Informazioni:" + "\n" +
                          "Marca: " + getMarca() + "\n" +
                          "Modello: " + getModello() + "\n" +
                          "Livello serbatoio: " + getBenzina() + " litri \n" +
                          "Stato accensione: " + getAccesa() + "\n" +
                          "Velocità: " + getVelocita() + " kmh";        
        return toString;
    }
    
    public static void stampaOpzioni() {
        System.out.println("Premi 1 per accendere la macchina");
        System.out.println("Premi 2 per spegnere la macchina");
        System.out.println("Premi 3 per aggiungere la benzina");
        System.out.println("Premi 4 per accelerare");
        System.out.println("Premi 5 per decelerare");
        System.out.println("Premi 6 per fermarti");
        System.out.println("Premi 7 per visualizzare lo stato attuale");
        System.out.println("Premi EXIT per terminare la simulazione");
    }

}

这是ClassTest:

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();
                    auto.addBenzina(benzina);
                    break;
                case "4":
                    System.out.println("Di quanto vuoi accelerare? (velocità max 200 kmh)");
                    int kmh = input.nextInt();
                    auto.accelera(kmh);
                    break;
                case "5":
                    System.out.println("Di quanto vuoi decelerare?");
                     kmh = input.nextInt();
                    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");
        
        
    }

}

这就是我所看到的:

希望您在奎斯塔会议上对您的机器进行指导和模拟
因塞里西拉马尔卡
菲亚特
Inserisci il modello
Punto
Premi 1 per accendere la macchina
Premi 2 per spegnere la macchina
Premi 3 per aggiungere la benzina
Premi 4 per accelerare
Premi 5 per减速
Premi 6 per fermarti
Premi 7 per visualizzare lo stato attuale
PREMI 3 EXIT per terminare la simulazione
你有多少汽油?(capienza max 10 litri)
Hai inserito 8公升
Premi 1 per accendere la macchina
Premi 2 per spegnere la macchina
Premi 3 per aggiungere la benzina
Premi 4 per accelerare
Premi 5 per减速
Premi 6 per fermarti
Premi 7 per visualizzare lo stato attuale
Premi EXIT per terminare la simulazione
Premi 1 per accendere la macchina
Premi 2 per spegnere la macchina
Premi 3 per aggiungere la benzina
Premi 4 per accelerare
Premi 5 per减速
Premi 6 per fermarti
Premi 7 per visualizzare lo stato attuale
Premi EXIT per terminare la simulazione

uinbv5nw

uinbv5nw1#

根据您提供的代码,我注意到在执行Automobile.stampaOpzioni()方法之后,您使用nextInt()方法来读取用户输入。注意,nextInt()方法将只读取一个整数,但是在阅读整数之后,换行符可能会保留在输入流中。这意味着下一次调用input.nextLine()时,它将读取之前输入的换行符,而无需等待用户输入新字符串。

相关问题