[英]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 循环块不会执行,您的方法return
不return
任何内容! 从逻辑上讲done
是不可能的(因为done
是false
),但编译器不会理解逻辑并引发错误。
变量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.