我一直盯着这几个小时,无法想到解决方案;我通常用regex处理这种类型的验证,但我试图使用内置的解决方案进行更改(显然,我不经常这样做):
private static double promptUserDecimal(){
Scanner scan = new Scanner(System.in);
System.out.println("Enter a decimal");
try{
double input2 = Double.parseDouble(scan.nextLine());
return input2;
} catch(NumberFormatException e){
System.out.println("Sorry, you provided an invalid option, please try again.");
}
}
这个错误是编译器找不到“return”,所以我得到一个编译错误。如果我将“return”放在try / catch之外,我需要声明/初始化“input2”,这会破坏操作的目的。任何帮助表示赞赏......
答案 0 :(得分:3)
在catch
部分中抛出异常。无论您何处调用promptUserDecimal
方法,都要捕获任何异常并在那里打印消息:
public static void main(String[] args) {
double d = 0.0;
while (double == 0) {
try {
d = promptUserDecimal();
} catch (NumberFormatException e) {
//log the message...
d = 0.0;
}
}
}
private static double promptUserDecimal() throws NumberFormatException {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a decimal");
return Double.parseDouble(scan.nextLine());
}
这是一种更好的方法,因为你让promptUserDecimal
只关心处理读取双精度值。您必须尝试将每个类和方法分开以实现其设计的特定目的。
答案 1 :(得分:3)
您需要以下内容:
double input2;
try{
//read input2
}catch( ... ){
//... log AND assign a value to input2 in case of invalid input
}
return input2;
答案 2 :(得分:3)
如果您希望用户“请再试一次”,听起来您需要一个循环:
private static double promptUserDecimal(){
final Scanner scan = new Scanner(System.in);
// Ask for input until we get something valid
while (true) { // Terminated by return within
System.out.println("Enter a decimal");
try {
return Double.parseDouble(scan.nextLine());
} catch(NumberFormatException e){
System.out.println("Sorry, you provided an invalid option, please try again.");
// No return, so the loop will run again
}
}
}
答案 3 :(得分:1)
让你的方法抛出异常或返回nan。
答案 4 :(得分:0)
您可以在catch块中抛出异常。即,
private static double promptUserDecimal() throws OopsException {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a decimal");
try{
double input2 = Double.parseDouble(scan.nextLine());
return input2;
} catch(NumberFormatException e){
System.out.println("Sorry, you provided an invalid option, please try again.");
throw new OopsException();
}
}
然后,每次他们提供无效输入时,您都可以捕获它并在调用方法的地方处理它。
答案 5 :(得分:0)
private static double promptUserDecimal(){
Scanner scan = new Scanner(System.in);
System.out.println("Enter a decimal");
double input2 = 0.0; // <-- explicit initialization
try{
double input2 = Double.parseDouble(scan.nextLine());
} catch(NumberFormatException e){
System.out.println("Sorry, you provided an invalid option, please try again.");
}
return input2;
}
答案 6 :(得分:0)
你需要从(或在捕获之后)返回或扔东西。根据您对用户的输出判断,看起来您只想再次执行相同的操作。只需再次调用该方法并返回结果。
private static double promptUserDecimal(){
Scanner scan = new Scanner(System.in);
System.out.println("Enter a decimal");
try{
double input2 = Double.parseDouble(scan.nextLine());
return input2;
} catch(NumberFormatException e){
System.out.println("Sorry, you provided an invalid option, please try again.");
return promptUserDecimal();
}
}
答案 7 :(得分:0)
列出的一些解决方案将解决编译器问题,但第一步是退后一步并询问“如果发生NumberFormatException,我想做什么?”
一种选择是通过重新抛出NumberFormatException或将其包装在RuntimeException中来传播异常,以便取消选中它。这意味着调用代码将必须处理它,或者将向用户呈现堆栈跟踪。如果你走这条路,你甚至不需要在你的方法中尝试捕获。你可以在方法签名上声明“抛出NumberFormatException”并让它在上游处理。
另一种选择是返回null,或者使用“return null”作为catch块中的最后一个语句,或者返回null作为方法中的最后一个语句。这是一个糟糕的选择,因为调用代码和/或最终用户将无法获得他们需要的信息,“输入了非数字作为输入。”
我会使用选项一,并通过告诉用户scan.nextline +“不被识别为有效的双重来处理异常。”