Skip to main content

Compiler complains about "missing return statement” even though it is impossible to reach condition where return statement would be missing



In the following method, the compiler complains about a missing return statement even though there is only a single path through the method, and it contains a return statement. Suppressing the error requires another return statement.







public int foo() {

if (true) {

return 5;

}

}







Given that the Java compiler can recognize infinite loops , why doesn't it handle this situation as well? The linked question hints, but doesn't provide details for this specific case.


Comments

  1. JLS 14.21, Unreachable Statements is the section that deals with this:


    The if statement, whether or not it has an else part, is handled in an unusual manner. For this reason, it is discussed separately at the end of this section.


    Ultimately it has to do with how conditional compilation is handled. Consider this method:

    public int foo() {
    if (DEBUG) {
    return 5;
    }
    }


    If DEBUG is static final boolean true; you might think the compiler should be smart enough to realize the method will always return 5. But if it's changed to false, the code is no longer valid.

    The method must be valid for all paths through the method without a source code change, allowing optimizing compilers to omit bytecode without source modifications regardless of the flag's value.

    The very end of the linked JLS section goes in to significant detail.

    ReplyDelete
  2. The reason why the compiler is complaining has to do with this key point from Section 14.21 of the Java Language Specification, discussing unreachable statements:


    Except for the special treatment of while, do, and for statements whose condition expression has the constant value true, the values of expressions are not taken into account in the flow analysis.


    Note that if is not one of the statements that has special handling of true constant conditions. The reason it is excluded from this special handling is to allow if to be used as a form of conditional compilation, as Dave Newton explained in his answer.

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?

CCNA 1 Final Exam 2011 latest (hot hot hot)

  Hi! I have been posted content of ccna1 final exam (latest and only question.) I will post the answer and insert image on sunday. If you care, please subscribe your email an become a first person have full test content. Subcribe now  Some question  have not content because this question have images content. So that can you wait for me? SUNDAY 1. A user sees the command prompt: Router(config-if)# . What task can be performed at this mode? Reload the device. Perform basic tests. Configure individual interfaces. Configure individual terminal lines. 2. Refer to the exhibit. Host A attempts to establish a TCP/IP session with host C. During this attempt, a frame was captured with the source MAC address 0050.7320.D632 and the destination MAC address 0030.8517.44C4. The packet inside the captured frame has an IP source address 192.168.7.5, and the destination IP address is 192.168.219.24. At which point in the network was this packet captured? leaving host A leaving ATL leaving...