CodeGym/Blog Java/Random-PL/Wyjątek zgłaszania Java
John Squirrels
Poziom 41
San Francisco

Wyjątek zgłaszania Java

Opublikowano w grupie Random-PL
Gdziekolwiek się udamy, czekają na nas nieprzewidywalne wydarzenia. Trzęsienia ziemi, irracjonalne działania ludzi, meteoryty… lub coś prostszego – przepala się żarówka, rozmagnesowuje się karta bankowa, psuje się wskaźnik benzyny. Nieprzewidywalnych zdarzeń nie jesteśmy w stanie wyłączyć, ale możemy przynajmniej częściowo się na nie przygotować. Oznacza to, że musimy przygotować pewne mechanizmy, aby sobie z nimi poradzić. W świecie programowania, szczególnie w języku Java, zdarzenia uniemożliwiające normalne działanie programu nazywane są wyjątkami, a mechanizmy zapobiegające awariom programu nazywane są obsługą wyjątków. Zatem, gdy w programie wystąpi nieoczekiwane zdarzenie, takie jak dzielenie przez zero, powinien on „zgłosić” wyjątek. Obsługa wyjątków to ważny aspekt programowania w języku Java, który pomaga programistom zarządzać błędami i wyjątkami, które mogą wystąpić podczas wykonywania programu. W tym artykule skupimy się na jednym z podstawowych pojęć związanych z obsługą wyjątków: słowie kluczowym rzucania w Javie i sposobie jego użycia do zgłoszenia wyjątku.

Co to jest wyjątek w Javie?

Wyjątek to zdarzenie mające miejsce podczas wykonywania programu, które zakłóca normalny przepływ instrukcji programu. Gdy wystąpi wyjątek, wykonywanie programu zostanie zatrzymane, a na konsoli zostanie wyświetlony komunikat o błędzie. W Javie istnieją dwa typy wyjątków: zaznaczone i niesprawdzone. Sprawdzone wyjątki są sprawdzane w czasie kompilacji, a kompilator dba o to, aby zostały one przechwycone lub zadeklarowane przez metodę wywołującą. Z drugiej strony niesprawdzone wyjątki nie są sprawdzane w czasie kompilacji i można je przechwycić lub pozostawić nieprzechwycone. Oto przykład kodu, w którym może wystąpić błąd, ale kompilator go pomija.
public class Factorial {
   public static long getFactorial(final int number) {
           long fact = 1;
           for (int i = 1; i <= number; i++) {
               fact = fact * i;
           }
           return fact;
   }

   public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }

}
Oto wynik działania programu:
1 -4249290049419214848
Program zakończył działanie poprawnie, ale dał nieprawidłowy wynik. W pierwszym przypadku dlatego, że argument funkcji był ujemny, a silnia nie działa dla liczb ujemnych. W drugim przypadku wynik był błędny, ponieważ liczba jest zbyt duża, aby policzyć jej silnię w zakresie typu długiego. Oto kolejny przykład. Napiszmy program, w którym podzielimy jedną liczbę przez drugą.
public class DivisionExample {

       public static void main(String[] args) {
           int a = 10;
           int b = 0;
           int result = divide(a, b);
           System.out.println(result);
       }

       public static int divide(int a, int b) {
           return a / b;
       }
}
W tym przykładzie zostanie zgłoszony wyjątek ArithmeticException , ponieważ zmienna b ma wartość zero. Jednak ten błąd nie jest obsługiwany, więc program kończy działanie z nieprawidłowym statusem.

Jak zgłosić wyjątek w Javie

W Javie wyjątki są także obiektami, więc wyjątek jest zgłaszany tak samo, jak tworzony jest nowy obiekt wyjątku. W programie zgłaszany jest wyjątek za pomocą instrukcji rzutu. Zwykle te dwie operacje (tworzenie obiektu i zgłaszanie wyjątku) są łączone w jedną:
throw new Exception("error…");
Słowo kluczowe rzut w Javie służy do zgłaszania wyjątku od metody lub bloku kodu, gdy wystąpi błąd lub wyjątkowy warunek, którego program nie może obsłużyć w czasie wykonywania. Przebieg programu zostaje przekierowany do najbliższego bloku catch. Ten blok może zarządzać wyjątkiem.

Przykład użycia słowa kluczowego „throw”.

Aby zilustrować funkcjonalność słowa kluczowego rzut w Javie, weźmy przykład. Napiszmy metodę obliczania silni liczby. Jeśli liczba jest ujemna, nie można jej obliczyć, dlatego należy zgłosić wyjątek. Podobnie, jeśli liczba jest zbyt duża, wynik silni przekroczy maksymalny rozmiar typu długiego i zostanie zgłoszony kolejny wyjątek. Tutaj mamy implementację metody:
public Class Factorial {

public static long getFactorial(final int number) {
   if ((number >= 0) && (number < 21)) {
       long fact = 1;
       for (int i = 1; i <= number; i++) {
           fact = fact * i;
       }
       return fact;
   } else {

//throw new exception here
       throw new IllegalArgumentException("THe argument isn't legal");
   }
}

 public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }
}
W tym przykładzie, jeśli wartość liczby jest ujemna, słowo kluczowe Throw służy do zgłaszania instancji klasy IllegalArgumentException . Jeżeli uruchomisz program, na konsoli wyświetli się komunikat "Argument jest nieprawidłowy" . Wykonywanie programu zostanie zatrzymane.

Nigdy więcej błędów: przechwycenie przykładu wyjątku

Przypomnijmy sobie teraz drugi przykład z dzieleniem przez zero i wykonajmy go z obsługą wyjątków.
public class DivisionExample {

    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int result = divide(a, b);
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: division by zero");
        }
    }

    public static int divide(int a, int b) {
        return a / b;
    }
}
W tym przykładzie dodaliśmy konstrukcję try-catch do obsługi wyjątku polegającego na dzieleniu przez zero. Krótko mówiąc, try-catch-finally to konstrukcja języka programowania Java, która umożliwia obsługę wyjątków i wykonywanie kodu niezależnie od tego, czy wystąpił wyjątek, czy nie. try-catch-finally składa się z trzech bloków:
  • Blok próbny . W tym miejscu wykonywany jest potencjalnie niebezpieczny kod. To jest kod, który może zgłosić wyjątek. Jeśli w bloku try wystąpi wyjątek , wykonanie kodu w tym bloku zostanie przerwane, a kontrola zostanie przekazana do bloku catch.
  • Blok catch . Tutaj obsługiwany jest zgłoszony wyjątek. W bloku catch możesz określić, który wyjątek ma zostać przechwycony i jaką logikę wykonać po jego przechwyceniu.
  • Wreszcie blok . Ten jest wykonywany niezależnie od tego, czy wystąpił wyjątek, czy nie. Blok Final służy na przykład do zwolnienia zasobów (takich jak zamknięcie pliku lub gniazda), które zostały przydzielone w bloku try. Możesz pominąć ten blok.
Konstrukcja try -catch-finally pozwala na bardziej precyzyjną kontrolę nad wykonaniem programu w przypadku wyjątkowych sytuacji i pomaga zapobiegać nieoczekiwanemu zakończeniu programu w przypadku błędów. Wróćmy teraz do naszego przykładu. Jeśli podczas metody dzielenia nastąpi dzielenie przez zero, zostanie zgłoszony wyjątek ArithmeticException , który zostanie przechwycony przez blok catch. W bloku catch po prostu wypisujemy na konsoli komunikat o błędzie. Jeśli nie wystąpi żaden wyjątek, program będzie kontynuował wykonywanie.

rzuca słowo kluczowe

Słowo kluczowe rzuca jest używane w sygnaturze metody. Jeśli tak, oznacza to, że w metodzie zgłaszany jest wyjątek. Może to propagować wyjątki w górę stosu wywołań i wskazywać, że wyjątki nie muszą być obsługiwane w bieżącej metodzie. W Javie „rzutów” można również używać w odniesieniu do niestandardowych wyjątków zdefiniowanych w programie. Na przykład metoda może wykonać dzielenie dwóch liczb, ale wygeneruje wyjątek IllegalArgumentException , jeśli drugi argument ma wartość zero:
public static double divide(double a, double b) throws IllegalArgumentException {
    if (b == 0) {
        throw new IllegalArgumentException("Division by zero is not allowed");
    }
    return a / b;
}
Ta metoda używa słowa kluczowego rzuca, aby wskazać, że wyjątek IllegalArgumentException może zostać zgłoszony, jeśli drugi argument ma wartość null. Jeśli taki wyjątek wystąpi podczas wykonywania metody, zostanie on przekazany do metody wywołującej w celu przetworzenia. Przykład wywołania metody:
public static void main(String[] args) {
    double result = 0;
    try {
        result = divide(10, 0);
    } catch (IllegalArgumentException e) {
        System.out.println("Error: " + e.getMessage());
    }
    System.out.println("Result: " + result);
}
W tym przykładzie wywoływana jest metoda dzielenia() z argumentami 10 i 0, co powoduje zgłoszenie wyjątku IllegalArgumentException , ponieważ dzielenie przez zero jest niemożliwe. Wyjątek zostanie przechwycony przez blok try-catch i wyświetlony zostanie komunikat o błędzie. Program zwróci wartość zero, ponieważ wyjątek kończy wykonywanie metody dzielenia () .
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy