9

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

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

有什么解决方法吗?

4

6 回答 6

8

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

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

在使用未初始化的局部变量之前,您不会出现编译失败

于 2013-08-07T09:15:25.647 回答
5

由于ois 在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);
}
于 2013-08-07T09:14:57.160 回答
4

初始化你的 object: Object o = null;,但是NullPointerException当你把它交给方法调用时要注意可能抛出的 s 。

于 2013-08-07T09:15:21.053 回答
3

只需将块doSomething(o)try { }

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

}

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

于 2013-08-07T09:23:03.493 回答
0

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

public void method() {
Object o=null;
try {
    o = new Object();
} catch (Exception e) {
    handleError();
}
doSomething(o); 
}
于 2013-08-07T09:37:25.693 回答
0

发生这种情况是因为编译器不知道是否handlerError总是抛出Error. 例如,handleError方法中可能有一个逻辑,使其在抛出异常之前返回。

如果你想将错误处理提取到方法中,你可以这样做:

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

现在编译器throw在 catch 块中看到了这个词,并且可以肯定会抛出异常。

于 2021-09-30T18:09:45.757 回答