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

时间:2014-05-09 10:50:24

标签: 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 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(),它似乎工作正常。所以我相信这是因为我从两个派生自同一抽象类的类中调用相同的方法。有没有办法解决这个问题?谢谢你的帮助!

编辑:我发现如果我没有从第一个箭头类中关闭kb,它就不会抛出这个错误。我只能假设它因为我关闭System.in这就是它导致问题的原因。任何人都可以向我解释为什么另一个Scanner实例(System.in)不只是重新“打开”System.in?

2 个答案:

答案 0 :(得分:1)

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

if (kb.hasNextInt()){
    lengthTail = kb.nextInt();
}

在您的情况下,我认为您没有提供足够的输入,这可能导致NoSuchInputException。 有关详细信息,请查看the Scanner class doc

答案 1 :(得分:0)

问题在于Scanner对象在您调用right.drawHere()时,您使用System.in初始化了扫描器kb,这将缓冲System.in中可用的所有数据,将其留空以备将来使用它在left.drawHere()中抛出NoSuchElementException。

<强>解决方案:

Scanner对象kb设为静态,并且LeftArrowRightArrow

均可访问