2013-08-28 15 views
10

Jestem nowy w Javie i właśnie natknąłem się na samouczek, który używa słowa kluczowego "Rzuty" w metodzie. Zrobiłem trochę badań w tym zakresie, ale nadal tak naprawdę nie rozumiem.Co robi funkcja "Rzuty" i jak jest przydatna?

Z tego, co widziałem do tej pory, mówi kompilatorowi, że pewien wyjątek może zostać wrzucony do tej konkretnej metody. Dlaczego musimy to powiedzieć kompilatorowi? Zrobiłem wiele programów, używając jedynie metody "catch-catch" w moich metodach i działa to dobrze - na pewno są to te instrukcje "catch-catch", które zarządzają wyjątkami, prawda?

+0

Java używa rzuca klauzuli poinformować kompilator, że metoda ta może rzucić wyjątek jest poprawna. Ale ostrzega również dzwoniącego o szczególnym wyjątku, który może wystąpić w wywołaniu tej metody. A zatem wywołujący metodę może w oparciu o to podjąć pewne kroki. –

Odpowiedz

32

Możesz zarządzać wyjątkiem w ramach metody, używając do tego try i catch. W takim przypadku nie trzeba używać throws. Na przykład:

public void myMethod() 
{ 
    try { 
    /* Code that might throw an exception */ 
    } 
    catch (SpaceInvadersException exception) { 
    /* Complicated error handling code */ 
    } 
} 

Ale załóżmy, że miał tysiąc sposobów, z których każdy może rzucić SpaceInvadersException. Wtedy musiałbyś napisać cały skomplikowany kod obsługi błędów tysiąc razy. Oczywiście zawsze można utworzyć klasę ErrorHandler za pomocą metody dealWithSpaceInvadersException(), którą można wywołać z nich, ale nadal utkniesz z tysiącami bloków try - .

Zamiast tego mówisz kompilatorowi, że każda z tych tysięcy metod może rzucić SpaceInvadersException.Następnie każda metoda, która wywołuje jedną z tych metod, musi poradzić sobie z samym błędem, używając albo try - catch, albo mówiąc kompilatorowi, że może on rzucić SpaceInvadersException. Odbywa się to za pomocą słowa kluczowego throws, tak:

public void myMethod() throws SpaceInvadersException 
{ 
    /* Code that might throw an exception */ 
} 

public void callingMethod() 
{ 
    try { 
    myMethod(); 
    } 
    catch (SpaceInvadersException exception) { 
    /* Complicated error handling code */ 
    } 
} 

W takim przypadku należy poinformować kompilator, że myMethod mógł rzucać SpaceInvadersException. Oznacza to, że nie można wywołać tej metody, nie traktując w jakiś sposób wyjątku (try - catch lub używając słowa kluczowego throws w metodzie wywołującej). Jeśli nie ma tam wartości throws, można wywołać tę metodę bez wykonywania obsługi wyjątków i uzyskać wyjątek, który nie był nigdzie w programie (co byłoby złe).

Ponieważ zawsze lepiej jest unikać powielania kodu, zwykle lepiej jest zdjąć obsługę błędów, aby uzyskać funkcję o wiele wyższym poziomie niż w przypadku osobnego traktowania we wszystkich metodach niskiego poziomu . Właśnie dlatego ten mechanizm istnieje.

+3

+1 - Najlepsza odpowiedź do tej pory. Ładne przykłady. –

+0

Rozumiem tę odpowiedź bardziej niż wszystkie inne, chociaż wszystkie były pomocne na swój sposób. Dziękuję Ci. – PotWashMike

+0

Nie ma problemu! Cieszę się, że mogłem pomóc. –

2

Wyżej, tak, niektóre metody będą musiały złapać wyjątek, który zostanie rzucony. Tak jak powiedziałeś, to właśnie te bloki try-catch zarządzają nimi.

Istnieje jeden wyjątek, a to jest RuntimeException, dla którego nie trzeba zadeklarować części wyjątku throws. Wyjątek RuntimeException (i wszystkie jego podklasy) są nazywane niesprawdzonymi wyjątkami, po których zwykle nie można odzyskać.

4

throws kluczowe deklaruje, że wyjątek może być rzucony się metody.

Można również użyć bloku catch, aby wychwycić wyjątek wewnątrz metody. Jeśli go złapiesz i nie wyrzucisz, to nie zostanie wyrzucony z tej metody.

Oświadczenie throws pozwala kompilacji weryfikację, że metoda albo:

  • łapie wyjątki rzuca, w tym z metod wywołuje.
  • Lub deklaruje je, aby dzwoniący mógł wykonać tę samą kontrolę.
0

Rzuty jest mechanizmem do rzucania wyjątku do metody wywołującej. Zwykle używa się tego, aby wyrzucić wyjątek na poziom, na którym można go obsłużyć.

Praktycznym przykładem jest aplikacja oparta na gui z pewną logiką zaplecza. Jeśli wystąpi problem w zapleczu, możesz chcieć wyświetlić odpowiedni komunikat dla użytkownika. Tak więc z twojego backendu możesz rzucić wyjątek do swoich klas UI, a następnie możesz wyświetlić odpowiedni komunikat.

+1

"Rzuty" nie rzuca wyjątku - to * deklaruje *, że wyjątek może zostać rzucony. –

+0

@AndyThomas Całkowicie się zgadzam, ale jeśli istnieje deklaracja metody, oznacza to, że chcesz rzucić wyjątek. –

+0

Oznacza to, że osoby dzwoniące powinny przyjąć, że twoja metoda może spowodować zgłoszenie wyjątku. Twoja metoda może nigdy nie rzucić wyjątku. Twój pierwszy akapit wymaga edycji; sugeruje, że "rzuty" powodują wyrzucenie wyjątku. –

0

Programy Java wyrzucają wyjątek, gdy tylko się pojawią.Jednakże będą chwile, w których chcesz ręcznie wyrzucić wyjątek, ponieważ użyto słowa kluczowego throws.

Na przykład: class Abc { public static void main(String args[]) throws IOException{ }}

+0

Brakuje głosów, ale jest to zasadniczo niepoprawne. – chrylis