可能尚未初始化局部变量 - 检测方法中未经检查的异常抛出

Lui*_*Sep 7 java compiler-errors exception unchecked

我有一些这种结构的代码:

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

我有很多方法,我在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();
}
Run Code Online (Sandbox Code Playgroud)

有没有解决方法?

San*_*age 6

您需要在使用之前初始化局部变量,如下所示

public void method() {
    Object o=null;
    try {
        o = new Object();
    } catch (Exception e) {
        handleError();
    }
   doSomething(o); 
}
Run Code Online (Sandbox Code Playgroud)

在使用未初始化的局部变量之前,您将无法获得编译失败


san*_*hat 5

由于o在块内进行初始化try并且初始化o可能会引发异常,因此 java 认为该doSomething(o)语句可能会在未o初始化的情况下到达。所以java想要o初始化以防new Object()抛出异常。

所以初始化o可以null解决这个问题

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);
}
Run Code Online (Sandbox Code Playgroud)