繁体   English   中英

没有退出的 While 循环中缺少 Return 语句

[英]Missing Return Statement within While Loop w/no exits

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

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

tl;dr 我在编译时收到一个缺少 return 语句错误,尽管我找不到循环停止导致方法结束而不返回值的路径。 这是我的代码,有谁知道如何解决这个问题? 非常感谢

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);
            }
        }          
    }    
}

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

while (done = false)

这是错误的,因为=表示赋值操作。 您需要比较== ,因此将其重写为:

丑陋的做法

while (done == false) 

好方法

while (!done) 

但是,您收到错误

这个方法必须返回一些错误

因为如果您的 while 循环块不会执行,您的方法returnreturn任何内容! 从逻辑上讲done是不可能的(因为donefalse ),但编译器不会理解逻辑并引发错误。

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

while(true)

那么你不需要在循环外添加 return 语句。

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

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

如果有一种方法可以让代码运行但从未命中返回值(即,如果 outFile.exists() 为真但“决策”不等于“y”,则在 while 循环中)您的代码将无法编译。 编译器不够聪明,不能说“哦,但它处于 while 循环中,一旦满足条件,最终将返回”。

对于您的具体示例,添加

返回空;

在while循环之后应该让它编译。

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

            if (outFile.exists()) {
            // if file exixts
                  System.out.print("The file " + outFile + " already exists, would you like to overwrite it? (y/n): ");
                  char decision = console.next().toLowerCase().charAt(0);
                  if (decision == 'y') {
                     done = true;
                      output = createStream(outFile);
                   }
             } else {
            // if file does not exist
                done = true;
                output = createStream(outFile);
            }
        }
        return output;
    }

static PrintStream createStream(File outFile) {
    PrintStream output = null;
    try {
        output = new PrintStream(outFile);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return output;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM