扫描器NoSuchElementException
我的Java分配出现问题。我发现了一个意外的异常,特别是:扫描器NoSuchElementException
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;
}
}
你有一个以上的Scanner
先关闭,其中关闭底层InputStream
,因此另一个Scanner
不能再从同一InputStream
和NoSuchElementException
读取结果。
对于控制台应用程序,请使用单个Scanner
来读取System.in
。
既然你打印出所有三个地方的异常被捕获了同样的信息,很难肯定地说,这是怎么回事:
使用
printStackTrace()
找出异常是发生不要捕捉
Exception
这样。捕获您期望的异常,并确保您的代码能够处理。如果你赶上Exception
你可能最终会捕获各种各样的意外的例外(NPE,文件结尾等)......并且不正确报告它们为“无效格式”。
+1。另外,在'getValidDouble(String prompt,double min,double max)'你有'int i = 0;',你确定你想让我成为'int'吗? – Adeeb 2013-03-15 23:10:11
没有看到,谢谢Adeeb。 – user2175782 2013-03-15 23:20:40
请解释downvote。请注意,该问题的原始版本没有说明例外情况。 – 2013-03-16 01:26:09
感谢您的帮助,eclipse给了我一个关于不关闭扫描仪的警告,我不会另外添加。 – user2175782 2013-03-15 23:19:59