Java'da özel istisnalar nasıl oluşturulur? [kapalı]


149

Java'da özel istisnaları nasıl oluştururuz?


2
Çoğu OO dilinde kullanılanla aynı metodolojidir: temel İstisna sınıfını genişletin.
NDM


1) // Kullanım tanımlı istisna sınıfını temsil eden sınıf MyException, Exception {public MyException (String s) {super (s); }} ------------------------------------------------ 2) {// kullanıcı tanımlı özel durum nesnesini yeni MyException ("TestException") atın; } catch (MyException ex) {System.out.println ("Yakalandı"); // İletiyi MyException nesnesinden yazdırın System.out.println (ex.getMessage ()); }
Mandeep Yadav

Yanıtlar:


285

İşaretli bir istisna tanımlamak için, öğesinin alt sınıfını (veya alt sınıflarının hiyerarşisini) oluşturursunuz java.lang.Exception. Örneğin:

public class FooException extends Exception {
  public FooException() { super(); }
  public FooException(String message) { super(message); }
  public FooException(String message, Throwable cause) { super(message, cause); }
  public FooException(Throwable cause) { super(cause); }
}

Bu istisnayı potansiyel olarak atabilecek veya yayabilecek yöntemler bunu beyan etmelidir:

public void calculate(int i) throws FooException, IOException;

... ve bu yöntemi çağıran kodun bu istisnayı (veya her ikisini) işlemesi veya yayması gerekir:

try {
  int i = 5;
  myObject.calculate(5);
} catch(FooException ex) {
  // Print error and terminate application.
  ex.printStackTrace();
  System.exit(1);
} catch(IOException ex) {
  // Rethrow as FooException.
  throw new FooException(ex);
}

Yukarıdaki örnekte IOException, yakalandığı ve yeniden düzenlendiği fark edeceksiniz FooException. Bu, istisnaları kapsüllemek için kullanılan yaygın bir tekniktir (tipik olarak bir API uygulanırken).

Bazen her yöntemi istisna uygulamanızı kendi cümleleriyle beyan etmeye zorlamak istemediğiniz durumlar olacaktır. Bu durumda denetlenmeyen bir istisna oluşturabilirsiniz . Kontrol edilmeyen bir istisna, java.lang.RuntimeException(ki bunun bir alt sınıfı olan java.lang.Exception) uzanan herhangi bir istisnadır :

public class FooRuntimeException extends RuntimeException {
  ...
}

Yöntemler FooRuntimeExceptionbildirmeden istisna fırlatabilir veya yayabilir ; Örneğin

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}

Denetlenmeyen özel durumlar genellikle bir programcı hatasını belirtmek için kullanılır, örneğin bir yönteme geçersiz bir bağımsız değişken iletmek veya dizi dizini sınırlarını ihlal etmeye çalışmak.

java.lang.ThrowableSınıf Java içinde atılmış olabilir tüm hata ve istisnalar köküdür. java.lang.Exceptionve java.lang.Errorher ikisi de alt sınıflarıdır Throwable. Alt sınıfların Throwableatılabileceği veya yakalanabileceği her şey . Bununla birlikte, ErrorJVM'nin içindeki, genellikle programcı tarafından "ele alınamayan" hataları belirtmek için kullanıldığından , yakalamak veya atmak genellikle kötü bir uygulamadır OutOfMemoryError. Aynı şekilde yakalamaktan kaçınmalısınız Throwable, bu da Errors'ye ek olarak Exceptions yakalamanıza neden olabilir .


25
public class MyException extends Exception {
        // special exception code goes here
}

Şu şekilde atın:

 throw new MyException ("Something happened")

Şu şekilde yakala:

catch (MyException e)
{
   // something
}

4

İşaretli bir istisna için:

public class MyCustomException extends Exception { }

Teknik olarak, Throwablegenişleyen her şey atılabilir, ancak istisnalar genellikle Exceptionsınıfın uzantılarıdır, böylece diğer yaygın atılabilir türün aksine, istisnalar kontrol edilirler (RuntimeException veya kontrol edilmeyen sınıflar hariç), ErrorGenellikle JVM içlerinin ötesinde ele alınacak şekilde tasarlanmamış bir şey değildir.

Herkese açık olmayan istisnalar da yapabilirsiniz, ancak daha sonra bunları yalnızca paketlerin aksine, onları tanımlayan pakette kullanabilirsiniz.

Özel istisnalar atmak / yakalamak gibi, tıpkı yerleşik olanlar gibi çalışır -

throw new MyCustomException()

ve üzerinden yakala

catch (MyCustomException e) { }

4
RuntimeException İstisnayı genişletir ve işaretli bir istisna değildir.
Adamski

2
Uzanır Teknik olarak, herhangi bir şey Throwableolabilir atılmış ; istisnalar devam eder Exception. Throwable'ın özel bir alt sınıfı bir try { ... } catch (Exception e) { ... }blok tarafından yakalanmaz .
Andrzej Doyle

İnsanlar neden bu cevabı destekliyor? Birkaç yanlışlık içeriyor. 1) Bir arayüz olduğu için tek kullanımlık atılamaz. 2) Throwable'ı uzatan herhangi bir şey bir istisna DEĞİLDİR (istisna Errordeğildir, bir hatadır). 3) İstisna'nın herhangi bir alt sınıfının kontrol edilirken RuntimeException'ın kontrol edilmediği anlamına gelir. Adamski'nin verdiği cevap çok daha doğru!
oxbow_lakes

Hata! Yani atılabilir demek elbette bir arayüz değil !
oxbow_lakes

@ oxbow_lakes - Yanlışları düzeltmek için ideal çözüm değil mi? Her neyse, hiç kimsenin yapmadığı için onları kendim düzelttim.
Amber
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.