2015-04-12 3 views
0

Есть ли способ обработать исключение в конструкторе. Каждый раз, когда я использую getter в другом методе, я должен снова объявить исключение. Я попробовал блок try/catch внутри конструктора, но все еще просил другой метод объявить исключение.Обработка общего исключения в конструкторе

+0

Конструкторы AFAIK обрабатывают блоки захвата, как и любой другой код. Вы уверены, что поставили try catch в нужное место? –

+0

Да, у первого есть try catch/block, а второй нет, не уверен, хотя если его правильно поместить – JPark

+0

Почему у вас есть два одинаковых конструктора в примере? Я не понимаю, есть ли у вас блок try-catch, почему он попросит вас объявить исключение? Не могли бы вы опубликовать код, который на самом деле заставляет вас это делать? –

ответ

0

Бросьте его из конструктора и обрабатывайте его в другом месте. Когда конструктор сталкивается с исключительной ситуацией, должен генерировать исключение вместо продолжения и полного построения объекта.

Представьте, если FileInputStream не выбрасывает FileNotFoundException.

Конструкторы могут и должны бросать исключения, когда что-то ломается. Код, вызывающий конструктор (или выше в стеке), обрабатывает его по своему усмотрению (повторное попытку, сбой и т. Д.). В качестве бонуса, half constructed object becomes available for garbage collection, без необходимости слишком беспокоиться об этом.

Предполагая, что Question() бросает FileNotFoundException, вы можете обрабатывать что-то ошибки, как это (я не знаю, ваше реальное приложение, очевидно, так это сделано в качестве примера обработки ошибок):

Question loadQuestion(int id) throws FileNotFoundException { 
    return new Question(getQuestionPath(id)); 
} 

называют:

Set<Question> getQuestionsByCategory(QuestionCategory category) { 
    Set<Integer> ids = getQuestionIds(category); 
    Set<Question> questions = new HashSet<Question>(); 
    for (Integer id : ids) { 
     try { 
      questions.add(loadQuestion(id)); 
     } catch (FileNotFoundException ex) { 
      somelogger("File not found loading question ID " + id, ex); 
      throw ex; 
     } 
    } 
    return questions; 
} 

и, наконец,

public static void main(String[] args) throws FileNotFoundException { 
    Set<Questions> questions = QuestionsLoader 
     .getQuestionsByCategory(QuestionCategory.valueOf(args[0])); 
} 

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

+0

, это означает, что я использую второй конструктор, а затем используйте блок try/catch в другом методе, который использует (в данном случае getter) и обрабатывает его там. Спасибо за вход – JPark

+0

Спасибо, наконец, понял, что вы пытаетесь сказать после 3 дней чтения. Почему я не могу дать kudos btw – JPark

Смежные вопросы