когда будет выброшено исключение CloneNotSupportedException? - PullRequest
24 голосов
/ 17 июля 2009

Я пролистал старый код и нашел следующее:

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 пустым?

Ответы [ 2 ]

32 голосов
/ 17 июля 2009

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

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

4 голосов
/ 17 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...