Java try / catch - “找不到返回”或“未初始化变量”?

时间:2012-10-07 22:24:20

标签: java compiler-errors

我一直盯着这几个小时,无法想到解决方案;我通常用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”,这会破坏操作的目的。任何帮助表示赞赏......

8 个答案:

答案 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 +“不被识别为有效的双重来处理异常。”