Benim sınıf için File
nesne ve diğeri String
nesnesi alır ve this
anahtar sözcüğünü kullanmak istiyorum iki kurucu var. Uygulamanın işlevi, parametre olarak File
olanıdır ve String
ile this
numaralı telefonu arayacaktır. Şimdi String
alan yapıcıda istisnai kontrol etmek istiyorum ama hata alıyorum, bu ilk satır this
olmalıdır. Hataları nasıl kontrol edebilirim this
'u arayın. Constructor call must be the first statement in a constructor
Oluşturucu özel durum işleme ve bu anahtar sözcüğünü kullanarak Java
cevap
Maalesef bu onların keyfi kısıtlamalara Java sayesinde mümkün değildir:
public Test (String filename) {
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
this(new File(filename)); // error
}
public Test (File f) {
/* implementation here */
}
Bu kesin hatadır:
İşte benim kodudur. İki ana ihtimalin var.
Daha idiomatik Java tekniği, her şeyi fabrika işlevine sarmaktır, böylece istisnayı yakalayabilirsiniz. Fabrika işlevleri de yararlıdır çünkü bunlar polimorfik nesneler oluşturmanıza izin verir ve hangi nesnenin gerçekte oluşturulduğunun ayrıntılarını gizlemenize yardımcı olur.
public static Test create(String filename){
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
return new Test(filename);
}
private Test (String filename) {
this(new File(filename));
}
public Test (File f) {
/* implementation here */
}
Diğer seçenek, yapıcıyı böyle bir kısıtlamanın olmadığı bayt koduna yazmaktır. Maalesef bayt kodu daha az okunabilir ve sürdürülebilir olduğundan, büyük olasılıkla öncelikle Java uygulamasında bytecode miktarını en aza indirmek isteyeceksiniz. Bunu AspectJ gibi Java dışındaki bir dilde de yapabilirsiniz.
Düzenleme: Aslında özel durumları yakalamaya çalışmıyorsanız, üçüncü bir olasılık vardır. Süper yapıcı aramadan önce, denetimleri gerçekleştiren ve sonra süper yapıcı çağrısına bir kukla argüman olarak ileten ayrı bir işlev oluşturarak rasgele kod ekleyebilirsiniz. İlk önce argümanlar değerlendirildiği için, kodunuz önce çalışır, ancak bu bir kesmek gibidir.
public Test (String filename) {
this(doChecks(filename), new File(filename));
}
private static Void doChecks(String filename){
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
return null;
}
public Test (Void dummy, File f) {
this(f);
}
public Test (File f) {
/* implementation here */
}
İlk seçenek, bir 'init' işlevi yazmak ve kullanmak mı? –
Üçüncü seçenek için bir kod örneği ekledim. – Antimony
* Bu, keyfi kısıtlamalarla Java'da mümkün değildir *: Kısıtlamaların keyfi olmadığını düşünüyorum;) – NINCOMPOOP
Hayır, this
numaralı telefonu aramadan önce hataları denetleyemezsiniz. Şartname tarafından yasaklandı. Aslında buna ihtiyacın yoktu. İstisnalar atmak için new File(filename)
izin verin.
düzenleme: biz this
veya oluşturucu içinde super
ya this
veya super
kullanmak durumunda Actually that is what my constructor with the implementation has, it catches the exception may be thrown by file, so I just add the null exception and use this directly in my second constructor?
public Test (String filename) {
this((filename == null || filename.isEmpty()) ? null : new File(filename));
}
Bu, filename.isEmpty() 'olduğunda yanlış özel durum türünü atar. – Antimony
yapıcı ilk deyimi olmalıdır: Ben aizen92 yorumuna gördü. Belirli bir kurucudan istisna atarsanız daha iyidir.
public Test (String filename) {
this(new File(filename));
}
ikinci kurucu
null
geçirerek kaynaklanan herhangi istisna, halletsin.
public Test (File file) {
// exception handling code
// or new instance creation
}
Aslında bu benim yapıcı ile uygulama sahip, bu istisna yakalar dosya tarafından atılmış olabilir, bu yüzden sadece null istisnasını ekleyin ve 'bu' doğrudan ikinci yapımcıda kullanın? –
- 1. IErrorHandler kullanarak WCF özel durum işleme
- 2. PostgreSQL Özel Durum İşleme
- 3. Symfony3: Merkezi özel durum işleme
- 4. "-" anahtar sözcüğünü kullanarak bir dizgi nasıl bölüştürülür? "-"
- 5. java uygulamasında belirli bir özel durum işleme örneği
- 6. JOIN anahtar sözcüğünü kullanarak birleşim yapabilir miyim?
- 7. Java - anahtar: durum 2 ve 3 çalışmıyor
- 8. Tür başlatıcı (statik yapıcı) özel durum işleme
- 9. Spring MVC dönen JSONS ve özel durum İşleme
- 10. Java yığın alanı özel durum
- 11. Java LocalTime Ayrıştırma Özel Durum
- 12. Java Tarih Ayrıştırma Özel Durum
- 13. Paragraf anahtar sözcüğünü bir temsilcide kullanabilir misiniz?
- 14. SQL Server bağlantısını kullanarak anahtar sözcüğünü kapatmam gerekiyor mu?
- 15. "++" anahtar sözcüğünü tam olarak ne yaparsınız?
- 16. Bir başlık dosyasındaki 'anahtar sözcüğünü kullanarak C++' kullanmak yanlış mı?
- 17. Git anahtar sözcüğünü kullanmadığımda bir işlev çalışmıyor
- 18. ColdFusion/Java Sınıfı Bulunamadı Özel Durum
- 19. hata özel durum
- 20. JTable, özel başlık oluşturucu ve sıralama simgeleri
- 21. Özel kurucu ve ortak parametre oluşturucu
- 22. Özel anahtar/ortak sertifika çiftini Java Anahtar Deposu'nda içe aktarma
- 23. Java için Grafik Oluşturucu?
- 24. Haskell. IO Kural dışı durum işleme
- 25. Subclassing unittest.TestCase, 'super() __ init __() `anahtar sözcüğünü sağlar ve` __init__' un beklenmedik bir anahtar kelime argümanı var
- 26. OrElse ve AndAlso ifade yöntemlerini kullanarak özel durum
- 27. ParallelForeach kullanarak Dosya İşleme. Bu en iyi yaklaşım
- 28. Özel bir özel durum döndürme
- 29. Visual Studio 2010'da 'auto' anahtar sözcüğünü kullanan performans cezası
- 30. Sonlu Durum Makinesi (FSM) ve Android'in Java
Hangi hatayla karşılaşıyorsunuz? – Thomas
Yayınlanan kod, açıkladığınız şeyin tam tersidir! – NINCOMPOOP