can not initialize static final variable in try/catch

3.3k Views Asked by At

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?

4

There are 4 best solutions below

0
Eran On BEST ANSWER

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.

0
Marcus Lanvers On

private static final String a = null;

properties that are final are only initialise once. Either in the Constructor or the way you did it here. You cannot give 'a' a new value after you have given it the value null. If you dont have a final you can set the value via the fn function

2
Shubhendu Pramanik On

It's because final variable can only be assigned only once and it can't be reassigned again.

Nothing to do with try/catch

2
Austin Schaefer On

Final variables can only be set once.

You cannot (and do not need to) set a to null in the catch block.

Make the following change:

public class TestClass {


      private static final String a = setupField();

      private static String setupField() {
        String s = "";
        try {
            s = fn();
        } catch (Exception e) {
          // Log the exception, etc.
        }
        return s;
      }

      private static String fn() throws Exception {
        return "Desired value here";
      }