Question

I have some code with this structure:

public void method() {
    Object o;
    try {
        o = new Object();
    } catch (Exception e) {
        //Processing, several lines
        throw new Error(); //Our own unchecked exception
    }
    doSomething(o);
}

I have quite a few methods in which I have the same code in the catch block, so I want to extract it to a method so that I can save some lines. My problem is, that if I do that, I get a compiler error " The local variable o might not have been initialized".

public void method() {
    Object o;
    try {
        o = new Object();
    } catch (Exception e) {
        handleError();
    }
    //doSomething(o); compiler error
}


private void handleError() throws Error {
    //Processing, several lines
    throw new Error();
}

Is there any workaround?

Was it helpful?

Solution

You need to initialize local variables before they are used as below

public void method() {
    Object o=null;
    try {
        o = new Object();
    } catch (Exception e) {
        handleError();
    }
   doSomething(o); 
}

You will not get the compilation failure until you use local variable which was not initialized

OTHER TIPS

Since o is getting initialized within the try block and initializing o might throw an exception, java thinks that doSomething(o) statement might reach without o being initialized. So java wants o to be initialized incase new Object() throws exception.

So initializing o with null will fix the issue

public void method() {
    Object o = null;
    try {
        o = new Object(); //--> If new Object() throws exception then o remains uninitialized
    } catch (Exception e) {
        handleError();
    }
    if(o != null)
      doSomething(o);
}

Initialize your object: Object o = null;, however watch out for the NullPointerExceptions that might be thrown when you give it to the method calls.

Just put the doSomething(o) inside the try { } block:

public void method() {
    Object o;
    try {
        o = new Object();
        doSomething(o);
    } catch (Exception e) {
        handleError();
    }

}

You perhaps dont want to execute doSomething() if the creation of your Object fails!

Instance variable is the Object type so you should initialize value "null"

public void method() {
Object o=null;
try {
    o = new Object();
} catch (Exception e) {
    handleError();
}
doSomething(o); 
}

It happens because compiler doesn't know if handlerError always throws the Error. For example, there can be a logic in handleError method that makes it returns before throwing exception.

If you want to extract error handling into method, you can do this in this way:

public void method() {
    Object o;
    try {
        o = new Object();
    } catch (Exception e) {
        throw handleError();
    }
    System.out.println(o);
}


private Error handleError() {
    //Processing, several lines
    return new Error();
}

Now the compiler sees the throw word in catch block, and it is sure that the exception will be thrown.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top