我想知道为什么在Java中允许以下代码,而不会出现编译错误?在我看来,此代码通过不返回any来破坏方法签名String
。有人可以解释一下我在这里想念的东西吗?
public class Loop {
private String withoutReturnStatement() {
while(true) {}
}
public static void main(String[] a) {
new Loop().withoutReturnStatement();
}
}
该}
方法的最终版本无法访问-只有在可能返回方法末尾而不返回值的情况下,您才会收到编译错误。
这在由于异常而导致方法的末尾无法到达的情况下更有用。
private String find(int minLength) {
for (String string : strings) {
if (string.length() >= minLength) {
return string;
}
}
throw new SomeExceptionIndicatingTheProblem("...");
}
规则在JLS第8.4.7节中:
如果声明某个方法具有返回类型(第8.4.5节),则如果该方法的主体可以正常完成(第14.1节),则会发生编译时错误。
您的方法无法正常完成,因此没有错误。重要的是,不仅是它不能正常完成,而且规范还 承认 它不能正常完成。从JLS
14.21开始
:
一
while
当且仅当下面至少有一个为真语句可以正常完成:
- 该
while
语句是可到达的,条件表达式不是带有value的常数表达式(第15.28节)true
。- 有一个可到达的
break
语句退出该while
语句。
在您的情况下,条件表达式 是
一个带有value的常量true
,并且没有任何break
语句(可到达或其他方式),因此该while
语句无法正常完成。
我想知道为什么在Java中允许使用以下代码,而不会出现编译错误?在我看来,这段代码通过不返回任何来破坏方法签名。谁能解释一下我错过了什么吗?
问题内容: 尽管我知道问这个问题会有点愚蠢,但我仍然想查询有关它的技术观点的更多信息。 无限循环的简单示例: 如何从此类外部中断(停止)此无限循环(例如,在继承的帮助下)? 问题答案: 即使写这篇文章我也觉得很脏,但是… 从不同的线程,你可以调用一个实现,抛出一个当你调用。
我一直在研究GNU的g编译器编译的汇编,它看起来像一个无限循环(g -S file.c -o的部分输出): 除了最后一条jmp指令之外,所有这些指令都是movq或计算指令,但这只是让我们回到.L3。这是以下代码的主体: 它是如何退出循环的?看起来它只是减少了i(subq$1,-8(%rbp)),并在没有比较的情况下重新启动。
MongoCredential.createCredential()对根据文档(Groovy with gmongo)看来有效的参数抛出错误响应。 我试图执行的代码: 得到以下错误: Groovy.lang.MissingMethodException:方法没有签名:静态com.mongodb.mongoCredential.createCredential()适用于参数类型:(java.lang
在Groovy中使用以下代码时。。。 ...我得到以下例外: 捕获:groovy.lang.丢失方法异常:方法printDocument()的签名不适用于参数类型(java.lang.字符串,java.lang.字符串,java.lang.整数,java.lang.字符串,java.lang.字符串,java.lang.整数,java.lang.整数,java.lang.整数,java.lang.
问题内容: 我有一个无限的while循环,我想在用户按下某个键时退出。通常,我用来获取用户的响应。但是,我不必等待响应。我想要这样的东西: 这应该很简单,但是我似乎无法弄清楚。我倾向于使用线程的解决方案,但我不想这样做。我该怎么做? 问题答案: 我认为您可以使用msvcrt做得更好: 可悲的是,仍然是特定于Windows的。