![](/img/trans.png)
[英]Why if-else if-else (within a loop) in method gives “return statement missing” while all if-else branches have a return statement?
[英]if-else and if only when method has return statement - are they same?
private Object methodName(){
if(cond) {
return x;
}
return null;
}
private Object methodName(){
if(cond) {
return x;
} else {
return null;
}
}
出于好奇,我得到了这个问题。 我最初以第二种方式编写代码。 然后当我再次查看它时,我将其更改为第一种方式,因为两者都满足我的需求。
JVM 处理的方式真的有什么不同吗? 我理解 if 和 else, if then 后跟语句的用例。 我只想知道提到的“返回某些东西”的情况。
大量方法调用的时间复杂度是否相同?
让我们看看字节码,好吗? 我写了一个包含 3 个方法的类,一个带有 if-else,一个带有 if-only,一个带有三元运算符(第四个方法rand()
只不过是获取随机真/假值的助手):
// class version 55.0 (55)
// access flags 0x21
public class com.stackoverflow/Ifs {
// compiled from: Ifs.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 5 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public ifElse()Ljava/lang/String;
L0
LINENUMBER 7 L0
INVOKESTATIC com.stackoverflow/Ifs.rand ()Z
IFEQ L1
L2
LINENUMBER 8 L2
LDC "result"
ARETURN
L1
LINENUMBER 10 L1
FRAME SAME
ACONST_NULL
ARETURN
L3
LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L3 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public ifOnly()Ljava/lang/String;
L0
LINENUMBER 15 L0
INVOKESTATIC com.stackoverflow/Ifs.rand ()Z
IFEQ L1
L2
LINENUMBER 16 L2
LDC "result"
ARETURN
L1
LINENUMBER 19 L1
FRAME SAME
ACONST_NULL
ARETURN
L3
LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L3 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public ternary()Ljava/lang/String;
L0
LINENUMBER 23 L0
INVOKESTATIC com.stackoverflow/Ifs.rand ()Z
IFEQ L1
L2
LINENUMBER 24 L2
LDC "result"
GOTO L3
L1
LINENUMBER 25 L1
FRAME SAME
ACONST_NULL
L3
LINENUMBER 23 L3
FRAME SAME1 java/lang/String
ARETURN
L4
LOCALVARIABLE this Lcom.stackoverflow/Ifs; L0 L4 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0xA
private static rand()Z
L0
LINENUMBER 29 L0
INVOKESTATIC java/util/concurrent/ThreadLocalRandom.current ()Ljava/util/concurrent/ThreadLocalRandom;
INVOKEVIRTUAL java/util/concurrent/ThreadLocalRandom.nextBoolean ()Z
IRETURN
MAXSTACK = 1
MAXLOCALS = 0
}
如果您对未编译的 Java 代码感兴趣,请参考:
public class Ifs {
public String ifElse() {
if (rand()) {
return "result";
} else {
return null;
}
}
public String ifOnly() {
if (rand()) {
return "result";
}
return null;
}
public String ternary() {
return rand()
? "result"
: null;
}
private static boolean rand() {
return ThreadLocalRandom.current().nextBoolean();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.