не удается инициализировать статическую конечную переменную в try / catch


Я пытаюсь инициализировать статическую конечную переменную. Однако эта переменная инициализируется в методе, который может выдавать исключение, поэтому мне нужно иметь внутри блока try catch.

Даже если я знаю, что переменная будет инициализирована либо на try, либо на catch блоке, компилятор java выдает ошибку

Последнее поле a, возможно, уже назначено

Вот мой код:

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

}

Я попробовал другой подход, объявив его непосредственно нулевым, но он показывает аналогичную ошибку (в данном случае это кажется мне абсолютно логичным)

Последний полевой тестовый класс.a не может быть присвоено

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

}

Есть ли для этого элегантное решение?

4 3

4 ответа:

Вы можете сначала присвоить значение локальной переменной, а затем присвоить его переменной final после try-catch блок:

private static final String a;

static {

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

}

Это обеспечивает одно назначение переменной final.

Конечные переменные могут быть установлены только один раз.

Вы не можете (и не должны) установить a в null в блоке catch.

Внесите следующее изменение:

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

Частная статическая конечная строка a = null;

Конечные свойства инициализируются только один раз. Либо в конструкторе, либо так, как вы это сделали здесь. Вы не можете дать 'a' новое значение после того, как вы дали ему значение null. Если у вас нет финала, вы можете установить значение с помощью функции fn

Это потому, что переменная final может быть назначена только один раз, и она не может быть переназначена снова.

Ничего общего с try/catch