2013-08-07 84 views
7

我有一些代码,使这个结构内检测未检查异常抛出:局部变量可能尚未初始化 - 方法

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

我有,我有相同的代码在catch不少方法块,所以我想提取它到一个方法,以便我可以保存一些行。我的问题是,如果我这样做,我会得到一个编译器错误“ 本地变量o可能没有被初始化”。

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(); 
} 

有什么解决方法吗?

+0

注:实例变量不需要初始化,但局部变量的方法(内部变量)需要初始化 – gjman2

回答

5

需要初始化局部变量它们被用作以下

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

之前,直到您使用的未初始化

+1

如果变量由于某种原因必须是最终的,那么它们并不适合。在这种情况下,我赞成由@ gyro-gearless提供的解决方案。 – Eusebius

3

由于o是获得try块中初始化,初始化o可能会引发异常,JAVA认为doSomething(o)语句可能会达到不o被初始化。所以java想要o被初始化,因为new Object()会抛出异常。

所以初始化onull会解决这个问题

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); 
} 
+0

我会考虑这是一种反模式,因为它会通过不必要的if-not-null检查来混淆代码! try/catch机制可以避免这种模式:如果某些所需对象的创建失败,则该函数应该通过异常。 –

+0

是的,我同意。我的意图是提供解决方案,并解释为什么我们得到错误 – sanbhat

3

初始化你的对象:Object o = null;,但提防NullPointerException那时你给它的方法调用可能抛出。

2

只要把doSomething(o)try { }局部变量您将无法获得编译失败块:

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

} 

如果创建对象失败,您可能不想执行doSomething()!

0

实例变量是对象类型,所以你应该初始化值“空”

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