Kod x = x % y; jest klasycznym przykładem operacji, która może prowadzić do wystąpienia wyjątku ArithmeticException w Javie, szczególnie gdy zmienna y przyjmuje wartość zero. Operator modulo (%) w języku Java nie toleruje dzielenia przez zero – w przeciwieństwie do niektórych innych języków, które mogą zwracać np. NaN lub Infinity, tutaj od razu zostanie zgłoszony wyjątek. Taki wyjątek jest dość powszechny w pracy programisty, zwłaszcza w aplikacjach, gdzie dane wejściowe nie są do końca kontrolowane. Moim zdaniem dobrze jest od razu przyzwyczaić się do zabezpieczania wszystkich operacji dzielenia i modulo poprzez wcześniejsze sprawdzenie wartości dzielnika. Rekomenduje się stosowanie warunków typu if (y != 0) przed wykonaniem takiej instrukcji, co jest zgodne z dobrymi praktykami defensywnego programowania. Dodatkowo, w środowiskach produkcyjnych często otacza się te fragmenty kodu blokiem try-catch, aby elegancko obsłużyć wyjątek i np. wyświetlić użytkownikowi zrozumiały komunikat. Warto pamiętać, że ArithmeticException dziedziczy po RuntimeException, a więc nie musimy jej jawnie obsługiwać, ale nie oznacza to, że powinniśmy ją ignorować – w dobrze napisanym kodzie zawsze należy przewidywać takie sytuacje. Z mojego doświadczenia wynika, że najwięcej błędów z tym związanych pojawia się w aplikacjach przetwarzających dane liczbowe, gdzie nawet niepozorna operacja modulo może „wywalić” cały proces, jeśli nie zostanie odpowiednio zaopiekowana.
Pojawienie się komunikatu Exception in thread "main" java.lang.ArithmeticException: / by zero jest jednoznacznie powiązane z próbą wykonania operacji dzielenia lub modulo przez zero. Tymczasem nie każda operacja na liczbach czy tablicach w Javie prowadzi do takiego wyjątku. Przypisanie wartości do zmiennej, jak x = 0;, jest zupełnie bezpieczne i nie generuje żadnego wyjątku – to po prostu podstawowa operacja inicjalizacji. Podobnie konstrukcja warunkowa typu if (x > y) … sama w sobie nie wykonuje żadnych operacji arytmetycznych, a jedynie porównuje wartości. Tego rodzaju instrukcja nie może wygenerować ArithmeticException, bo nie ma tu dzielenia ani reszty z dzielenia. Często jednak intuicyjnie myli się wyjątki arytmetyczne z błędami związanymi z dostępem do elementów tablicy. Na przykład zapis x = tablica[6]; może prowadzić do IndexOutOfBoundsException, jeśli tablica ma mniej niż 7 elementów, ale to zupełnie inny typ błędu – dotyczy zakresu tablicy, a nie arytmetyki. Z mojego doświadczenia wynika, że taki błąd logiczny pojawia się, gdy programiści nie rozróżniają rodzajów wyjątków lub nie zapoznają się dokładnie z komunikatami błędów. Branżowym standardem jest zawsze analizować dokładnie stack trace błędów i rozróżniać, które operacje mogą generować jakie wyjątki, bo to pozwala lepiej projektować logikę obsługi błędów w aplikacjach. W Javie ArithmeticException to sygnał, że coś poszło nie tak z działaniem matematycznym, a nie z dostępem do pamięci czy porównywaniem wartości. Warto więc poświęcić chwilę na zrozumienie tego rozróżnienia – to się później bardzo opłaca w praktyce.