扫描器NoSuchElementException异常(Scanner NoSuchElementE

2019-07-21 18:19发布

我在与我的Java分配的问题。 我发现了一个意外的异常,特别是:

java.util.NoSuchElementException:没有找到行

我使用的Scanner(System.in)和程序不断读什么和重复“无效的格式”异常文本。 如果我输入一个正确的估价int ,第一部分通过,然后double部分立即进入此异常。 如果我输入不正确的值int ,然后开始循环异常。

这里是我的代码:

import java.util.Scanner;

public class Program_4 {

    public static void main(String[] args) {
        getValidInt("Enter an integer from 5 to 50",5,50);
        getValidDouble("Enter a double from 5.0 to 50.0",5.0,50.0);
        getValidString("Enter a string with length from 5 to 8 characters",5,8);
    }


    public static int getInt(String prompt)
    {
       Scanner sc = new Scanner(System.in);
       int i = 0;
       boolean isValid;
       do
       {
          try
          {
             System.out.print(prompt + ": ");
             i = Integer.parseInt(sc.nextLine());
             isValid = true;
          } 
          catch (Exception e)
          {
              System.out.println(e);
              System.out.print("Invalid Format: ");
              isValid = false;
          }
       }
       while (isValid == false);
       sc.close();
       return i;
    }

    public static int getValidInt(String prompt, int min, int max)
    {
        int i = 0;
        boolean isValid = false;
        do
        {
            i = getInt(prompt);
            if(i < min) System.out.println("Value must be >= " + min);
            else if(i > max) System.out.println("Value must be <= " + max);
            else isValid = true;
        } while (isValid == false);

        return i;
    }

    public static double getDouble(String prompt)
    {
       Scanner sc = new Scanner(System.in);
       double i = 0.0;
       boolean isValid;
       do
       {
          try
          {
             System.out.print(prompt + ": ");
             i = Double.parseDouble(sc.nextLine());
             isValid = true;
          } 
          catch (Exception e)
          {
              System.out.println(e);
              System.out.println("Invalid Format: ");
              isValid = false;
          }
       } while (isValid == false);
       sc.close();
       return i;
    }

    public static double getValidDouble(String prompt, double min, double max)
    {
        int i = 0;   
        boolean isValid = false;
        do
        {
            i = getInt(prompt);
            if(i < min) System.out.println("Value must be >= " + min);
            else if(i > max) System.out.println("Value must be <= " + max);
            else isValid = true;
        } while (isValid == false);

        return i;
    }

    public static String getString(String prompt)
    {
       Scanner sc = new Scanner(System.in);
       String i="";
       boolean isValid;
       do
       {
          try
          {
             System.out.print(prompt + ": ");
             i = sc.nextLine();
             isValid = true;
          } 
          catch (Exception e)
          {
              System.out.print("Invalid Format: ");
              isValid = false;
          }
       } while (isValid == false);
       sc.close();
       return i;
    }

    public static String getValidString(String prompt, int min, int max)
    {
        String i;
        boolean isValid = false;

        do
        {
            i = getString(prompt);
            if(i.length() < min) System.out.println("String must be more than "       + min + " characters.");
            else if(i.length() > max) System.out.println("String must be more     than " + max + " characters.");
            else isValid = true;
        } while (isValid == false);

        return i;
    }
}

Answer 1:

你有一个以上的Scanner先关闭,这关闭底层InputStream ,因此另一种Scanner无法再从同一读取InputStreamNoSuchElementException结果。

对于控制台应用程序,使用一个Scanner从阅读System.in



Answer 2:

既然你打印出所有三个地方的异常被捕获了同样的信息,就很难有把握正在发生的事情说:

  • 使用printStackTrace()找出其中的例外是发生

  • 不要捕捉Exception这样的。 抓住你期待和你的代码是专门用来处理异常。 如果你发现Exception你可能最终会赶上各种意外的异常(NPE,文件尾等)......并错误地报告他们是“无效的格式”。



文章来源: Scanner NoSuchElementException