3

我写了一个示例代码:

import java.util.Scanner;

 public class abcd {
    public static void main(String[] args) {
        System.out.print("please enter a: ");
        Scanner a = new Scanner(System.in);
        String b = a.next();
        System.out.println(b);
    }
}

我可以通过 Ubuntu 终端编译和执行这段代码。在 SciTe 中,它编译得很好,但是当我运行它时,我遇到了这个错误:

please enter a: Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at abcd.main(abcd.java:8)

有什么建议么?

编辑:当我在终端中执行文件时,我会:'java abcd' Scite 会:'java -cp .abcd'。这两个命令有何不同,为什么 java -cp 不起作用?

4

3 回答 3

1

在 Linux/Unix 上的 SciTE 中处理标准输入似乎存在错误/不正确的实现。

错误的描述和解决方法在这个 PDF 文档中:Linux 上 SciTE Go 命令的问题

注意:这不是官方文档,但它似乎与您的问题相匹配。

根据该文档,当通过 SciTE 上的“Go”命令运行 Java 程序时,输入应该来自输出窗格。但是,在 Linux 上,这不能正常工作,就好像您正在从一个空流中读取一样。

当您从空流中读取Scanner时,会在尝试使用 等读取值时看到文件结束标记next()nextInt()它会抛出 aNoSuchElementException因为流中没有输入元素。

解决此问题的选项:

  • 尝试上述文档中提到的方法,在 Linux 终端中使用“Go”而不是输出窗格。
  • 在终端中运行程序并完全避免“Go”命令。
  • 使用没有此问题的其他 IDE。
于 2016-02-20T11:58:04.990 回答
0

尝试在 next() 之前使用 hasNext();

import java.util.Scanner;
public class abcd {
  public static void main(String[] args) {
    System.out.print("please enter a: ");
    Scanner a = new Scanner(System.in);
    while(a.hasNext()) {
      try {
        String b = a.next();
        System.out.println(b);
      } catch (NoSuchElementException e) {}
    }
  }
}
于 2016-02-20T10:59:13.240 回答
0

我并不是要冒犯,但是按照Alexander 的回答中的建议使用 hasNext()并不能解决这个问题,它只会使 OP 能够很好地处理它。我不认为这是他/她正在寻找的。

现在我无论如何都不是专家,出于某种原因,您的程序代码可以在我的机器上运行......但是无论如何,当您的程序在可迭代对象上循环并且没有更多可以循环的内容时,会抛出NoSuchElementException ,尽管您的程序期待那里的东西。在Scanner.next()的 Java 文档中快速查找 表明,如果没有更多可读取的令牌,则会引发此异常。

现在,如果我不得不猜测,我会建议你尝试使用其他东西Scanner.next(),看看它是否有效。

它在我的机器上运行但在你的机器上运行的事实有点令人惊讶,所以你能提供一些关于你如何尝试运行你的程序的信息吗?您是从默认命令行运行它吗?还是在 Scite 内?(如果是第二个,我真的帮不了你,我什至都没碰过Scite)。

于 2016-02-20T11:06:07.540 回答