Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Blok try catch


Rekomendowane odpowiedzi

Opublikowano

Hej,

do czego potrzebne jest określanie wyjątku i na jakiej podstawie go określić, w tym bloku?

try {
	//
} catch (typ wyjatek) {
	//
}
Opublikowano

 

Hej,

do czego potrzebne jest określanie wyjątku i na jakiej podstawie go określić, w tym bloku?

try {
	//
} catch (typ wyjatek) {
	//
}

no... try/catch "łapie" wyjątek, czyli jak gdzieś w środku kodu w try {} jakaś metoda wyrzuci błąd:

throw new RuntimeException("Brak plików gry.");

to ty możesz w catch ten wyjątek złapać, lub wszystkie po nim dziedziczące, czyli jak dasz: catch(RuntimeException e), to złapiesz też wszystkie wyjątki które dziedziczą po RuntimeException np

public class IllegalArgumentException extends RuntimeException
{
// konstruktory i inne pierdy.
}

i wtedy w takich catch informujesz użytkownika o błędzie, albo próbujesz ponowić operację. (warto i tak gdzieś zapisać/wyświetlić błąd, bo powinno się go i tak postarać naprawić, rak by nigdy nie był wyrzucany)

 

są też wyjątki które musisz łapać, np file.createNewFile() wymusza złapanie ewentualnego IOException, i najgłupsze co możesz robić to:

File file = new File("gameSave.dat");
try
{
    file.createNewFile();
}
catch(IOException e)
{
    e.printStackTrace(); // albo co gorsze nawet bez tego.
}
// a tutaj kod od zapisu czegoś do tego pliku

to jest przejaw idiotyzmu, to że tobie nigdy tego nie wywala, to nie znaczy że nigdy nie wywali, ktoś może nie mieć uprawnień, nie mieć miejsca na dysku, ty tego nie przewidzisz, dlatego jest ten wyjątek i masz tutaj 2 rozwiązania:

1. Wyświetlić error dla użytkownika że się nie udało i PRZERWAĆ kod, nie kontynuować, bo skoro pliku nie udało się stworzyć, to tym bardziej nie uda się nic do niego zapisać.

2. Wyrzucić error wyżej, pakując go w innego exception, np:

public class GameSaveException extends RuntimeException
{
    public GameSaveException(String msg, Throwable cause)
    {
        super(msg, cause);
    }
}

i nasz kod:

File file = new File("gameSave.dat");
try
{
    file.createNewFile();
}
catch(IOException e)
{
    throw new GameSaveException("Nie można stworzyć pliku zapisu gry! Możliwe że nie masz uprawnień lub miejsca na dysku.", e); // jeśli ten błąd zostanie gdzieś wyprintowany, zobaczymy i nasz błąd, jak i ten IOException który go spowodował.
}
// a tutaj kod od zapisu czegoś do tego pliku

Oczywiście w takim rozwiązaniu powinniśmy mieć gdzieś wyżej innego catch który ten błąd złapie i już wyświetli poprawny komunikat, chyba że to jakiś prosty program/serwer dla bardziej zaawansowanych użytkowników, wtedy można po prostu pozwolić się temu errorowi wyprintować do konsoli, o ile nie spowoduje on niczego poważnego, np tutaj spowoduje że gra się nie zacznie, ale użytkownik nie straci żadnych danych itd.

 

 

To tak w uproszczeniu wszystko :D

Więcej przydatnych informacji tutaj: https://docs.oracle.com/javase/tutorial/essential/exceptions/

1438614356923701010629.png

 

Opublikowano

 

 

Hej,

do czego potrzebne jest określanie wyjątku i na jakiej podstawie go określić, w tym bloku?

try {
	//
} catch (typ wyjatek) {
	//
}

no... try/catch "łapie" wyjątek, czyli jak gdzieś w środku kodu w try {} jakaś metoda wyrzuci błąd:

throw new RuntimeException("Brak plików gry.");

to ty możesz w catch ten wyjątek złapać, lub wszystkie po nim dziedziczące, czyli jak dasz: catch(RuntimeException e), to złapiesz też wszystkie wyjątki które dziedziczą po RuntimeException np

public class IllegalArgumentException extends RuntimeException
{
// konstruktory i inne pierdy.
}

i wtedy w takich catch informujesz użytkownika o błędzie, albo próbujesz ponowić operację. (warto i tak gdzieś zapisać/wyświetlić błąd, bo powinno się go i tak postarać naprawić, rak by nigdy nie był wyrzucany)

 

są też wyjątki które musisz łapać, np file.createNewFile() wymusza złapanie ewentualnego IOException, i najgłupsze co możesz robić to:

File file = new File("gameSave.dat");
try
{
    file.createNewFile();
}
catch(IOException e)
{
    e.printStackTrace(); // albo co gorsze nawet bez tego.
}
// a tutaj kod od zapisu czegoś do tego pliku

to jest przejaw idiotyzmu, to że tobie nigdy tego nie wywala, to nie znaczy że nigdy nie wywali, ktoś może nie mieć uprawnień, nie mieć miejsca na dysku, ty tego nie przewidzisz, dlatego jest ten wyjątek i masz tutaj 2 rozwiązania:

1. Wyświetlić error dla użytkownika że się nie udało i PRZERWAĆ kod, nie kontynuować, bo skoro pliku nie udało się stworzyć, to tym bardziej nie uda się nic do niego zapisać.

2. Wyrzucić error wyżej, pakując go w innego exception, np:

public class GameSaveException extends RuntimeException
{
    public GameSaveException(String msg, Throwable cause)
    {
        super(msg, cause);
    }
}

i nasz kod:

File file = new File("gameSave.dat");
try
{
    file.createNewFile();
}
catch(IOException e)
{
    throw new GameSaveException("Nie można stworzyć pliku zapisu gry! Możliwe że nie masz uprawnień lub miejsca na dysku.", e); // jeśli ten błąd zostanie gdzieś wyprintowany, zobaczymy i nasz błąd, jak i ten IOException który go spowodował.
}
// a tutaj kod od zapisu czegoś do tego pliku

Oczywiście w takim rozwiązaniu powinniśmy mieć gdzieś wyżej innego catch który ten błąd złapie i już wyświetli poprawny komunikat, chyba że to jakiś prosty program/serwer dla bardziej zaawansowanych użytkowników, wtedy można po prostu pozwolić się temu errorowi wyprintować do konsoli, o ile nie spowoduje on niczego poważnego, np tutaj spowoduje że gra się nie zacznie, ale użytkownik nie straci żadnych danych itd.

 

 

To tak w uproszczeniu wszystko :D

Więcej przydatnych informacji tutaj: https://docs.oracle.com/javase/tutorial/essential/exceptions/

 

Dziękuję :D

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...