Search code examples
javastaticinitializationfinalstatic-initializer

can not initialize static final variable in try/catch


I am trying to initialize a static final variable. However, this variable is initialized in a method which can throw exception, therefor, I need to have inside a try catch block.

Even if I know that variable will be either initialized on try or on catch block, java compiler produces an error

The final field a may already have been assigned

This is my code:

public class TestClass {

  private static final String a;

  static {
    try {
      a = fn(); // ERROR
    } catch (Exception e) {
      a = null;
    }
  }

  private static String fn() throws Exception {
    throw new Exception("Forced exception to illustrate");
  }

}

I tried another approach, declaring it as null directly, but it shows a similar error (In this case, it seems totally logic for me)

The final field TestClass.a cannot be assigned

public class TestClass {

  private static final String a = null;

  static {
    try {
      a = fn(); // ERROR
    } catch (Exception e) {
    }
  }

  private static String fn() throws Exception {
    throw new Exception("Forced exception to illustrate");
  }

}

Is there an elegant solution for this?


Solution

  • You can assign the value to a local variable first, and then assign it to the final variable after the try-catch block:

    private static final String a;
    
    static {
    
        String value = null;
        try {
            value = fn();
        } catch (Exception e) {
        }
        a = value;
    
    }
    

    This ensures a single assignment to the final variable.