Java 尝试调用kb.nextInt()时出现NoTouchElementException

Java 尝试调用kb.nextInt()时出现NoTouchElementException,java,Java,快速提问。对Java还是相当陌生的,我的测试类给了我这个错误 Please enter length of tail: Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at java.util.Scanner.nextInt(Unknown Sourc

快速提问。对Java还是相当陌生的,我的测试类给了我这个错误

Please enter length of tail: Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at LeftArrow.drawHere(LeftArrow.java:18)
at ArrowTest.main(ArrowTest.java:75)
下面是测试类的代码

public class ArrowTest
{
    public static void main(String args[])
    {
        RightArrow right = new RightArrow();
        LeftArrow left = new LeftArrow();

        System.out.println("RightArrow Class: Calling drawHere()");
        right.drawHere();

        System.out.println("LeftArrow Class: Calling drawHere()");
        left.drawHere();                  //Error pointing to this line
                                          // (at ArrowTest.main(ArrowTest.java:75))
    }
} 
这是RightArrow和LeftArrow类的代码,只是相关的代码。我对错误所指的行进行了注释

 public class RightArrow extends ShapeBase
 {
     public void drawHere()
    {
        int lengthTail, widthHead;
        Scanner kb = new Scanner(System.in);

        System.out.print("Please enter length of tail: ");
        lengthTail = kb.nextInt();
        System.out.print("Please enter an odd numbered width of arrowhead: ");
        widthHead = kb.nextInt();
    }


   public class LeftArrow extends ShapeBase
 {
     public void drawHere()
    {
        int lengthTail, widthHead;
        Scanner kb = new Scanner(System.in);

        System.out.print("Please enter length of tail: ");
        lengthTail = kb.nextInt(); //Error pointing to this line at LeftArrow.drawHere(LeftArrow.java:18)
        System.out.print("Please enter an odd numbered width of arrowhead: ");
        widthHead = kb.nextInt();
    }
我在测试类中注释掉了right.drawHere(),它似乎工作正常。所以我确信这是因为我从两个派生自同一个抽象类的类调用同一个方法。有没有办法解决这个问题?谢谢你的帮助


编辑:我发现如果我不关闭调用的第一个arrow类的kb,它不会抛出这个错误。我只能假设这是因为我关闭了系统。这就是它导致问题的原因。有人能向我解释为什么创建另一个Scanner实例(System.in)不只是重新“打开”系统。在?

调用
nextInt
方法之前,您可以在Scanner对象上使用
hasNextInt()
方法检查是否有要获取的值,这可以用来避免异常。试试这个:

if (kb.hasNextInt()){
    lengthTail = kb.nextInt();
}
在您的情况下,我认为您没有提供足够的输入,这可能导致
NoSuchInputException

查看以获取更多信息。

问题在于,当您调用
right.drawHere()时,Scanner对象在哪里
在这里,您使用
系统初始化了扫描仪kb。在
中,这将缓冲
系统中的所有可用数据。在
中,它保留为空以供将来使用,因此它在
left.drawHere()中抛出NoTouchElementException

解决方案:

Scanner
object
kb
设置为静态,可供
LeftArrow
RightArrow