variable might already have been assigned when it cannot be assigned

后端 未结 4 2072
梦如初夏
梦如初夏 2021-01-17 19:31

research this code:

public class TestFinalAndCatch {
    private final int i;

    TestFinalAndCatch(String[] args) {
        try {
            i = method1()         


        
相关标签:
4条回答
  • 2021-01-17 20:01

    The problem is that in this case compiler works syntax-based not semantic-based. There are 2 workarounds: First base on moving exception handle on method:

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

    Second base on using temporar variable:

    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;
        }
    }
    
    0 讨论(0)
  • 2021-01-17 20:01

    i is final, so it can only be assigned once. The compiler is probably not smart enough to realize that if an exception is thrown, the first assignment won't take place, and if an exception isn't thrown, the second assignment won't take place.

    0 讨论(0)
  • 2021-01-17 20:11

    https://bugs.openjdk.java.net/browse/JDK-6326693?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

    Looks like JDK bug. And now status - Fixed. But I cannot find from which version.

    0 讨论(0)
  • 2021-01-17 20:13

    To overcome this problem, use a local variable in the try catch block and then assign that result to the instance variable.

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题