Sadece sözdizimini tatmin etmek için bir return ifadesine sahip olmak kötü bir uygulama mı?


82

Aşağıdaki kodu göz önünde bulundurun:

public Object getClone(Cloneable a) throws TotallyFooException {

    if (a == null) {
        throw new TotallyFooException();
    }
    else {
        try {
            return a.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
    //cant be reached, in for syntax
    return null;
}

return null;Bir istisna yakalanmış olabilirler çünkü ancak biz zaten boş durumunda kontrol (ve biz klonlama destekleri aradığınız sınıfı biliyorum varsayalım sağlar) biz try deyimi başarısız asla biliyorum çünkü böyle bir durumda, gereklidir.

Yalnızca sözdizimini tatmin etmek ve derleme hatalarından kaçınmak için (buna ulaşılmayacağını açıklayan bir yorumla) ekstra return ifadesini sonuna koymak kötü bir uygulama mıdır, yoksa böyle bir şeyi kodlamanın daha iyi bir yolu var mı? return ifadesi gereksiz mi?


25
Yönteminiz bir Objectparametre alır . Eğer adestekleyen bir sınıf değildir cloneyöntemi (veya bu tanımlanır Object?) Veya bir hata sırasında oluşursa cloneyöntemiyle (veya şu anda düşünemiyorum başka bir hata), bir özel durum olabilir ve siz ulaşacak dönüş ifadesi.
Arc676

26
Nihai getiriye ulaşılamayacağı varsayımınız yanlıştır. Tamamen Cloneablebir CloneNotSupportedException. Kaynak: javadocs
Cephalopod

20
"Ulaşılamıyor" şeklinde yorumladığınız koda ulaşılabilir. Yukarıda bahsedildiği gibi CloneNotSupportedException'dan bu satıra bir kod yolu var.
David Waterworth

7
Buradaki temel soru: Aradığınız sınıfın klonlamayı desteklediğini varsayıyorsanız, neden istisnayı yakaladınız? İstisnalar gereken istisnai davranışlar için atılmasına.
deworde

3
@wero AssertionErroryerine giderdim InternalError. İkincisi, JVM'de bir şeyler ters giderse özel kullanım için görünüyor. Ve temelde koda ulaşılmadığını iddia ediyorsunuz.
kap

Yanıtlar:


135

Ekstra bir dönüş ifadesi olmadan daha net bir yol aşağıdaki gibidir. Ben de yakalayamazdım CloneNotSupportedException, ama arayana bırak.

if (a != null) {
    try {
        return a.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
}
throw new TotallyFooException();

Başlangıçta sahip olduğunuzdan daha basit bir sözdizimi ile sonuçlanmak için sırayla uğraşmak neredeyse her zaman mümkündür.


28
Bu gerçekten iyi bir genel noktayı gösteriyor. Kendinizi java'nın gereksinimleriyle savaşırken bulursanız, bu genellikle bir şeyi optimal olmayan bir şekilde yapmaya çalıştığınız anlamına gelir. Genellikle rahatsız olursam geri çekilirim ve resmin tamamına bakarım ve daha açık hale getiren farklı bir şekilde kodlanıp kodlanamayacağını anlamaya çalışırım - genellikle vardır. Java'nın küçük nitpicklerinin çoğu, onları kucakladığınızda inanılmaz derecede yardımcı olur.
Bill K

3
@BillK: Maroun Maroun'un belirttiği gibi, bu kodun farklı anlamsallıkları var.
Deduplicator

5
AssertionErrorbenzer niyetle TotallyFooException(aslında mevcut olmayan) yerleşik bir sınıftır .
user253751

5
@BillK: "Kendinizi java'nın gereksinimleri ile savaşırken bulursanız, bu genellikle bir şeyi optimal olmayan bir şekilde yapmaya çalıştığınız anlamına gelir." ya da Java'nın hayatınızı kolaylaştıran bir özelliği desteklememeye karar verdiğini.
user541686

5
@Mehrdad, ... ancak buna bu şekilde bakmak, gelecekteki Java sürümleri veya alternatif bir dil için RFE'ler üzerinde çalışan bir kişi değilseniz, pratik olarak yararlı bir yere götürmez. Yerel deyimleri öğrenmenin gerçek, pratik bir avantajı vardır, oysa dili suçlamak (herhangi bir dil, yeni sözdizimi eklemeye izin vermek için a-la-LISP'yi desteklemediği sürece) bir şeyi ilk yapmak istediğiniz yolu desteklemediği için değil.
Charles Duffy

101

Kesinlikle ulaşılabilir. Yığın izini yalnızca catchcümlede yazdırdığınızı unutmayın .

Senaryoda a != nullorada ve olacak bir istisna olmak return null olacaktır ulaşılabilir. Bu ifadeyi kaldırıp yerine koyabilirsiniz throw new TotallyFooException();.

Genelde * , eğer nullbir olduğunu geçerli bir yöntem sonucu (yani kullanıcı beklediğini ardından "veri bulunamadı" veya istisna oldu için bir sinyal olarak iade onu ve bir şey anlamına gelir) olduğu değil iyi bir fikir. Aksi halde neden geri dönmemen gerektiği konusunda bir sorun görmüyorum null.

Örneğin Scanner#ioExceptionyöntemi ele alalım :

IOExceptionBu Tarayıcının temelindeki Okunabilirlik tarafından atılan son değeri döndürür . Böyle bir istisna yoksa bu yöntem null döndürür .

Bu durumda, döndürülen değerin nullaçık bir anlamı vardır, yöntemi kullandığımda, nullyalnızca böyle bir istisna olmadığı için aldığımdan emin olabilirim ve yöntemin bir şeyler yapmaya çalışıp başarısız olmasından değil.

* Bazen nullanlam belirsiz olsa bile geri dönmek isteyeceğinizi unutmayın . Örneğin HashMap#get:

Null dönüş değeri, eşlemenin anahtar için hiçbir eşleme içermediğini göstermez; haritanın anahtarı açıkça null olarak eşlemesi de mümkündür . containsKeyOperasyon bu iki durumu ayırt etmek için kullanılabilir.

Bu durumda null, değerin null bulunduğunu ve döndürüldüğünü veya karma eşlemin istenen anahtarı içermediğini gösterebilir .


4
Puanlarınız geçerli olsa da, bunun sadece berbat API tasarımı olduğunu belirtmek isterim. Her iki yöntem de sırasıyla bir Optional<Throwable>veya döndürmelidir Optional<TValue>. Not: Bu, cevabınızın bir eleştirisi değil, bu iki yöntemin API tasarımıdır. (Bununla birlikte, yalnızca tüm Java API'sinde değil, aynı zamanda .NET'te de yaygın olan oldukça yaygın bir tasarım hatasıdır.)
Jörg W Mittag

4
Java 8 tesislerinin kullanılıp kullanılmayacağını bilmiyorsanız "berbat" oldukça zordur.
Thorbjørn Ravn Andersen

2
Ama nullolduğu değil , geçerli bir dönüş değeri, dönen nullbir daha da kötü bir fikirdir. Başka bir deyişle, nullbeklenmedik bir durum için geri dönmek asla iyi bir fikir değildir.
Holger

1
@Holger Geçerli değil demek istediğim , örneğin kullanıcı içeremeyen bir veri yapısından bir değer almayı beklediğinde null, o nullzaman hiçbir zaman "geçerli" bir dönüş değeri olamaz, yani normalden ziyade başka bir şeyi belirtmesi gerekir. geri dönüş değeri. Bu durumda geri dönmenin özel bir anlamı var ve bu tasarımda yanlış bir şey görmüyorum (tabii ki kullanıcı bu durumu nasıl ele alacağını bilmeli).
Maroun

1
Buradaki nokta şudur: "Kullanıcı bu durumu nasıl idare edeceğini bilmeli" null, arayanın uğraşması gereken olası bir dönüş değeri olduğunu belirtmeniz gerektiği anlamına gelir . Bu onu geçerli bir değer yapar ve biz de "geçerli" yi "kullanıcı beklediği ve bir anlamı olduğu " şeklinde tanımladığınız gibi burada "geçerli" anlayışına sahibiz . Ama burada durum zaten farklı. OP, kod yorumuna göre, geri dönüşün yanlış return null;olduğunu ima eden "ulaşılamaz" ifadesine sahip olduğunu iddia ettiğini belirtir null. Bunun throw new AssertionError();yerine ...
Holger

26

Yalnızca sözdizimini sağlamak ve derleme hatalarını önlemek için ekstra return ifadesini sonuna koymak kötü bir uygulama mıdır (ulaşılmayacağını açıklayan bir yorumla)

bence return nullUlaşılamaz bir şubenin sonu için kötü bir uygulama . Bir şeyler çok yanlış gitti ve uygulama bilinmeyen bir durumda olduğu için o satıra ulaşmak için bir RuntimeException( AssertionErroraynı zamanda kabul edilebilir) atmak daha iyidir . Çoğu bunun gibi (yukarıdaki gibi) çünkü geliştirici bir şeyi gözden kaçırmıştır (Nesneler sıfır ve klonlanamaz olabilir).

Sanal makineden daha büyük olasılıkla hata yaptığım için InternalError, kodun erişilemez olduğundan (örneğin a'dan sonra System.exit()) çok emin olmadığım sürece, muhtemelen kullanmam .

Özel bir istisna (örneğin TotallyFooException) kullanırım, eğer bu "ulaşılamaz hatta" ulaşmak, bu istisnayı attığınız başka herhangi bir yerde olduğu gibi aynı anlama geliyorsa.


3
Yorumlarda başka bir yerde belirtildiği gibi AssertionError, bir "olamaz" olayı düzenlemek için de makul bir seçim olabilir .
Ilmari Karonen

2
Şahsen bir SomeJerkImplementedClonableAndStillThrewACloneNotSupportedExceptionException. Belli ki genişleyecektir RuntimeException.
w25r

@ w25r Yukarıdaki kodu kullanmıyorum, ancak temel soruyu yanıtlıyorum. Verilen Cloneablegenel bir clone()yöntem uygulamaz ve clone()nesnede protectedyukarıdaki kod aslında derlemez.
Michael Lloyd Lee mlk

Kaçma ihtimaline karşı pasif-agresif bir istisna kullanmam (müşterilerimizden birinin a alması ne kadar komik olursa olsun JerkException, takdir edileceğini sanmıyorum).
Michael Lloyd Lee mlk

14

Yakaladınız, CloneNotSupportedExceptionbu da kodunuzun başa çıkabileceği anlamına geliyor. Ancak onu yakaladıktan sonra, işlevin sonuna geldiğinizde ne yapacağınız konusunda hiçbir fikriniz yok, bu da onu kaldıramayacağınız anlamına geliyor. Yani bu durumda bunun bir kod kokusu olduğu konusunda haklısınız ve benim görüşüme göre yakalamamalısınız demektir CloneNotSupportedException.


12

Kullanmayı tercih ederim Objects.requireNonNull()Parametre a'nın boş olup olmadığını kontrol etmek . Dolayısıyla, kodu okuduğunuzda parametrenin boş olmaması gerektiği açıktır.

Ve işaretli İstisnalardan kaçınmak için CloneNotSupportedException,RuntimeException .

Her ikisi için de bunun neden olmaması ya da böyle olmaması amacıyla güzel bir metin ekleyebilirsiniz.

public Object getClone(Object a) {

    Objects.requireNonNull(a);

    try {
        return a.clone();
    } catch (CloneNotSupportedException e) {
        throw new IllegalArgumentException(e);
    }

}

7

Bu tür bir durumda yazardım

public Object getClone(SomeInterface a) throws TotallyFooException {
    // Precondition: "a" should be null or should have a someMethod method that
    // does not throw a SomeException.
    if (a == null) {
        throw new TotallyFooException() ; }
    else {
        try {
            return a.someMethod(); }
        catch (SomeException e) {
            throw new IllegalArgumentException(e) ; } }
}

İlginç bir şekilde, "try ifadesinin asla başarısız olmayacağını" söylüyorsunuz, ancak yine e.printStackTrace();de asla uygulanmayacağını iddia ettiğiniz bir ifade yazma zahmetine girdiniz. Neden?

Belki inancınız o kadar sağlam değildir. Bu iyi (bence), çünkü inancınız yazdığınız koda değil, müşterinizin ön koşulu ihlal etmeyeceği beklentisine dayanıyor. Kamu yöntemlerini savunmaya göre programlamak daha iyidir

Bu arada, kodun benim için derlenmeyecek. Sen diyemezsin a.clone()türü bile aolduğunu Cloneable. En azından Eclipse'in derleyicisi öyle diyor. İfade a.clone()hata veriyor

Clone () yöntemi Cloneable türü için tanımsız

Özel durumunuz için ne yapardım

public Object getClone(PubliclyCloneable a) throws TotallyFooException {
    if (a == null) {
        throw new TotallyFooException(); }
    else {
        return a.clone(); }
}

Nerede PubliclyCloneabletanımlanır

interface PubliclyCloneable {
    public Object clone() ;
}

Veya parametre türünün mutlaka olması gerekiyorsa Cloneable, en azından aşağıdakiler derlenir.

public static Object getClone(Cloneable a) throws TotallyFooException {
//  Precondition: "a" should be null or point to an object that can be cloned without
// throwing any checked exception.
    if (a == null) {
        throw new TotallyFooException(); }
    else {
        try {
            return a.getClass().getMethod("clone").invoke(a) ; }
        catch( IllegalAccessException e ) {
            throw new AssertionError(null, e) ; }
        catch( InvocationTargetException e ) {
            Throwable t = e.getTargetException() ;
            if( t instanceof Error ) {
                // Unchecked exceptions are bubbled
                throw (Error) t ; }
            else if( t instanceof RuntimeException ) {
                // Unchecked exceptions are bubbled
                throw (RuntimeException) t ; }
            else {
                // Checked exceptions indicate a precondition violation.
                throw new IllegalArgumentException(t) ; } }
        catch( NoSuchMethodException e ) {
            throw new AssertionError(null, e) ; } }
}

Derleme zamanı hatası beni neden kontrol edilen istisnalar atmayan genel bir yöntem olarak Cloneableilan etmediğini merak cloneettim. Bugs.java.com/view_bug.do?bug_id=4098033
Theodore Norvell

2
Java kodunun büyük çoğunluğunun Lisp-esque parantez kullanmadığını ve bunu bir iş ortamında kullanmaya çalışırsanız kirli görüneceğinizi belirtmek isterim.
Fon Monica'nın Davası

1
Bunun için teşekkürler. Aslında pek tutarlı değildim. Tercih ettiğim küme ayracı stilimi tutarlı bir şekilde kullanmak için yanıtı düzenledim.
Theodore Norvell

6

Yukarıdaki örnekler geçerlidir ve çok Java'dır. Bununla birlikte, OP'nin bu geri dönüşün nasıl ele alınacağına ilişkin sorusunu şu şekilde ele alacağım:

public Object getClone(Cloneable a) throws CloneNotSupportedException {
    return a.clone();
}

aBoş olup olmadığını kontrol etmenin bir faydası yoktur . NPE'ye gidiyor. Yığın izi yazdırmak da yardımcı olmaz. Yığın izleme, nerede işlendiğine bakılmaksızın aynıdır.

Yararsız sıfır testler ve yararsız istisna işleme ile kodu gereksiz yere atmanın bir faydası yoktur. Önemsizliği kaldırarak, iade sorunu tartışılır.

(OP'nin istisna işlemede bir hata içerdiğine dikkat edin; bu nedenle geri dönüş gerekliydi. OP önerdiğim yöntemde yanlış olmazdı.)


5

Sadece sözdizimini tatmin etmek için bir return ifadesine sahip olmak kötü bir uygulama mı?

Başkalarının da bahsettiği gibi, sizin durumunuzda bu aslında geçerli değil.

Yine de soruyu cevaplamak için, Lint tipi programlar kesinlikle çözemedi! Bir geçiş bildirisinde iki farklı kişinin bu konuda kavga ettiğini gördüm.

    switch (var)
   {
     case A:
       break;
     default:
       return;
       break;    // Unreachable code.  Coding standard violation?
   }

Bir şikayet değil mola sahip bir kodlama standardı ihlal oldu. Diğeri , erişilemez bir kod olduğu için buna sahip olmanın bir olduğundan şikayet etti .

Bunu fark ettim çünkü iki farklı programcı, o gün hangi kod analizörünü çalıştırdıklarına bağlı olarak, arayı ekleyip kaldırıp ekleyip kaldırarak kodu yeniden kontrol etmeye devam etti.

Bu duruma düşerseniz, birini seçin ve kendinize gösterdiğiniz iyi form olan anormalliği yorumlayın. Bu en iyi ve en önemli paket servisi olan restoran.


5

"Sadece sözdizimini tatmin etmek" değildir. Her kod yolunun bir dönüşe veya fırlatmaya yol açması dilin anlamsal bir gereksinimidir. Bu kod uymuyor. İstisna yakalanırsa, aşağıdaki geri dönüş gereklidir.

Bunun hakkında ya da genel olarak derleyiciyi tatmin etmek hakkında 'kötü uygulama' yok.

Her durumda, sözdizimi veya anlamsal, bu konuda herhangi bir seçeneğiniz yok.


2

Sonunda geri dönüşü olması için bunu yeniden yazardım. Sözde kod:

if a == null throw ...
// else not needed, if this is reached, a is not null
Object b
try {
  b = a.clone
}
catch ...

return b

İlgili bir yan not olarak, kodunuzu hemen her zaman dönüş ifadesinin sonunda olacak şekilde yeniden düzenleyebilirsiniz. Aslında iyi bir kodlama standardıdır, çünkü birçok çıkış noktasını göz önünde bulundurmanız gerekmediğinden kodun bakımını ve hatalarını düzeltmeyi biraz kolaylaştırır. Ayrıca, tüm değişkenleri aynı nedenle yöntemin başında bildirmek iyi bir uygulama olacaktır. Ayrıca, sondaki dönüşe sahip olmanın daha fazla değişken bildirmesi gerekebileceğini de göz önünde bulundurun, benim çözümümde olduğu gibi, ekstra "Nesne b" değişkenine ihtiyacım vardı.
Pablo Pazos

2

Henüz kimse bundan bahsetmedi, işte burada:

public static final Object ERROR_OBJECT = ...

//...

public Object getClone(Cloneable a) throws TotallyFooException {
Object ret;

if (a == null) 
    throw new TotallyFooException();

//no need for else here
try {
    ret = a.clone();
} catch (CloneNotSupportedException e) {
    e.printStackTrace();
    //something went wrong! ERROR_OBJECT could also be null
    ret = ERROR_OBJECT; 
}

return ret;

}

Bu nedenle returntrybloklardan hoşlanmıyorum .


2

Dönüş boş; Bir istisna yakalanabileceğinden gereklidir, ancak böyle bir durumda, bunun boş olup olmadığını zaten kontrol ettiğimizden (ve klonlamayı desteklediğimizi çağırdığımız sınıfı bildiğimizi varsayalım), bu nedenle try ifadesinin asla başarısız olmayacağını biliyoruz.

İfadenin tryasla başarısız olamayacağını bildiğiniz bir şekilde ilgili girdilerle ilgili ayrıntıları biliyorsanız, buna sahip olmanın anlamı nedir? tryİşlerin her zaman başarılı olacağından eminseniz , kaçının (kod tabanınızın tüm ömrü boyunca kesinlikle emin olabileceğiniz nadirdir).

Her durumda, derleyici maalesef bir akıl okuyucusu değildir. İşlevi ve girdilerini görür ve sahip olduğu bilgiler verildiğinde return, alt kısımdaki ifadeye sizinkine ihtiyaç duyar .

Yalnızca sözdizimini tatmin etmek ve derleme hatalarından kaçınmak için (buna ulaşılmayacağını açıklayan bir yorumla) ekstra return ifadesini sonuna koymak kötü bir uygulama mıdır, yoksa böyle bir şeyi kodlamanın daha iyi bir yolu var mı? return ifadesi gereksiz mi?

Tam tersine, başka bir kod satırına mal olsa bile herhangi bir derleyici uyarısından kaçınmanın iyi bir uygulama olduğunu öneririm. Buradaki satır sayısı hakkında fazla endişelenmeyin. Fonksiyonun güvenilirliğini test ederek oluşturun ve ardından devam edin. Sadece returnifadeyi atlayabileceğinizi varsayarak , bir yıl sonra o koda geri döndüğünüzü hayal edin ve ardından returnalttaki bu ifadenin, yapabileceğiniz varsayımlar nedeniyle neden atlandığına dair küçük ayrıntıların ayrıntılarını açıklayan bazı yorumlardan daha fazla kafa karışıklığına neden olup olmayacağına karar vermeye çalışın. girdi parametreleri hakkında bilgi verin. Büyük olasılıkla returnifadenin üstesinden gelmek daha kolay olacak.

Bununla birlikte, özellikle bu bölüm hakkında:

try {
    return a.clone();
} catch (CloneNotSupportedException e) {
   e.printStackTrace();
}
...
//cant be reached, in for syntax
return null;

Buradaki istisnaları ele alma zihniyetinde biraz tuhaf olduğunu düşünüyorum. Genelde, yanıt olarak yapabileceğiniz anlamlı bir şeyin olduğu bir sitede istisnaları yutmak istersiniz.

try/catchBir işlem mekanizması olarak düşünebilirsiniz . trybu değişiklikleri yapmak, başarısız olurlarsa ve catchbloğa dallanırsak catch, geri alma ve kurtarma sürecinin bir parçası olarak yanıt olarak bunu ( blokta ne varsa ) yapın.

Bu durumda, yalnızca bir yığın izleme yazdırmak ve ardından boş döndürmeye zorlanmak tam olarak bir işlem / kurtarma zihniyeti değildir. Kod, hata işleme sorumluluğunu getClonehataları manuel olarak kontrol etmek için çağıran tüm koda aktarır . Yakalamayı tercih edebilirsinizCloneNotSupportedException ve başka, daha anlamlı bir istisna biçimine çevirmeyi ve atmayı tercih edebilirsiniz, ancak istisnayı basitçe yutmak ve bu durumda bir işlem kurtarma sitesi gibi olmadığından bir boş döndürmek istemezsiniz.

Bir istisna atmak bundan kaçınırken, başarısızlıkla bu şekilde manuel olarak kontrol etme ve başa çıkma sorumluluklarını arayanlara sızdırırsınız.

Sanki bir dosya yüklerseniz, bu üst düzey işlemdir. try/catchOrada olabilir . tryingDosya yükleme işlemi sırasında nesneleri klonlayabilirsiniz. Bu üst düzey işlemin herhangi bir yerinde bir hata varsa (dosyayı yüklerken), genellikle bu üst düzey işlem try/catchbloğuna tüm yol boyunca istisnalar atmak istersiniz, böylece bir dosyanın yüklenmesindeki bir başarısızlıktan (ister klonlamadaki bir hata veya başka bir şey nedeniyle). Bu nedenle, genellikle bunun gibi granüler bir yerde bir istisnayı yutup sonra bir boş döndürmek istemeyiz, örneğin bu istisnaların birçok değerini ve amacını ortadan kaldırır. Bunun yerine, istisnaları, onunla anlamlı bir şekilde başa çıkabileceğimiz bir siteye kadar yaymak istiyoruz.


0

Örneğiniz, sorunuzu son paragrafta belirtildiği gibi açıklamak için ideal değildir:

Yalnızca sözdizimini tatmin etmek ve derleme hatalarından kaçınmak için (buna ulaşılmayacağını açıklayan bir yorumla) ekstra return ifadesini sonuna koymak kötü bir uygulama mıdır, yoksa böyle bir şeyi kodlamanın daha iyi bir yolu var mı? return ifadesi gereksiz mi?

Daha iyi bir örnek, klonun kendisinin uygulanması olabilir:

 public class A implements Cloneable {
      public Object clone() {
           try {
               return super.clone() ;
           } catch (CloneNotSupportedException e) {
               throw new InternalError(e) ; // vm bug.
           }
      }
 }

Burada catch cümlesi asla girilmemelidir. Yine de sözdizimi ya bir şey atmayı ya da bir değer döndürmeyi gerektirir. Bir şeyi döndürmek mantıklı olmadığından, InternalErrorciddi bir VM durumunu belirtmek için an kullanılır.


5
Bir atma üst sınıf CloneNotSupportedExceptionolduğunu değil , bir "vm böcek" - Bir için tamamen yasaldır Cloneableatmak. Bu belki bir Kodunuzdaki ve / veya üst sınıfta hata, bu durumda sarma o bir teşkil RuntimeExceptionveya olasılıkla bir AssertionError(ancak bir InternalError) uygun olabilir. Ya da istisnadan kaçabilirsiniz - eğer üst sınıfınız klonlamayı desteklemiyorsa, o zaman siz de desteklemiyorsunuz CloneNotSupportedException, anlamsal olarak uygunsunuz.
Ilmari Karonen

İster bir internalerror atmak JDK içindeki tüm klon yöntemlerini düzeltmek böylece Oracle bu tavsiyelerde göndermek isteyebilirsiniz @IlmariKaronen
Wero

@wero Biri şüphesiz zaten var, ama bu eski kod kokuyor.
deworde
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.