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

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex