• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Throws,throw,try/catch- wyjatki - java

Object Storage Arubacloud
0 głosów
579 wizyt
pytanie zadane 16 lutego 2019 w Java przez periedynek Obywatel (1,320 p.)
edycja 16 lutego 2019 przez periedynek

Cześć. Uczę się o wyjątkach i mam pytanie.

Wyjątek możemy złapać na dwa sposoby albo za pomocą throws albo za pomocą try/catch.

I tutaj pada pytanie, czy jeżeli dodam w sygnaturze throws to to będzie znaczyło, że jeżeli gdziekolwiek w metodzie wypadnie taki wyjątek to metoda go obsłuży? A jeżeli obsłuży to w jaki sposób?

Czy jeżeli dodam throws gdzieś w metodzie to czy ja sam muszę go obsłużyć w jakiś sposób za pomocą try/catch? Czy wystarczy, ze dodam throws i w każdym wywołaniu tej metody w innej metodzie też muszę dodać throws ? Pytam dlatego, że w internecie wyczytałem, że :

Throws keyword can be placed in the method declaration. It denotes which exceptions can be thrown from this method. We must handle these exceptions with try-catch.

Natomiast w moim projekcie jak mam metodę i w sygnaturze dodane throws SQLException to nigdzie w żadnym wywołaniu nie obłsuguję a mimo to aplikacja dalej działa.

Np:. 

void a() throws IlegalArgumentException
{
....
}


public static void main()
{
 try
{
a()
}
catch(IlegalArgumentException e)
{
...
}
}

 

Drugie pytanie odnośnie słówka throw za pomocą niego rzucamy wyjątki. No właśnie, ale po co rzucamy wyjątki skoro możemy go obsłużyć za pomocą try/catch, gdzie w catch dodamy informacje ze cos poszlo nie tak?

komentarz 16 lutego 2019 przez NowyUrzydgownig Mądrala (5,090 p.)
wyjątki są częścią flow twojej aplikacji. Gdy coś jest nie tak wtedy ty go obsługujesz za pomocą try catch tam gdzie chcesz i robisz coś z tym. Przeważnie stosujesz jakiś global exception handling i nie zaśmiecasz try catchem twojej aplikacji. Zwracasz np. odpowiednie komunikaty, że coś się nie udało wtedy. Jednak nie powinieneś ich rzucać na prawo i lewo, nie powinny one należeć do happy path twojej aplikacji. Gdy masz powiedzmy 3 klasy. A, B, C. Klasa A wywołuje metodę z klasy B, metoda w klasie B wywołuje metodę z klasy C. Wówczas wyjątek, który wystąpi w klasie C jeżeli nie zostanie w niej obsłużony, to pójdzie wyżej do klasy B, jak tam nie zostanie obsłużony to pójdzie jeszcze wyżej itd.
komentarz 16 lutego 2019 przez periedynek Obywatel (1,320 p.)
No tak, wiem jak działa hierarchia.

1 odpowiedź

0 głosów
odpowiedź 16 lutego 2019 przez Asertywny Mądrala (5,430 p.)
Słowo kluczowe "throws" oznacza tylko tyle, że dana metoda rzuca gdzieś taki wyjątek.

Pozwala to na nieobslużenie potencjalnego wyjątku w ciele tej metody, ale w jakiejś metodzie wyższego poziomu.

Jeśli chcesz używać tej metody, to prędzej czy później dojdziesz do momentu, kiedy ten wyjątek będziesz musiał obsłużyć.

Odnośnie słowa throw - podam Ci taki przykład. Wyobraź sobie, że Twój program wyznacza wszystkie liczby pierwsze od 0 do n, gdzie n to liczba, którą podaje użytownik. Kompilator wie tylko tyle, że n jest typu int lub long. O nieujemność n musisz się zatroszczyć osobiście. Jednym zp otencjalnych rozwiązań jest rzucenie wyjątku, na przykład ArgumentException, gdy użytkownik podał wartość ujemną.
komentarz 16 lutego 2019 przez periedynek Obywatel (1,320 p.)
No właśnie, nie.

Mam w sygnaturze dodane albo throws Exception albo throws SQLException i w żadnej metodzie tego nie obsługuję: https://gist.github.com/must1/57d5986d5cd58237871d479038e0f1d9

A mimo to wszystko działa.

 Odnośnie throwa:

No ale po co mam rzucać tutaj wyjątek, skoro mogę objąć try/catch w fora i robic do skutku aż poda dodatnia?
komentarz 16 lutego 2019 przez Asertywny Mądrala (5,430 p.)
  komentarz 4 minuty temu przez periedynek Obywatel (1,110 p.)

No właśnie, nie.

Mam w sygnaturze dodane albo throws Exception albo throws SQLException i w żadnej metodzie tego nie obsługuję: https://gist.github.com/must1/57d5986d5cd58237871d479038e0f1d9

To bardzo źle, że nie dbasz o bezpieczeństwo swojego kodu.
Wyobraź sobie, że pracujesz z fragmentem kodu napisanym przez kolegę / współpracownika. Widzisz tam metodę, która rzuca, dajmy na to, ArgumentException. Chcesz użyć tej metody w swoim kodzie. Jeśli program ma być bezpieczny i solidny, musisz zatroszczyć się o obsługę tego wyjątku.

Co do drugiej części pytania:

void find_primes_to(long n) throws ArgumentException {
    if (n < 0)
        throw new ArgumentException();
    return calculate_primes_to(n);
}

static void main(String[] args) {
    long n = scanner.nextLong();
    try {
        var primes = find_primes_to(n);
        for (long prime : primes)
            System.out.println("prime");
    } catch(ArgumentException ex) {
        System.out.print(" :( " );
    }
}

Jeśli chcesz, możesz tego całego try-catcha wziąć w pętlę. Rozumiesz, jaki jest przekaz tego kodu?
(Uprzedzam, że nie piszę w Javie, kod napisałem na szybko)

komentarz 16 lutego 2019 przez periedynek Obywatel (1,320 p.)
Ad1. W sensie mówi się, że muszę obsłużyć ten wyjątek jeżeli gdzieś jest throws. Ja to rozumiem tak, ze jeżeli nie obsłużę to będzie wywali mi program, tak jak to z checked exceptions. Stąd to pytanie.

 

Ad2. Kod sam w sobie rozumiem, ale nie wiem o jaki przekaz Ci chodzi. Nie rozumiem dalej, czemu nie mogę wziąć tego w pętle, bo przecież nie zależy mi na wywaleniu wyjątku, tylko zależy mi na tym aby program działał sprawnie, więc aby liczba była dodatnia.
komentarz 16 lutego 2019 przez Asertywny Mądrala (5,430 p.)
Chodzi o to, że po to ktoś wymyślił wyjątki, żeby z nich korzystać. Twój kod jest przez to bardziej czytelniejszy, a logikę sprawdzania możesz przenieść od osobnej metody.

Sprawdzanie wartości wprowadzonego parametru w pętli byłoby nieeleganckie i zaśmiecałoby kod.

Wszystko da się sprawdzić w pętli / ifami, ale wyjątki są po to, żeby robić to bardziej elegancko.
komentarz 16 lutego 2019 przez periedynek Obywatel (1,320 p.)
No w sumie prawda. Więc pozostaje tylko throws, skoro SQLException jest checked:

https://docs.oracle.com/javase/7/docs/api/java/sql/SQLException.html

to kompilator powiniene wymagać ode mnie obsługi, a nie wymaga, tak samo z Exception.
komentarz 16 lutego 2019 przez Asertywny Mądrala (5,430 p.)
A spróbuj wywołać tę metodę startCarRental() na przykład w mainie.
komentarz 16 lutego 2019 przez periedynek Obywatel (1,320 p.)
Wywołuję przecież :D
komentarz 16 lutego 2019 przez Asertywny Mądrala (5,430 p.)
Już widzę.

Tak, da się obejść "obowiązek" złapania wyjątku na przykład przez oznaczenie metody main jako rzucającą ten wyjątek, tylko jaki ma to sens? Nie tak pracuje się z wyjątkami.
komentarz 16 lutego 2019 przez periedynek Obywatel (1,320 p.)
Czyli main tak jakby łapie mi ten wyjątek i jak on go obsłuży w takim razie?

Podobne pytania

0 głosów
2 odpowiedzi 637 wizyt
pytanie zadane 3 lipca 2018 w Java przez periedynek Obywatel (1,320 p.)
0 głosów
2 odpowiedzi 414 wizyt
pytanie zadane 22 listopada 2018 w PHP przez marcolo Obywatel (1,530 p.)
0 głosów
1 odpowiedź 623 wizyt
pytanie zadane 17 listopada 2017 w C# przez Sensej Użytkownik (540 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...