Wrichik Basu
Wrichik Basu

Reputation: 1353

Compilation error in BlueJ- if else with return statement

I am using BlueJ IDE to write java programs.

I have a method with String return type. I have put the return statements within if-else, such that if the boolean variable "flag" has true value, then one value is returned, while if the value is false, another value is returned.

Now, the problem is that BlueJ asks for another return statement even after this, as shown below.

enter image description here

If I give another return after if-else, it works.

Why is this happening? I had learnt that there can be no statements after the return statement. So, why is the compiler asking for another return statement?

If someone wants the code for cut-paste purposes, here it is. This code is meant to convert binary numbers to their decimal equivalents, including fractions, but no negative numbers.

public class Conversions{
    protected String Binary_Decimal(String str){
        int a = str.indexOf('.');
        boolean flag = false;
        if (a == -1){
            str += ".0";
            a = str.indexOf('.');
            flag = true;
        }
        String bd = str.substring(0, a);
        String ad = str.substring(a + 1);
        a = 0;
        double num = 0;
        for (int i = bd.length() - 1; i >= 0; i--){
             num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i)));
            a++;
        }
        if (flag == true){
            return Integer.toString((int) num);
        }
        else if (flag == true) {
            a = -1;
            for (int i = 0; i < ad.length(); i++){
                num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i)));
                a--;
            }
            return String.valueOf(num);
        }
        return String.valueOf(num); //<-- WHY DOESN'T IT RUN WITHOUT THIS EXTRA return?
    }
}

Here, str is the string that is input by the user using a different method Input().

Upvotes: 1

Views: 2358

Answers (3)

Mad Physicist
Mad Physicist

Reputation: 114270

The issue is that you wrote an if - else as an if - else if. The compiler does not understand or care that the two conditions you have are mutually exclusive and therefore cover all cases. Given how you wrote the branches, you need an explicit else or a catchall return for the compiler to be assured that the function always returns a String.

This is one example of why it is a bad idea to explicitly spell out the else when you have a set of conditions. The more important reason being that your if will often contain something much more complex and you might not negate it properly.

Upvotes: 2

Suresh Atta
Suresh Atta

Reputation: 121998

So, why is the compiler asking for another return statement?

Because you are missing a default return statement.

What if none of the conditions you have satisfied ? There must be something return default right ? That is what the issue is. That is why it is getting compiled when you uncomment that line.

Or even , you have an else statement, your program will have at least one satisfied return and it gets compiled too. Try it.

I had learnt that there can be no statements after the return statement.

This statement comes with some conditions. You have the return statement inside the if condition. So if your expression is not true, there is no way that the return gets execute.

Upvotes: 2

AndreaTaroni86
AndreaTaroni86

Reputation: 559

Delete the second ELSE IF clause and put the block directly after the first return statement, and consider that flag is a boolean. As follows:

if (flag) return Integer.toString((int) num);
a=-1;
for(....){
....
}
return String.valueOf(num);

In this way, the compiler should not notify you that error.

Upvotes: 2

Related Questions