首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量可能已被赋值,但无法赋值

变量可能已被赋值,但无法赋值
EN

Stack Overflow用户
提问于 2014-09-07 20:22:02
回答 4查看 2.8K关注 0票数 12

研究以下代码:

代码语言:javascript
复制
public class TestFinalAndCatch {
    private final int i;

    TestFinalAndCatch(String[] args) {
        try {
            i = method1();
        } catch (IOException ex) {
            i = 0;  // error: variable i might already have been assigned
        }
    }

    static int method1() throws IOException {
        return 1;
    }
}

编译器说java: variable i might already have been assigned

但对我来说,这看起来是不可能的情况。

EN

回答 4

Stack Overflow用户

发布于 2014-09-07 20:36:35

问题是,在这种情况下,编译器是基于语法而不是基于语义工作的。有两种变通方法:第一种是在方法上移动异常句柄:

代码语言:javascript
复制
package com.java.se.stackoverflow;

public class TestFinalAndCatch {
    private final int i;

    TestFinalAndCatch(String[] args) {
        i = method1();
    }

    static int method1() {
        try {
            return 1;
        } catch (Exception ex) {
            return 0;
        }
    }
}

第二,基于使用临时变量:

代码语言:javascript
复制
package com.java.se.stackoverflow;

import java.io.IOException;

public class TestFinalAndCatch {
    private final int i;

    TestFinalAndCatch(String[] args) {
        int tempI;
        try {
            tempI = method1();
        } catch (IOException ex) {
            tempI = 0;
        }
        i = tempI;
    }

    static int method1() throws IOException {
        return 1;
    }
}
票数 12
EN

Stack Overflow用户

发布于 2014-09-07 20:22:52

i是最终的,所以它只能赋值一次。编译器可能不够聪明,没有意识到如果抛出异常,第一个赋值就不会发生,如果没有抛出异常,第二个赋值就不会发生。

票数 8
EN

Stack Overflow用户

发布于 2014-09-07 20:38:03

要解决此问题,请在try catch块中使用局部变量,然后将结果赋给实例变量。

代码语言:javascript
复制
public class TestFinalAndCatch {
    private final int i;

    TestFinalAndCatch(String[] args) {
        int tmp;
        try {
            tmp = method1();
        } catch (IOException ex) {
            tmp = 0;
        }
        i = tmp;
    }

    static int method1() throws IOException {
        return 1;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25710109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档