Компилятор не знает, что SomeHandlerInProject.throwCustomErr()
всегда выдает исключение, поэтому, если анализ кода компилятора идет, метод может возвращаться нормально.
Если это произойдет, какое значение будет иметь значение user
быть? Это не будет иметь значения, поэтому компилятор жалуется на это, как и должно быть. Помните, что класс SomeHandlerInProject
можно изменить, чтобы он не генерировал исключение, без необходимости перекомпиляции класса с помощью метода getUser()
, поэтому компилятор будет правильно пожаловаться на него.
Даже если вы знаю, что метод всегда выдает исключение, вам все равно нужно написать код, как если бы он этого не делал, поэтому вы должны присвоить значение user
либо путем его инициализации, либо путем присвоения ему в catch
block.
Если цель состоит в том, чтобы поделиться логикой c, необходимой для создания исключения, вы должны сделать вспомогательный метод return
исключением, а не вызывать его, и позволить вызывающей стороне сделать throw
. Таким образом компилятор не будет жаловаться:
public User getUser(String userid) {
User user;
try {
// some code to get User
} catch (InterruptedException e) {
throw SomeHandlerInProject.buildCustomErr();
}
return user;
}
class SomeHandlerInProject {
public static CustomException buildCustomErr() {
return new CustomException();
}
}
Трассировка стека остается прежней, поскольку это расположение конструктора, которое является моментальным снимком для стека вызовов.