Ошибка подкласса: CloneNotSupportedException никогда не генерируется в теле попытки - PullRequest
0 голосов
/ 22 октября 2018

Я сейчас занимаюсь практикой по наследованию и глубокому клонированию.

Работа посвящена переписыванию данного нам кода с использованием идей наследования и глубокого клонирования с использованием программы, которая рисует фигуры.на холст.

Сейчас я реализовал метод clone() для суперкласса point и моего подкласса group, но я всегда получаю CloneNotSupportedException с clone() в моемподкласс, когда он компилируется, и я действительно не понимаю, почему.

Вот код для моего суперкласса:

public abstract class Point implements Cloneable
{
public Point clone() 
    {
        try {
             Point copy = (Point)super.clone();
             copy.imgGroup = (ArrayList<Point>)imgGroup.clone();
             return copy;
        }
        catch (CloneNotSupportedException e) {
            throw new InternalError();
        }
     }
}

Вот код для моего подкласса:

public class Group extends Point implements Cloneable
{
public Group clone() 
    {
        try {
            Group copy = (Group)super.clone();
            copy.group = (ArrayList<Point>)group.clone();
            for (int i = 0; i < group.size(); i++) {
                copy.group.set(i,group.get(i).clone());
            }
            return copy;
        }
        catch (CloneNotSupportedException e) {
            throw new InternalError();
        }
    }
}

Задача:

Класс построения Group.Определенный объект Figure можно добавить в несколько разных групп.Вы должны определить, может ли один и тот же объект Figure принадлежать нескольким группам одновременно или нет.В этом упражнении этого не должно быть.Все Group объекты должны владеть исключительно объектами своих предметов.Совместное использование объектов несколькими группами невозможно.

Поэтому начнем с добавления метода:

public Figure class clone ();
// (define it in the same style as on page 4 in the document below)
// this was what point clone() was in the class Point.

После этого были инструкции по реализации некоторых методов и клон Group.

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

Я надеюсьВы можете помочь указать мне правильное направление, просто хотел знать, почему это происходит.Спасибо!

1 Ответ

0 голосов
/ 23 октября 2018

Я всегда получаю исключение CloneNotSupportedException с clone () в моем подклассе

Я предполагаю, что вы получаете;Unreachable catch block for CloneNotSupportedException.

Это потому, что вы исключили throws CloneNotSupportedException из своей подписи суперкласса.Однако в подклассе вы ожидаете, что super.clone() сгенерирует проверенный CloneNotSupportedException.Измените реализацию суперкласса на;

public abstract class Point implements Cloneable {
    public Point clone() throws CloneNotSupportedException { 
        Point copy = (Point) super.clone(); 
        return copy;
    }
}

, чтобы исключение, выброшенное в сигнатуре суперкласса, было видно подклассу.

Обновление

Пожалуйста, следуйте этому комментарию ниже для большей ясности.

Обновление 2

Добавление более подробной информации, так как другой ответ был удален пользователем (где мойкомментарий выше относится к).

Вы не можете создать экземпляр абстрактного класса - но вы все равно можете иметь метод clone() в нем.Но каков конкретный клонированный экземпляр, который абстрактный класс должен возвращать в своем методе клонирования?Когда вы говорите this или super.clone() в абстрактном классе, оба они ссылаются на один и тот же экземпляр подкласса во время выполнения.Это означает, что мелкая копия (Point copy = (Point) super.clone();) является экземпляром Group в вашем случае.Вы можете добавить System.out.println(super.clone().getClass()) в свой абстрактный метод суперкласса 'clone, чтобы засвидетельствовать это.

Таким образом, вы можете глубоко клонировать наследуемые атрибуты в супер абстрактном классе - и - глубоко клонировать только подкласс' атрибуты в подклассе 'метод clone ().Таким образом, вы можете избежать глубокого клонирования атрибутов суперкласса во всех ваших подклассах, если у вас определено несколько подклассов.

...