8

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?

Luis Sep
  • 2,334
  • 4
  • 25
  • 32
  • Note:Instance variable not need to initialize but the local variable(variable inside a method) need to initialize – gjman2 Aug 07 '13 at 09:25

5 Answers5

8

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

Sanjaya Liyanage
  • 4,366
  • 9
  • 33
  • 50
4

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

Juvanis
  • 25,000
  • 3
  • 61
  • 84
3

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);
}
sanbhat
  • 16,864
  • 6
  • 46
  • 62
  • I'd consider this an anti-pattern, as it clutters the code with unnecessary if-not-null checks! The try/catch mechanism is there to avoid such pattern: if the creation of some required objects fails, the function should leave through an exception. – Gyro Gearless Aug 07 '13 at 09:35
  • True, i agree. My intention was to give the solution and explain why we get error – sanbhat Aug 07 '13 at 09:42
3

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!

Gyro Gearless
  • 4,803
  • 3
  • 16
  • 14
0

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); 
}
Mohsin Shaikh
  • 496
  • 1
  • 3
  • 11