Выдает исключение рефакторинга в java - PullRequest
0 голосов
/ 14 января 2020

Я изменяю свой код с

Implementation 1 : 
public User getUser(String userid) {
    User user;
    try {
        // some code to get User

    }catch(InterruptedException e) {
        throw new CustomException();
    }

    return user;
}

на

Implementation 2 : 
public User getUser(String userid) {
    User user;

    try {
        // some code to get User

    }catch(InterruptedException e) {
        SomeHandlerInProject.throwCustomErr();
    }

    return user;
}


class SomeHandlerInProject {
    public static void throwCustomErr() {
        throw new CustomException();
    }
}

Реализация 2 дает ошибку компиляции, что пользователь не может быть инициализирован, может кто-то помочь, что я здесь упускаю, кажется очень странно для меня.

1 Ответ

1 голос
/ 14 января 2020

Компилятор не знает, что 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();
    }
}

Трассировка стека остается прежней, поскольку это расположение конструктора, которое является моментальным снимком для стека вызовов.

...