一尘不染

Java多重扫描仪

java

我有一个创建多个Integer对象并将其放入一个类的类,LinkedList如下所示:

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调用该方法后将出现错误“找不到行” 。

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

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


阅读 424

收藏
2020-03-20

共1个答案

一尘不染

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

最简单的方法是在这种情况下使用单例,因为它包装了另一个单例(最好是将Scanner作为参数传递)

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,请仅将其关闭。

我将如何解决它?

最好的解决方案是在一处,一种方法或一类中使用所有Scanner。你可以让main()与用户进行所有交互,并将值传递给数据结构。拥有会自行初始化的对象是一种不好的做法,如果你开始这样做,那么它将在你的其余开发日子中困扰你;)(严重的是,你会一遍又一遍地看到这一点,这通常是一场噩梦)

BTW切勿在没有解释的情况下退出程序。System.exit(0);甚至没有错误消息的呼叫也是一场噩梦。我曾经从事过一个项目,该项目经常对System.exit()进行260次调用,而没有出现错误消息,你可以想象诊断出服务器只是出于无故停止的诊断是多么有趣。

2020-03-20