【问题标题】:Java App not printing menu to screenJava App未将菜单打印到屏幕
【发布时间】:2016-12-23 03:06:27
【问题描述】:

我创建的程序没有从 ClassRosterController 类的 run 方法中打印菜单功能。我在 Netbeans 中运行了调试器,但无法确定问题所在。任何帮助将非常感激。

    package classroster;

    import ClassRosterController.ClassRosterController;

    public class App {


    public static void main(String[] args) {
        ClassRosterController controller = new ClassRosterController();
        controller.run();
    }

    }

        package ClassRosterController;

    import ClassRoster.dao.ClassRosterDao;
    import ClassRoster.dao.ClassRosterDaoImpl;
    import ClassRoster.dto.Student;
    import ClassRoster.ui.ClassRosterView;
    import ClassRoster.ui.UserIO;
    import ClassRoster.ui.UserIOConsoleImpl;
    import java.util.List;

    public class ClassRosterController {

    ClassRosterView view = new ClassRosterView();
    ClassRosterDao dao = new ClassRosterDaoImpl();
    UserIO io = new UserIOConsoleImpl();

    public void run() {
        boolean keepGoing = true;
        int menuSelection = 0;
        while (keepGoing) {

            menuSelection = getMenuSelection();
            io.print("Main Menu");
            io.print("1. List Student IDs");
            io.print("2. Create New Student");
            io.print("3. View a Student");
            io.print("4. Remove a Student");
            io.print("5. Exit");

            menuSelection = io.readInt("Please select from the above choices.", 1, 5);

            switch (menuSelection) {
                case 1:
                    listStudents();
                    break;
                case 2:
                    createStudent();
                    break;
                case 3:
                    io.print("VIEW STUDENT");
                    break;
                case 4:
                    io.print("REMOVE STUDENT");
                    break;
                case 5:
                    keepGoing = false;
                    break;
                default:
                    io.print("UNKNOWN COMMAND");
            }
        }
        io.print("GOOD BYE");

    }

    private void listStudents(){
        List<Student> studentList = dao.getAllStudents();

        view.displayStudentList(studentList);
    }

    private int getMenuSelection() {
        return view.printMenuAndGetSelection();
    }

    private void createStudent(){
        view.displayCreatesStudentBanner();
        Student newStudent = view.getNewStudentInfo();
        dao.addStudent(newStudent.getStudentId(), newStudent);
        view.displayCreateSuccessBanner();
    }
    }


        package ClassRoster.ui;

    import ClassRoster.dto.Student;
    import java.util.List;


    public class ClassRosterView {
    private UserIO io = new UserIOConsoleImpl();

    public int printMenuAndGetSelection() {
        io.print("");
        io.print("");
        io.print("");
        io.print("");
        io.print("");
        io.print("");
        return io.readInt("Please select from the above choices.", 1, 5);
    }

    public Student getNewStudentInfo(){
        String studentId = io.readString("Please enter Student ID");
        String firstName = io.readString("Please enter First Name");
        String lastName = io.readString("Please enter Last Name");
        String cohort = io.readString("Please enter Cohort");
        Student currentStudent = new Student(studentId);
        currentStudent.setFirstName(firstName);
        currentStudent.setLastName(lastName);
        currentStudent.setCohort(cohort);
        return currentStudent;
    }

    public void displayCreatesStudentBanner(){
        io.print("=== Create Student ===");

    }

    public void displayCreateSuccessBanner(){
        io.readString("Student successfully created. Please hit enter to continue.");
    }

    public void displayStudentList(List<Student> studentList){
        for (Student currentStudent: studentList){
            io.print(currentStudent.getStudentId() + ": "
                    +currentStudent.getFirstName() + " "
                    +currentStudent.getLastName());

        }
        io.readString("Please hit enter to continue.");
    }

    public void displayAllBanner(){
        io.print("=== Display All Students ===");
    }
    }



    package ClassRoster.ui;


    public interface UserIO {
        void print(String msg);

    double readDouble(String prompt);

    double readDouble(String prompt, double min, double max);

    float readFloat(String prompt);

    float readFloat(String prompt, float min, float max);

    int readInt(String prompt);

    int readInt(String prompt, int min, int max);

    long readLong(String prompt);

    long readLong(String prompt, long min, long max);

    String readString(String prompt);
    }


package ClassRoster.ui;

import java.util.Scanner;


public class UserIOConsoleImpl implements UserIO {
    Scanner userInput = new Scanner(System.in);

    @Override
    public void print(String msg) {
        System.out.println(msg);
    }

    @Override
    public double readDouble(String prompt) {

        System.out.println(prompt);
        double inputNumber = userInput.nextDouble();
        return inputNumber;

    }

    @Override
    public double readDouble(String prompt, double min, double max) {
        System.out.println(prompt);
        double inputNumber = userInput.nextDouble();
        boolean loop = true;
        do{
            if(inputNumber < min || inputNumber > max){
            System.out.println("Please enter a number between " + min +" and " + max);
        }
            else {
                loop = false;
            }

        }while(loop);


        return inputNumber;
    }

    @Override
    public float readFloat(String prompt) {
        System.out.println(prompt);
        float inputNumber = userInput.nextFloat();


        return inputNumber; 
    }

    @Override
    public float readFloat(String prompt, float min, float max) {
        System.out.println(prompt);
        float inputNumber = userInput.nextFloat();
        boolean loop = true;
        do{
            if(inputNumber < min || inputNumber > max){
            System.out.println("Please enter a number between " + min +" and " + max);
        }
            else {
                loop = false;
            }

        }while(loop);



        return inputNumber; 
    }

    @Override
    public int readInt(String prompt) {
        System.out.println(prompt);

        int inputNumber = userInput.nextInt();


        return inputNumber;  
    }

    @Override
    public int readInt(String prompt, int min, int max) {
        System.out.println(prompt);
        int inputNumber = userInput.nextInt();
        boolean loop = true;
        do{
            if(inputNumber < min || inputNumber > max){
            System.out.println("Please enter a number between " + min +" and " + max);
        }
            else {
                loop = false;
            }

        }while(loop);



        return inputNumber; 
    }

    @Override
    public long readLong(String prompt) {
        System.out.println(prompt);
        long inputNumber = userInput.nextLong();


        return inputNumber; 
    }

    @Override
    public long readLong(String prompt, long min, long max) {
        System.out.println(prompt);
        long inputNumber = userInput.nextLong();
        boolean loop = true;
        do{
            if(inputNumber < min || inputNumber > max){
            System.out.println("Please enter a number between " + min +" and " + max);
        }
            else {
                loop = false;
            }

        }while(loop);



        return inputNumber; 
    }

    @Override
    public String readString(String prompt) {
       System.out.println(prompt);
       String inputString = userInput.nextLine();


        return inputString; 
    }

}


package ClassRoster.dto;

public class Student {
    private String firstName;
    private String lastName;
    private String studentId;
    private String cohort;

public Student(String studentId){
    this.studentId = studentId;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getStudentId() {
    return studentId;
}

public String getCohort() {
    return cohort;
}

public void setCohort(String cohort) {
    this.cohort = cohort;
}




}



package ClassRoster.dao;

import ClassRoster.dto.Student;
import java.util.List;


public interface ClassRosterDao {


    Student addStudent(String studentId, Student student);


    List<Student> getAllStudents();

    Student getStudent(String studentId);

    Student removeStudent(String studentId);


}

package ClassRoster.dao;

import ClassRoster.dto.Student;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



public class ClassRosterDaoImpl implements ClassRosterDao {

    private Map<String, Student> students = new HashMap<>();

    @Override
    public Student addStudent(String studentId, Student student) {
       Student newStudent = students.put(studentId, student);
       return newStudent;
    }

    @Override
    public List<Student> getAllStudents() {
        return new ArrayList<Student>(students.values());
    }

    @Override
    public Student getStudent(String studentId) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Student removeStudent(String studentId) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

【问题讨论】:

    标签: java inheritance interface switch-statement


    【解决方案1】:

    首先,readInt() 中的 do-while 循环已损坏。 while(loop = true) 会无限期地将循环设置为true。将其替换为while(loop)。其次,如果inputNumber 不在范围内会发生什么?您永远不会在该循环中再次提示用户输入!因此,如果他们第一次没有正确的输入,该循环将无限期地运行。

    第三,为什么你的提示被打印你的循环。之前不想提示用户吗?

    【讨论】:

    • 感谢您的信息。我现在将进行这些修改,看看它是否有效。
    • 进行了调整。现在我遇到了 readString 方法的问题。如果我将其更改为 next(),它允许我输入 StudentID。但是,它不再允许我在“请按 Enter 继续”后退出。如果我在 readString 方法中保留 nextLine(),它将跳过“请输入学生 ID”
    • @statsguyz 您的代码中有几个问题可能会给您带来奇怪的结果。我测试了你的代码,如果你按回车键退出,然后输入一个数字,它应该可以工作。我认为您看到了这个问题,因为正如我之前所说,您在 得到输入后打印提示,这让您感到困惑。你需要把它们放在前面。我认为您这样做可能是因为 Scanner 有时会出现新行问题(请参阅here)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2015-06-06
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多