2012-12-27 7 views
7

Dlaczego następujący kod rzuca wyjątek CloneNotSupportedException w JDK7, ale NIE JDK6?Wyjątek CloneNotSupportedException nawet podczas implementacji Cloneable

public class DemoThread extends Thread implements Cloneable { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     DemoThread t = new DemoThread(); 
     t.cloned(); 
    } 

    public DemoThread cloned() 
    { 
     try { 
      return (DemoThread) super.clone(); 
     } catch (CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 
+3

Podobno metoda została zmieniona zgodnie z następującym uzasadnieniem w Javadocs: 'Zgłasza CloneNotSupportedException jako wątek nie może być sensownie cloned.' –

+0

pomogłoby jeśli włączone ślad stosu – radai

Odpowiedz

6

Oto realizacja wątku z clone() w SE 7

/** 
* Throws CloneNotSupportedException as a Thread can not be meaningfully 
* cloned. Construct a new Thread instead. 
* 
* @throws CloneNotSupportedException 
*   always 
*/ 
@Override 
protected Object clone() throws CloneNotSupportedException { 
    throw new CloneNotSupportedException(); 
} 

wątki nie zostały zaprojektowane, aby być klonowane. Czytanie niektórych tekstów wywołało jedno z komentarzy, które znalazłem w podsumowaniu: "But we either have to disallow cloning or give it meaningful semantics - and the latter isn't going to happen." - David Holmes

+0

Możemy zajrzeć do kodu źródłowego, aby to zobaczyć. Pytanie brzmi, dlaczego nie zostało to zaimplementowane w taki sposób we wcześniejszych wersjach JDK. –

+0

Prawdopodobnie dlatego, że popełnili błąd projektowy, robiąc wątek implementujący klonowanie, i naprawili ten błąd projektu w JDK7. –

+1

Znaleziono coś podobnego - http://weblog.ikvm.net/PermaLink.aspx?guid=23cced47-ccdb-460d-acc9-ce16154ab6a5 – Manish

3

To nie działa, ponieważ wątków nie można sklonować. Wiersz 16 kodu próbuje sklonować nadklasę (wątek), która nie implementuje interfejsu Klonowalny. Poza klonowaniem nici nie jest dobrym pomysłem. Musisz utworzyć nowy wątek. To jedyne możliwe rozwiązanie tutaj.

+0

Należy pamiętać, że aby klasa mogła być Klonowalna, nie jest wymagane, aby jej super klasy narzędzia były Klonowalne też. W końcu obiekt nie implementuje Klonowalnego. – bowmore

Powiązane problemy