在While循环中缺少返回语句没有退出

时间:2015-10-30 03:21:04

标签: java loops if-statement while-loop

我有一个“缺少返回语句”的java方法。我已经对此进行了大量研究,并且知道问题很可能是编译器在'if'函数中找到了一个不提供return语句的路径。但是,应该设置我的while循环,以便当'if'函数中的路径到达不返回任何内容的端点时,它最终会循环整个方法。

该方法的总体目标是让用户输入他们想要输出的文件,但是如果他们选择一个存在的文件然后选择不覆盖它,那么要求新文件名的初始问题是重新执行,直到输入新文件或输入现有文件并且用户同意覆盖它。

TL;博士 我编译时收到一个丢失的返回语句错误,虽然我找不到循环将停止导致方法结束而不返回值的路径。 这是我的代码,有谁知道如何解决这个问题?非常感谢你

public static PrintStream getOutputPrintStream(Scanner console){
    boolean done = false;
    while (!done) {
        System.out.print("Enter output file: ");
        File outFile = new File(console.next());

        if (outFile.exists()) {
            System.out.print("The file " + outFile + " already exists, would you like to overwrite it? (y/n): ");
            String overwrite = console.next();
            overwrite = overwrite.toLowerCase();
            char decision = overwrite.charAt(0);
            if (decision == 'y') {
                try {
                    PrintStream output = new PrintStream(outFile);
                    done = true;
                    return output;
                } catch (FileNotFoundException e){
                    System.exit(1);
                }
            }
        } else {
            try {
                PrintStream output = new PrintStream(outFile);
                done = true;
                return output;
            } catch (FileNotFoundException e){
                        System.exit(1);
            }
        }          
    }    
}

4 个答案:

答案 0 :(得分:1)

在你的while循环条件中,你写了,

C:\Program Files\Spring\spring-1.2.7.RELEASE\bin;

这是错误的,因为while (done = false) 表示assignment操作。您需要比较=,因此请将其重写为:

丑陋的方法

==

好方法

while (done == false) 

但是,您收到错误

  

此方法必须返回错误

因为你的方法while (!done) 没有,如果你的while循环块不会执行!逻辑上它不可能(因为returndone),但编译器不会理解逻辑并引发错误。

变量false实际上对您的代码没有影响,因为您在done之后立即从您的函数返回。请注意, done = true语句会导致执行离开当前子例程。所以你可以使用无限循环,例如:

return

然后你不需要在循环外添加return语句。

答案 1 :(得分:1)

done变量中没有任何意义,因为在设置done = true后,您立即return。你也可以做while(true)。这将解决缺少的return语句问题,因为编译器将能够看到无法在while循环之下结束。

目前,当您编写while而不是while (done = false)时,可能会在while (done == false)循环下方结束(第一个生成 {{1假)。但是,即使将其更改为donewhile (done == false),您仍会收到编译器错误,因为编译器不够复杂,无法推断while (!done)永远不会done检查条件。

答案 2 :(得分:0)

如果代码有一种方法可以运行但是从未达到返回值(例如,如果outFile.exists()为真,则在while循环中但是' decision'不等于')。编译器不够聪明,不能说"哦,但是它在一个while循环中,一旦条件满足就会最终返回"。

对于您的具体示例,请添加

  

返回null;

在while循环之后应该进行编译。

答案 3 :(得分:0)

$ git log
fatal: your current branch 'master' does not have any commits yet