Проблемы, инициализирующие последнюю переменную в Java

Я продолжаю сталкиваться с небольшими изменениями проблемы в Java, и он начинает добираться до меня, и я не могу действительно думать о надлежащем способе обойти его.

У меня есть свойство объекта, которое является окончательным, но динамичным. Таким образом, я хочу, чтобы значение было постоянным когда-то присвоенное, но значение может отличаться каждое время выполнения. Таким образом, я объявляю, что переменная уровня класса в начале класса - говорит private final FILE_NAME;. Затем в конструкторе я присваиваю его, значение - говорит FILE_NAME = buildFileName();

Проблема начинается, когда у меня есть код в buildFileName() метод, который выдает исключение. Таким образом, я пробую что-то вроде этого в конструкторе:

try{
   FILE_NAME = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}

Теперь у меня есть ошибка - "Пустое заключительное поле FILE_NAME, мог не быть инициализирован". Это - то, где я начинаю немного раздражаться в строгом компиляторе Java. Я знаю, что это не будет проблемой, потому что, если это добирается до выгоды, программа выйдет... Но компилятор не знает, что и так не позволяет этот код. Если я пытаюсь добавить фиктивное присвоение на выгоду, я добираюсь - "Заключительное поле FILE_NAME, возможно, уже был присвоен". Я ясно не могу присвоить значение по умолчанию перед выгодой попытки, потому что я могу только присвоить ей однажды.

Какие-либо идеи...?

20
задан froadie 5 May 2010 в 13:51
поделиться

4 ответа

Если подумать, мне кажется, я только что нашел решение! - использовать промежуточную переменную.

String fileName = null;
try{
   fileName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = fileName;

Не знаю, почему мне понадобилось столько времени, чтобы додуматься до этого...

4
ответ дан 30 November 2019 в 00:27
поделиться

Либо

try {
   FILE_NAME = buildFileName();
} catch (Exception e){
   ...
   System.exit(1);
   throw new Error();
}

Или некоторые предпочитают:

private static final String FILE_NAME = fileName();

private static String fileName() {
    try {
        return buildFileName();
    } catch (Exception e){
        ...
        System.exit(1);
        throw new Error();
    }
}

Но вызов System.exit в статическом инициализаторе, вероятно, плохая идея. Это испортит ваши модульные тесты.

7
ответ дан 30 November 2019 в 00:27
поделиться

Я бы лично просто выдал ошибку - если ваш поток ошибок спроектирован правильно, System.exit () должен быть избыточным. Предположительно ваша программа не пойдет в глушь, если выдается ошибка ...?

1
ответ дан 30 November 2019 в 00:27
поделиться

Как насчет

String tempName = null;
try{
   tempName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = tempName;
20
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: