如何在一个应用程序中处理 Java 中的多个输入

How to handle multiple inputs in Java in one application

提问人:SSH 提问时间:12/31/2022 最后编辑:dan1stSSH 更新时间:1/1/2023 访问量:136

问:

也许我的标题不是很清楚,但我试图理解这个问题。

问题:我有很多任务,不同的人用自己的方式解决它们。他们可能需要用户的输入来处理它并做他们想做的事,我想单独运行他们的解决方案,以及在一个一次性运行所有解决方案的框架中。以下是我设计为框架的整体简单方法。

但是,正如这段代码直接向我展示的那样,我将得到(使用)(使用)方法。NoSuchElementExceptionScannerStreamClosedBufferedReader

我怎样才能做到这一点,或者我的想法非常错误或遗漏了任何核心概念?

我不想要一个 in main 并将其实例传递给我的所有代码,(这是我唯一可以解决的方法)scanner

public class AssignmentRunner {

    public static void main(String[] args) {
        AssignmentRunner runner = new AssignmentRunner();
        AssignmentExecutor executor = new AssignmentExecutor();
        executor.execute();
    }
}

public interface Assignment {
    void execute();
}

class AssignmentExecutor {
    public List<Assignment> assignmentList ;

    private void addAssignments(){
        assignmentList = new ArrayList<Assignment>();
        assignmentList.add(new Assignment1());
        assignmentList.add(new Assignment2());
    }

    public void execute() {
        addAssignments();
        for (Assignment assigment : assignmentList) {
            assigment.execute();
        }
    }
}

public class Assignment1 implements Assignment {
    String inputString;

    @Override
    public void execute() {
        input();
        System.out.println(inputString);
    }

    private void input() {
        Scanner scanner = new Scanner(System.in);
        try {
            inputString = scanner.nextLine();
        }
        catch (Exception e) {
            System.err.println(e.getMessage());
        }
        finally {
            scanner.close();
        }
    }
}

public class Assignment2 implements Assignment  {
    String inputString;

    @Override
    public void execute() {
        input();
        System.out.println("Hello"+inputString);
    }

    private void input() {
        Scanner scanner = new Scanner(System.in);
        try {
            inputString = scanner.nextLine();
        }
        catch (Exception e) {
            System.err.println(e.getMessage());
        }
        finally {
            scanner.close();
        }
    }
}

编辑:根据一些评论和一个答案,我做了一些修改,请帮助我了解这是我们唯一能做的最好的事情,或者是设计我需求的任何其他方式。

需要例如,不同的学生可以有不同的作业(有些可能需要输入,有些可能不需要任何输入)

  1. 只需打印 Hello World
  2. 输入字符串并显示字数统计
  3. 输入数字显示阶乘
  4. 输入编号 打印其表格

我们希望单独执行每个赋值类,以及从一个 Runner 类执行,如上所示。

修改我对所有类进行了这些修改,显示了理解我所做的事情的示例。

class AssignmentExecutor {
    public List<Assignment> assignmentList ;

    private void addAssignments(){
        assignmentList = new ArrayList<Assignment>();
        assignmentList.add(new Assignment1());
        assignmentList.add(new Assignment2());
    }

    public void execute() {
        Scanner scanner = new Scanner(System.in);
        addAssignments();
        for (Assignment assigment : assignmentList) {
            assigment.execute(scanner);
        }
        scanner.close();
    }
}



    public class Assignment1 implements Assignment {
        String inputString;

    public static void main(String args[]) {
        Assignment1 assignment1 =new Assignment1();
        Scanner scanner = new Scanner(System.in);
        assignment1.execute(scanner);
        scanner.close();
    }
    
        @Override
        public void execute(scanner) {
            input(scanner);
            System.out.println(inputString);
        }
    
        private void input(scanner) {
            scanner = new Scanner(System.in);
            try {
                inputString = scanner.nextLine();
            }
            catch (Exception e) {
                System.err.println(e.getMessage());
            }
        }
    }
Java 多线程 java.util.scanner 用户输入 bufferedreader

评论

2赞 Abra 12/31/2022
不应关闭标准输入流。从两个类中的方法中删除块,并且finallyinputAssignment1Assignment2
2赞 tucuxi 12/31/2022
你也不应该多次包装输入流,除非你真的知道你在做什么。请参见 stackoverflow.com/questions/19766566/java-multiple-scanners。使用类似单一实例的类共享 Scanner 的单个实例。
2赞 tucuxi 12/31/2022
如果你能更好地解释这些要求(这将如何使用?如果我在应用程序中输入一些东西,你的哪个扫描仪应该读取它?),我们也许能够帮助你更好地设计你的应用程序。你的代码是不可修复的 - 除非你改进设计。
1赞 Tom 12/31/2022
要么阻止关闭 System.in,就像这里解释的那样,要么用你自己的 Stream 替换 System.in,以便更好地进行自动化测试,就像这里解释的那样。
0赞 SSH 12/31/2022
@tucuxi我做了一些编辑,请更新您的善意想法

答: 暂无答案