0

我正在尝试读取这种格式的输入

4 4
* . . .
. . . .
. * . .
. . . .
4 4
* * . .
. . . .
. . . .
. . * .

我能够读取前两个数字,当我尝试读取符号时出现异常。我可以使用 BufferedReader 读取每一行并解析输入,但为什么我不能使用扫描仪执行此操作?

这是我的代码

        public static void main(String[] args) {
                Scanner in = new Scanner(System.in);
                while (in.hasNextLine()) {
                    Scanner s = new Scanner(in.nextLine());
                    if (!s.hasNextLine())
                        break;

                    int x = s.nextInt(); // 4
                    int y = s.nextInt(); // 4
                    for (int i = 0; i <= x - 1; i++) {
                        for (int j = 0; j <= y - 1; j++) {
                            System.out.println(s.hasNext()); // false
                            String symbol = s.next(); //NoSuchElementException WHY?
                        }
                    }
                }
            }
        }
4

2 回答 2

2

当那里没有任何数字时,您不应该尝试读取数字。

你的循环,在伪代码中,看起来像

While there is a line available:
    s = NextLine()
    x = FirstInt(s)
    y = SecondInt(s)
    // Some other stuff

当您分配到xandy时,除了第一行之外没有可用的数字,因此您的应用程序崩溃。

与问题相匹配的更好的解决方案是

Scanner in = new Scanner(System.in);
if (!in.hasNextInt()) exitAndPrintError();
int rows = in.nextInt();
if (!in.hasNextInt()) exitAndPrintError();
int cols = in.nextInt();
for (int r = 0; r < rows; r++) {
    for (int c = 0; c < cols; c++) {
        if (!in.hasNext()) exitAndPrintError();
        process(in.next());
    }
}

该解决方案实际上并不会检查太多错误,而是将所有错误报告留给exitAndPrintError您必须编写的某个函数。

附带说明:如果您尝试s.hasNext()并返回 false,那么如果s.next() 没有引发异常,您应该会感到惊讶。这就是这些hasNext*方法可用的原因Scanner——它们让您有机会知道何时到达输入的末尾,而不是尝试读取比可用输入更多的输入。


我将把它作为一个练习来更新此代码以处理单个文件中的多组数据,但这并不难。您发布的代码中的关键错误是,如果您s仅使用 from 中的一行创建扫描仪,您将不会在正在处理in的单行中找到多行结构。s

于 2013-02-07T02:16:48.710 回答
1

承受整体设计问题,我会回答你的问题。

你得到了,NoSuchElementException因为,你猜怎么着,s没有更多的元素。s.hasNext()它的输出返回 false变得更加明显。

原因很简单。s您使用单行分配in.

要修复整个程序,您只需要使用一个扫描仪,而不是它的多个实例。

于 2013-02-07T02:22:00.110 回答