Подтвердить что ты не робот

Когда будет выбрано CloneNotSupportedException?

Я просматриваю старый код и обнаружил следующее:

public class MyClass implements Cloneable {

    public Object clone() {
        Object o = null;
        try {
            o = super.clone();
        } catch (CloneNotSupportedException ex) {
        }
        return o;
    }

}

Я прочитал javadocs в Object.clone(), и я пытаюсь понять, почему этот улов существует даже там. Я имею в виду, я понимаю, что он должен быть там, потому что Object.clone() выдает его, но когда он когда-либо будет там, если я только расширяю Object по умолчанию, и этот класс приписывает Cloneable? Если этот класс был расширен и подкласс не реализовал Cloneable, это то, что он там для?

Так хорошо ли оставить этот блок catch пустым?

4b9b3361

Ответ 1

Нет, не оставляйте его пустым. Войдите и выбросьте RuntimeException. Всегда делайте это для вещей, которые, по вашему мнению, невозможны - таким образом, если в конечном итоге это невозможно, оно рассматривается как непредвиденная ошибка (а именно), а не просто возвращение null, как будто ничего плохого не произошло.

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

Ответ 2

нет проблем при повторном броске или исключении. Ваш объект MyClass никогда не будет бросать CloneNotSupportedEx, потому что он вызывается только тогда, когда интерфейс не реализован. См. Javadoc для Clonable

По соглашению классы, реализующие этот интерфейс, должны переопределить Object.clone(который защищен) с помощью общедоступного метода. Видеть {@link java.lang.Object # clone()} для получения дополнительной информации об переопределении этого метод.

Обратите внимание, что этот интерфейс not содержит клон. Поэтому невозможно клонировать объект просто в силу того, что он реализует этот интерфейс. Даже если метод clone активируется рефлексивно, нет что это будет успешным.