Java 多扫描程序

2022-09-03 04:44:55

我有一个类,它创建多个对象并将它们放入如下所示:IntegerLinkedList

public class Shares<E> implements Queue<E> {
    protected LinkedList<E> L;

    public Shares() {
        L = new LinkedList<E>();
    }

    public boolean add(E price) {
        System.out.println("How many of these shares would you like?");
        Scanner scanInt;
        scanInt = new Scanner(System.in);
        Integer noShares = scanInt.nextInt();
        for (int i = 0; i < noShares; i++) {
            L.addLast(price);
        }
        scanInt.close();

        return true;
    }
}

我有一个应用程序,它从控制台扫描输入“add”,如果找到,将调用如下所示的方法:add

public class Application {
    private static Scanner scan;

    public static <E> void main(String[] args) {
        Queue<Integer> S = new Shares<Integer>();
        scan = new Scanner(System.in);
        System.out.println("Please type add");
        String sentence = scan.nextLine();
        while (sentence.equals("quit") == false) {
            if (sentence.equals("add")) {

                System.out
                    .println("What price would you like to buy your shares at?");

                S.add((Integer) scan.nextInt());

            } else
                System.exit(0);

            sentence = scan.nextLine();
        }
    }
}

应用程序应允许用户根据需要多次输入“add”,但在调用方法后会出现错误“未找到行”。add

我猜这是因为方法中的方法尚未关闭,然后在需要时重新打开。这是程序的问题吗,如果是这样,我将如何修复它?Scanner

请注意,此程序尚未完成,因为我将添加一种出售这些股票的销售方法。这就是我使用 while 循环的原因。


答案 1

为任何流设置多个包装器都是真正让自己感到困惑的好方法。我建议你只包装一次流,除非你真的知道你在做什么。

执行此操作的最简单方法是在这种情况下使用单例,因为它包装另一个单例(最好的方法是将扫描程序作为参数传递)

public class Application { 
    // use this Scanner in all you other code, don't create another one.
    static final Scanner scan = new Scanner(System.in);

    public static <E> void main(String[] args) {

我猜这是因为方法中的扫描仪尚未关闭

关闭流后,它将关闭基础流,您无法再次使用它。仅当要防止再次使用 System.in 时才关闭它。

我该如何修复它?

最好的解决方案是将所有扫描仪都集中在一个地方,一种方法或一个类。你让你的main()完成与用户的所有交互,并将值传递给你的数据结构。拥有初始化自己的对象是一种不好的做法,如果你开始这样做,它会在剩下的开发日困扰你,;)(说真的,你会一次又一次地看到这样做,这往往是一场噩梦)


BTW 永远不要在没有解释的情况下退出程序。甚至没有错误消息的呼叫也是一场噩梦。我曾经做过一个项目,它有260次调用System.exit()通常没有错误消息,你可以想象诊断一个服务器只是无缘无故地停止是多么有趣。System.exit(0);


答案 2

第一个错误是这行代码

scanInt.close();

关闭 System.in,而不仅仅是 scanInt 对象。这意味着在第一次调用 add 后,扫描对象将仅使用它已有的输入,然后您将收到 NoSuchElementException:删除此行。

现在,如果您将最后一行替换为此

sentence = scan.nextLine();
System.out.println("sentence: \"" + sentence + "\"");

您将看到在退出之前获得的最后一个输入是一个空字符串。因此,在下一个循环中,您输入 else 语句,程序将停止执行。您可以通过添加以下内容来解决此问题:

scan.nextLine(); // consume the first always empty String...
System.out.println("Please type add");
sentence = scan.nextLine(); // and then get the actual value

但是,我同意Peter的观点,即您不应该使用多个包装器。请考虑将 Scanner 对象作为参数传递到 Shares 类承包商中。


推荐