java.util.NoSuchElementException重新尝试

时间:2013-04-17 17:41:10

标签: java

好的,我的第一个问题搞砸了,请立即查看。

这是我的错误

 java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextByte(Unknown Source)
at java.util.Scanner.nextByte(Unknown Source)
at Filename.getMenu(Filename.java:38)
at Filename.main(Filename.java:23)

这是我的代码

  import java.util.Scanner;
public class asdasdasd {

    public static void main(String[] args){


        short[] time = {2008, 2009};


        String[] champs = {"Mouths", "Mouths"};

        getMenu(time, champs);
    }

        public static void getMenu(short[] time, String[] champs){
            Scanner keyboard = new Scanner(System.in);
            byte a;

            do{
                System.out.println("\t\t\tMain Menu");
                System.out.println("Select an Option || Example: Type '1' for Seach\n\n");
                System.out.println("\t\t1.Search\n");
                System.out.print("Input the number: ");
                a = keyboard.nextByte();
                if(a == 1){
                    getSearch(time, champs);
                }
              } while(a < 5);
            keyboard.close();
        }

        public static void getSearch(short[] time, String[] champs){
            Scanner keyboard = new Scanner(System.in);
            String Team;
            byte b;
            do{
                System.out.print("\n\nEnter the name of the team: ");
                Team = keyboard.next();
                if("Mouths".equals(Team) || "mouths".equals(Team)){
                    Team = "mouths";

                }
                System.out.print("Start a new Search?\nInput 1 for Yes or any other number to return to the main menu: ");
                b = keyboard.nextByte();

            }
            while(b == 1);

            keyboard.close();                                           


        }
    }

好吧基本上输入是1,然后是嘴,然后是2.然后错误出现了。

对每个愿意提供帮助的人表示抱歉,我没有提供太多信息。我只是害怕被剽窃剽窃。

我已经被告知要使用hasNext()或类似的东西。从来没有使用它,我没有经验。如果有人可以向我展示一个例子,或者如何在这个编码中使用它,那就太好了。

3 个答案:

答案 0 :(得分:3)

nextByte()获取keyboard缓冲区中的第一个字节,但它不使用换行\n字符,这是在第二个字符调用nextByte()时使用的时间。

你应该释放缓冲区

keyboard.nextLine();

之后

keyboard.nextByte();

以及之后

keyboard.next();

为了告诉您的扫描仪直接丢弃剩下的行并从下一行读取

答案 1 :(得分:1)

修改为

if(keyboard.hasNextByte()) 
  a = keyboard.nextByte();

 if(keyboard.hasNext())
 Team = keyboard.next();

适用的地方。在阅读之前清除新行的缓冲区。

答案 2 :(得分:1)

问题出现是因为你打电话给keyboard.close(),我不认为你应该这样做。

getSearch方法退出之前,请关闭正在使用的扫描仪。调用close method of the Scanner class也会关闭扫描仪正在读取的流。在您的情况下,这是System.in。下次getMenu调用keyboard.nextByte()时,它会询问扫描程序(不是getSearch使用的扫描程序)对下一个字节。此扫描仪也在从System.in读取。但是,System.in现已关闭,因此不会有下一个字节要读取。这就是你获得NoSuchElementException

的原因

一般来说,关闭完成的东西是一种好习惯。例如,如果您正在读取文件,则应在完成文件后始终关闭该文件。但是,在程序退出之前,您还没有完成System.in,因此在此之前关闭它是错误的。

至少我会删除keyboard.close()getSearch的来电。我也不担心在getMenu结束时关闭扫描仪。