Java'da özel istisna sınıfı nasıl tanımlanır?


286

Kendi istisna sınıfımı en kolay şekilde tanımlamaya çalışıyorum ve elde ettiğim şey bu:

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}

Java derleyicisinin söylediği şey:

cannot find symbol: constructor MyException(java.lang.String)

Bu kurucunun miras alınması gerektiğini hissettim java.lang.Exception, değil mi?

Yanıtlar:


402

Hayır, varsayılan olmayan kurucuları "devralmaz", sınıfınızda Dize alanı tanımlamanız gerekir. Genellikle super(message)yapıcıda üst kurucunuzu çağırmak için kullanırsınız. Örneğin, şöyle:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

58
@vulkanino: Hayır. Varsayılan kurucu, kendi kurucusunu tanımlayan her sınıf için derleyici tarafından eklenir. Açık bir kurucu tanımlarsanız, üst sınıf buna sahip olsa bile varsayılanı alamazsınız ve sınıfınızda yapıcı yoksa, üst sınıf buna sahip olmasa bile varsayılanı alırsınız.
Michael Borgwardt

5
if your class has no constructor, you get the default even if the superclass does not have itÜst sınıf, bu sınıf tarafından erişilebilen varsayılan bir yapıcıya sahip değilse (korumalı veya paket korumalı olabilir) son bölüm mümkün değildir. Aksi takdirde, üst kuruculardan birini açıkça çağırmanız gerekir; aksi takdirde derleme başarısız olur.
Sean Patrick Floyd

43
İstisna zincirlemesini doğru şekilde desteklemek için lütfen MyException(Throwable)ve MyException(String, Throwable)yapıcılarını ekleyin .
Danilo Piazzalunga

8
Yaklaşık 3 yıl sonra ve ekstra kurucuların hiçbiri eklenmedi. :(
byxor

2
@BrandonIbbotson 'Onlar' ile ne demek istiyorsun ve nereye ekleniyorlar? 'Onlar' ile kastettiğiniz şey süper sınıf kurucularsa ve 'nerede' ile alt sınıfsa, yanılıyorsunuz demektir. Üst sınıf yapıcılar alt sınıfa örtük olarak eklenmez. Ayrıca bu kelimelerin referans göstermesi için önceki cümlelerde başka bir konu göremiyorum.
halil

90

Tanımladığım tipik bir özel istisna şöyle bir şeydir:

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable throwable) {
        super(message, throwable);
    }

}

Eclipse kullanarak bir şablon bile oluşturuyorum, bu yüzden her şeyi tekrar tekrar yazmak zorunda kalmam.


17
Eclipse içinde Sınıfınızı oluştururken İstisna'yı genişletebilir ve dört kurucuyu da alabilirsiniz. Bir şablona ihtiyacınız yok.
jeremyjjbrown

Birincisi yerine ikinci yapıcıyı ne zaman kullanmalıyız?
ZhaoGang

61

Eclipse'de yeni sınıf iletişim kutusunu kullanırsanız, Üst Sınıf alanını ayarlayabilir ve "Üst sınıftan yapıcılar java.lang.Exception" seçeneğini işaretleyebilirsiniz ve aşağıdakileri oluşturur:

package com.example.exception;

public class MyException extends Exception {

    public MyException() {
        // TODO Auto-generated constructor stub
    }

    public MyException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public MyException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

}

super()Defualt yapıcısını çağırmamaya ilişkin aşağıdaki soruya yanıt olarak Oracle şunları söylemektedir :

Not: Bir kurucu üst sınıf kurucusunu açıkça çağırmazsa, Java derleyicisi üst sınıfın bağımsız değişken yapıcısına otomatik olarak bir çağrı ekler.


1
Varsayılan kurucunun arama yapması neden gerekli değildir super()?
ceving


22

Bunun nedeni , Java Platformunun Miras makalesinde şöyle diyor:

"Bir alt sınıf tüm üyeleri (alanlar, yöntemler ve iç içe sınıflar) üst sınıfından devralır. Yapıcılar üye değildir , bu nedenle alt sınıflar tarafından miras alınmazlar, ancak üst sınıfın yapıcıları alt sınıftan çağrılabilir."


19
package customExceptions;

public class MyException extends Exception{

    public MyException(String exc)
    {
        super(exc);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}

import customExceptions.MyException;

public class UseCustomException {

    MyException newExc=new MyException("This is a custom exception");

    public UseCustomException() throws MyException
    {
        System.out.println("Hello Back Again with custom exception");
        throw newExc;       
}

    public static void main(String args[])
    {
        try
        {
            UseCustomException use=new UseCustomException();
        }
        catch(MyException myEx)
        {
            System.out.println("This is my custom exception:" + myEx.getMessage());
        }
    }
}

bu ne dönecekti?
user1876508

Sadece UseCusomException için yapıcıdan "Tekrar özel istisna ile Merhaba" yazdıracak, istisna atılır "Bu benim özel istisnası: Bu özel bir istisnadır" yazdırabilirsiniz ana yakalandı.
ThePerson

2

İstisna sınıfının iki kurucusu vardır

  • public Exception() - Bu, herhangi bir ek bilgi içermeyen bir İstisna oluşturur.İstisnaların niteliği genellikle sınıf adından çıkarılır.
  • public Exception(String s) - Belirtilen hata iletisiyle bir özel durum oluşturur. Ayrıntı iletisi, bu özel özel durum için hata koşulunu açıklayan bir Dizedir.

3
Aslında, Java 1.4'ten bu yana iki kurucu daha var: public Exception(Throwable)ve public Exception(String, Throwable). Zincirleme istisnalarını uygun şekilde desteklemek için bunlara ihtiyaç vardır .
Danilo Piazzalunga

@ DaniloPiazzalunga seninle aynı fikirde. kaynak: Oluşturucu Özeti docs.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html
KNU

0

İstisnadan devralınırsanız, bir String'i parametre olarak alan bir yapıcı sağlamanız gerekir (hata mesajını içerir).


Bence akıl da eklemelisin.
Jigar Joshi

3
aslında bu yanlış. Kodunuz varsa kullandığı bir dize argümanı ile bir kurucu, o zaman bunu beyan etmek zorunda. Ancak, İstisna alt sınıf olabilir İstisna no-args yapıcı olduğundan ... Net bir kurucular ile tanımlanabilir.
Stephen C

0

ve bir istisna atmanın en kolay yolunu unutmayın (sınıf oluşturmanıza gerek yoktur)

if (rgb > MAX) throw new RuntimeException("max color exceeded");
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.