2015-01-29 3 views
1
public class test implements Cloneable { 
    @Override 
    public test clone() { 
     return (test) super.clone(); 
    } 

    public static void main(String[] args) { 
     new test().clone(); 
    } 
} 

Я получаю error: unreported exception CloneNotSupportedException, когда пытаюсь скомпилировать это (по строке 4, а не по основному). Насколько я могу судить, вся цель внедрения Cloneable состоит в том, чтобы избавиться от исключения.Клонируемые броски CloneNotSupportedException

  • Есть ли способ использовать super.clone() без броска или исключения?
  • Действительно ли интерфейс действительно что-то делает?

ответ

4

Есть ли способ использовать super.clone() без бросания или исключения?

Нет, потому что Object#clone() (метод, который вы вызываете с super.clone()) объявляет его.

Действительно ли интерфейс действительно что-то делает?

Да, но очень мало: если вы его не реализуете, Object#clone() фактически выбросит объявленное исключение.

2

Вы должны обработать исключение CloneNotSupportedException, имя класса должно начинаться с заглавной буквы.

Есть ли способ использовать super.clone() без бросания или перехвата исключения ?

Если вы не хотите обрабатывать исключения внутри clone метода используйте throws ключевое слово будет распространяться ваше исключение под названием метода.

public class Test implements Cloneable { 
    @Override 
    public Test clone() throws CloneNotSupportedException{ 
     return (Test) super.clone(); 
    } 

    public static void main(String[] args) { 
     try { 
      new Test().clone(); 
     } catch (CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ли на самом деле сделать интерфейс что-нибудь?

public interface Cloneable 

класс реализует интерфейс Cloneable, чтобы указать на Object.clone() способом, который является законным для этого метода, чтобы сделать поля для полевых копии экземпляров этого класса. read more

+0

Вы не обработали исключение, возникающее в основном методе – User27854

+0

@ user2900314 И какое это исключение должно быть? – Tom

+0

(new test(). Clone() будет генерировать исключение, а исключение - CloneNotSupportedException. – User27854

0

реализация Cloneable (интерфейс маркера: нет методов) не означает избавиться от исключения. его просто, вы говорите компилятору, что в будущем вы сможете создать клон объектов реализации класса. если вы не переопределите метод клонирования автоматически, он вызовет метод класса Object.

  1. Вы должны выбрасывать исключение как свою подпись переопределенного метода.
  2. его определить, что ваш объект может быть клонирован или нет.

, как вы можете видеть в Java Doc:

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

Вы можете throw такое же исключение, если вы не хотите эту функцию !!

Смежные вопросы