【问题标题】:Scanner NoSuchElementException扫描仪 NoSuchElementException
【发布时间】:2013-03-04 19:34:21
【问题描述】:

我的 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;
    }
}

【问题讨论】:

    标签: java exception java.util.scanner


    【解决方案1】:

    您关闭了多个Scanner,这将关闭底层InputStream,因此另一个Scanner 无法再从相同的InputStreamNoSuchElementException 结果中读取。

    对于控制台应用,请使用单个 Scanner 来读取 System.in

    【讨论】:

    • 感谢您的帮助,eclipse 给了我一个关于不关闭扫描仪的警告,否则我不会添加。
    【解决方案2】:

    由于您在捕获异常的所有三个地方都打印出相同的消息,因此很难确定发生了什么:

    • 使用printStackTrace() 找出异常发生的位置

    • 不要这样抓Exception。捕获您所期望的以及您的代码旨在处理的异常。如果您捕捉到Exception,您最终可能会捕捉到各种意外异常(NPE、文件结尾等)......并且错误地将它们报告为“格式无效"。

    【讨论】:

    • +1。另外,在getValidDouble(String prompt, double min, double max) 中有int i = 0;,你确定要我成为int 吗?
    • 请解释否决票。请注意,问题的原始版本没有说明异常是什么。
    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多