Jak utworzyć niestandardowy typ wyjątku w Javie? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak mogę pisać niestandardowe wyjątki? (4 odpowiedzi) Zamknięte w zeszłym roku .

Chciałbym utworzyć niestandardowy wyjątek w Javie, jak to zrobić?

...

try{

...

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exception*/

}
catch(){

Kiedy tworzę własny wyjątek z throw new..., otrzymuję błąd unreported exception...must be caught or declared to be thrown

Author: Samuel Liew, 2011-12-07

9 answers

Powinieneś być w stanie utworzyć niestandardową klasę WYJĄTKÓW, która rozszerza Exception klasa, na przykład:

class WordContainsException extends Exception
{
      // Parameterless Constructor
      public WordContainsException() {}

      // Constructor that accepts a message
      public WordContainsException(String message)
      {
         super(message);
      }
 }

Użycie:

try
{
     if(word.contains(" "))
     {
          throw new WordContainsException();
     }
}
catch(WordContainsException ex)
{
      // Process message however you would like
}
 232
Author: Rion Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 18:47:26

Musisz utworzyć klasę, która rozciąga się od Exception. Powinno to wyglądać tak:

public class MyOwnException extends Exception {
    public MyOwnException () {

    }

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

    public MyOwnException (Throwable cause) {
        super (cause);
    }

    public MyOwnException (String message, Throwable cause) {
        super (message, cause);
    }
}

Twoje pytanie nie określa, czy ten nowy wyjątek ma być zaznaczony czy nie.

Jak widać tutaj , dwa typy są różne:

  • Zaznaczone wyjątki mają oznaczać problematyczne sytuacje, które powinny być obsługiwane przez programistę, który wywołuje twoją metodę. Powinno być możliwe odzyskanie po takim wyjątku. Dobrym tego przykładem jest FileNotFoundException . Wyjątki te są podklasami wyjątek .

  • Niezaznaczone wyjątki mają reprezentować błąd w kodzie, nieoczekiwaną sytuację, z której możesz nie być w stanie odzyskać. Klasyczny przykład toNullPointerException . Wyjątki te są podklasami RuntimeException

Zaznaczony wyjątek musi być obsługiwany przez metodę wywołującą, albo przez wyłapanie go i działanie odpowiednio, lub poprzez wrzucenie go do metody wywołującej. Niezaznaczone wyjątki nie są przeznaczone do przechwytywania, nawet jeśli jest to możliwe.

 114
Author: Laf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 07:47:50

Świetne odpowiedzi na temat tworzenia niestandardowych klas WYJĄTKÓW. Jeśli zamierzasz ponownie skorzystać z omawianego wyjątku, zastosuję się do ich odpowiedzi/porad. Jeśli jednak potrzebujesz tylko szybkiego wyjątku rzuconego z wiadomością, możesz użyć podstawowej klasy WYJĄTKÓW na miejscu

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exeception*/
  throw new Exception("My one time exception with some message!");
}
 16
Author: Matthew Cox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 22:49:53

Ponieważ możesz po prostu tworzyć i wyrzucać wyjątki, może to być tak proste, jak

if ( word.contains(" ") )
{
     throw new RuntimeException ( "Word contains one or more spaces" ) ;
}

Jeśli chcesz być bardziej formalny, możesz utworzyć klasę Exception

class SpaceyWordException extends RuntimeException
{

}

Tak czy inaczej, jeśli użyjesz RuntimeException, Twój nowy Exception będzie niezaznaczony.

 12
Author: emory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 06:09:50

Ponieważ uważny programista często rzuca wyjątek dla specjalnego zdarzenia, warto wspomnieć o niektórych wyjątkach ogólnego przeznaczenia, takich jak IllegalArgumentException i IllegalStateException i UnsupportedOperationException. IllegalArgumentException jest moim ulubionym:

throw new IllegalArgumentException("Word contains blank: " + word);
 11
Author: Joop Eggen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-15 18:54:16

Wyjątek jest klasą jak każda inna klasa, z tą różnicą, że rozciąga się od Exception. Więc jeśli stworzysz własną klasę

public class MyCustomException extends Exception

Możesz rzucić taką instancję za pomocą

   throw new MyCustomException( ... );
   //using whatever constructor params you decide to use

I to może być ciekawą lekturą

 5
Author: Robin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 22:47:21

Wystarczy utworzyć klasę, która rozszerza wyjątek (dla zaznaczonego wyjątku) lub dowolną podklasę wyjątku, lub RuntimeException (dla wyjątku uruchomieniowego) lub dowolną podklasę RuntimeException.

Następnie w kodzie użyj

if (word.contains(" "))
    throw new MyException("some message");
}

Przeczytaj samouczek Javy. To podstawowe rzeczy, które powinien znać każdy programista Javy: http://docs.oracle.com/javase/tutorial/essential/exceptions/

 3
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 22:48:13

Musisz zdefiniować swój wyjątek gdzie indziej jako nową klasę

public class YourCustomException extends Exception{

//Required inherited methods here
}

Następnie można rzucać i złapać YourCustomException tyle, ile chcesz.

 2
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 22:47:35

Możesz utworzyć własny wyjątek dziedzicząc z java.lang.Exception Tutaj {[3] } jest przykład, który może Ci w tym pomóc.

 2
Author: GETah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-07 22:49:27