Dlaczego "throws Exception" jest konieczne podczas wywoływania funkcji?

class throwseg1
{
    void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

    void show2() throws Exception  // Why throws is necessary here ?
    {
        show();
    }

    void show3() throws Exception  // Why throws is necessary here ?
    {
        show2();
    }

    public static void main(String s[]) throws Exception  // Why throws is necessary here ?
    {
        throwseg1 o1 = new throwseg1();
        o1.show3();
    }
}

Dlaczego kompilator zgłasza, że metody show2(), show3(), i main() mają

Niezgłoszony wyjątek wyjątek, który musi zostać złapany lub zadeklarowany jako wyrzucony

Kiedy usunę throws Exception z tych metod?

Author: user2864740, 2012-07-21

6 answers

W Javie, jak zapewne wiesz, wyjątki można podzielić na dwa: jeden, który wymaga klauzuli throws lub musi być obsługiwany, jeśli nie podasz jednego, a drugi, który nie. zobacz teraz poniższy rysunek:

Tutaj wpisz opis obrazka

W Javie możesz rzucić wszystko, co rozszerza klasę Throwable. Nie musisz jednak określać klauzuli throws dla wszystkich klas. W szczególności klasy, które są Error lub RuntimeException lub którejkolwiek z podklas tych dwóch. W Twoim przypadku Exception nie jest podklasa Error lub RuntimeException. Jest to więc wyjątek sprawdzony i musi być określony w klauzuli throws, jeśli nie obsługujesz tego wyjątku. Dlatego potrzebujesz klauzuli throws.


From Java Tutorial:

Wyjątek to zdarzenie, które występuje podczas wykonywania programu, które zakłóca normalny przepływ instrukcji programu.

Teraz, jak wiesz wyjątki są podzielone na dwa: zaznaczone i niezaznaczone. Dlaczego ta klasyfikacja?

Zaznaczony wyjątek: są one używane do reprezentowania problemów, które można odzyskać podczas wykonywania programu. Zwykle nie są one winą programisty. Na przykład plik określony przez użytkownika nie jest czytelny lub nie ma połączenia sieciowego, itd., We wszystkich tych przypadkach, nasz program nie musi wychodzić, zamiast tego może podjąć działania, takie jak ostrzeganie użytkownika, lub przejść do mechanizmu awaryjnego (jak Praca w trybie offline, gdy sieć nie jest dostępna), itd.

Niezaznaczone wyjątki: ponownie można je podzielić na dwa: Errors I RuntimeExceptions. Jednym z powodów, dla których nie są one zaznaczone, jest to, że są liczne i wymagane do obsługi wszystkich z nich będzie zaśmiecać nasz program i zmniejszyć jego przejrzystość. Drugi powód to:

  • Wyjątki uruchomieniowe: zwykle zdarzają się z powodu błędu programisty. Na przykład, jeśli występuje ArithmeticException z dzielenia przez zero lub występuje ArrayIndexOutOfBoundsException, to dlatego, że jesteśmy nie jesteśmy wystarczająco ostrożni w kodowaniu. Zdarzają się zwykle z powodu błędów w logice naszego programu. Muszą więc zostać wyczyszczone, zanim nasz program wejdzie w tryb produkcyjny. Są one niezaznaczone w tym sensie, że nasz program musi zawieść, gdy to nastąpi, tak, że my programiści możemy rozwiązać go w czasie rozwoju i testowania się.

  • Błędy: błędy są sytuacjami, z których zwykle program nie może odzyskać. Na przykład, jeśli wystąpi StackOverflowError, nasz program nie może wiele, np. zwiększenie rozmiaru stosu wywołującego funkcję programu. Lub jeśli wystąpi OutOfMemoryError, nie możemy wiele zrobić, aby zwiększyć ilość pamięci RAM dostępnej dla naszego programu. W takich przypadkach lepiej jest zamknąć program. Dlatego nie są one kontrolowane.

Szczegółowe informacje można znaleźć na stronie:

 107
Author: Jomoos,
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-11-25 16:00:41

Java wymaga obsługi lub deklarowania wszystkich wyjątków. Jeśli nie obsługujesz wyjątku za pomocą bloku try/catch, musi on zostać zadeklarowany w podpisie metody.

Na przykład:

class throwseg1 {
    void show() throws Exception {
        throw new Exception();
    }
}

Należy zapisać jako:

class throwseg1 {
    void show() {
        try {
            throw new Exception();
        } catch(Exception e) {
            // code to handle the exception
        }
    }
}

W ten sposób można pozbyć się deklaracji "throws Exception" w deklaracji metody.

 21
Author: jebar8,
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
2012-07-21 04:13:38

Exception jest klasą WYJĄTKÓW zaznaczonych. Dlatego każdy kod wywołujący metodę, która deklaruje, że throws Exception musi ją obsłużyć lub zadeklarować.

 3
Author: Taymon,
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
2012-07-21 03:53:50

Deklaracja throws Exception jest zautomatyzowanym sposobem śledzenia metod, które mogą rzucić wyjątek z przewidywanych, ale nieuniknionych powodów. Deklaracja jest zazwyczaj specyficzna dla typu lub typów wyjątków, które mogą być wyrzucane, takich jak throws IOException lub throws IOException, MyException.

Wszyscy mamy lub będziemy w końcu pisać kod, który nieoczekiwanie zatrzymuje się i zgłasza wyjątek z powodu czegoś, czego nie przewidzieliśmy przed uruchomieniem programu, jak podział przez zero lub indeks poza granicami. Ponieważ błędy nie były oczekiwane przez metodę, nie można ich było "złapać" i obsługiwać za pomocą klauzuli try catch. Każdy niczego nie podejrzewający użytkownicy metody również nie wiedziałby o tej możliwości, a ich programy również się zatrzymałyby.

Gdy programista wie, że mogą wystąpić pewne typy błędów, ale chciałby obsłużyć te wyjątki poza metodą, metoda może "wyrzucić" jeden lub więcej typów wyjątków do wywołującej metody zamiast ich obsługiwać. Jeśli programista nie zadeklarował, że metoda (może) wyrzucić wyjątek (lub jeśli Java nie miała możliwości zadeklarowania go), kompilator nie mógł go znać i do przyszłego użytkownika metody należeć będzie poznanie, wychwycenie i obsługa wyjątków, które metoda może wyrzucić. Ponieważ programy mogą mieć wiele warstw metod napisanych przez wiele różnych programów, trudno (niemożliwe) jest śledzić, które metody mogą rzucać wyjątki.

Mimo że Java ma możliwość deklarowania WYJĄTKÓW, nadal możesz napisz nową metodę z nieobsługiwanymi i niezgłoszonymi wyjątkami, a Java ją skompiluje i możesz ją uruchomić i mieć nadzieję na najlepsze. Java nie pozwoli Ci skompilować nowej metody, jeśli używa metody, która została zadeklarowana jako wyjątek (- y) rzucający (- e), chyba że albo obsłużysz zadeklarowany (- e) wyjątek (- y) w swojej metodzie lub zadeklarujesz metodę jako rzucający ten sam (- y) wyjątek (- y) lub jeśli istnieje wiele wyjątków, możesz obsłużyć niektóre z nich, a resztę wyrzucić.

Gdy programista oświadcza, że metoda rzuca określony typ wyjątku, jest to po prostu zautomatyzowany sposób ostrzegania innych programistów korzystających z metody, że wyjątek jest możliwy. Programista może wtedy zdecydować o obsłużeniu wyjątku lub przekazać ostrzeżenie, deklarując wywołanie metody jako również rzucanie tego samego wyjątku. Ponieważ kompilator został ostrzeżony, wyjątek jest możliwy w tej nowej metodzie, może automatycznie sprawdzić, czy przyszłe wywołania nowej metody obsługują wyjątek lub deklarują go i wymuszają jedno czy drugie się wydarzy.

Dobrą rzeczą w tego typu rozwiązaniach jest to, że gdy kompilator zgłasza Error: Unhandled exception type java.io.IOException, podaje numer pliku i linii metody, która została zadeklarowana do wyrzucenia wyjątku. Następnie możesz wybrać po prostu pass the buck i zadeklarować swoją metodę również "throws IOException". Można to zrobić aż do głównej metody, gdzie spowoduje to zatrzymanie programu i zgłoszenie wyjątku użytkownikowi. Jednak lepiej jest złapać wyjątek i radzić sobie z nim w miły sposób, taki jak wyjaśnienie Użytkownikowi, co się stało i jak to naprawić. Gdy metoda łapie i obsługuje wyjątek, nie musi już deklarować wyjątku. To się tam zatrzymuje, że tak powiem.

 3
Author: dansalmo,
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-10-29 02:57:36
package javaexception;


public class JavaException {
   void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

void show2() throws Exception  // Why throws is necessary here ?
{
    show();
}

void show3() throws Exception  // Why throws is necessary here ?
{
    show2();
}
public static void main(String[] args) {

   JavaException a = new JavaException();

   try{
   a.show3();
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
}

Tylko małe zmiany w programie. To, co wydaje się być niezrozumiane przez wielu w odniesieniu do głównego problemu, to ilekroć rzucasz wyjątek, musisz go obsłużyć, nie jest to konieczne w tym samym miejscu(np. metoda show1, 2,3 w twoim programie), ale najpierw musisz użyć metody caller wewnątrz 'main'. jednym słowem jest "throw", musi być "catch/try", nawet jeśli nie ta sama metoda, w której występuje wyjątek.

 0
Author: tawess,
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
2018-03-15 08:11:39
void show() throws Exception
{
    throw new Exception("my.own.Exception");
}

Ponieważ w metodzie show() jest zaznaczony wyjątek, który nie jest obsługiwany w tej metodzie, więc używamy słowa kluczowego throws do propagowania wyjątku.

void show2() throws Exception //Why throws is necessary here ?
{
show();
}

Ponieważ używasz metody show() w metodzie show2 () i przynajmniej propagowałeś wyjątek, powinieneś się nim zajmować. Jeśli nie obsługujesz tutaj wyjątku, to używasz słowa kluczowego throws. Jest to więc powód użycia słowa kluczowego throws w sygnaturze metody.

 0
Author: Aditya,
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
2018-04-08 17:43:33