JavaRush /Blog Java /Random-PL /Przerwa kawowa #220. Jak naprawić wyjątki w Javie — szcze...

Przerwa kawowa #220. Jak naprawić wyjątki w Javie — szczegółowy przewodnik

Opublikowano w grupie Random-PL
Źródło: JavaTechOnline Ten samouczek pomoże Ci dowiedzieć się, jak naprawić typowe wyjątki w Javie. Oprócz teorii zobaczysz przykłady kodu, które rozwiązują takie problemy. Przerwa kawowa #220.  Jak naprawić wyjątki w Javie — szczegółowy przewodnik — 1Podobnie jak w przypadku innych języków programowania, programiści Java mogą napotkać błędy lub wyjątki podczas pisania kodu. Wyjątki należy traktować poważnie, gdyż ich wystąpienie pochłania czas pracy. Jednak przy odrobinie wiedzy można przyspieszyć rozwiązanie większości tych problemów. Nauczmy się więc naprawiać typowe wyjątki w Javie.

Ogólne wytyczne dotyczące unikania wyjątków w Javie

Aby uniknąć zgłaszania jakichkolwiek wyjątków w Javie, ważne jest zrozumienie i przestrzeganie wskazówek dotyczących kodowania:
  1. Zawsze sprawdzaj dane wprowadzone przez użytkownika przed użyciem ich w kodzie.
  2. Użyj try-catch , rzutów , rzutów blokami , w zależności od tego, co jest odpowiednie dla konkretnego scenariusza.
  3. Nie zaniedbuj komunikatów w kodzie o przetwarzaniu i błędach. Pomoże to zidentyfikować i naprawić problemy.
  4. Pamiętaj, aby rejestrować wyjątki na potrzeby debugowania. Do identyfikowania problemów można używać komunikatów rejestratora.
  5. Postępuj zgodnie z najlepszymi praktykami kodowania, aby uniknąć wyjątków i dokładnie przetestuj swój kod.
  6. Zaktualizuj zależności API, aby mieć pewność, że używasz najnowszych i najbardziej stabilnych wersji bibliotek i struktur.
  7. Użyj niezbędnych narzędzi i struktur testowych, aby zidentyfikować potencjalne problemy w kodzie, zanim spowodują wyjątki.
  8. Monitoruj wydajność aplikacji i dzienniki, aby szybko identyfikować i rozwiązywać wszelkie problemy.
  9. Bądź na bieżąco z najlepszymi praktykami bezpieczeństwa, aby mieć pewność, że Twój kod jest bezpieczny i chroniony przed potencjalnymi atakami.
  10. Dokładnie udokumentuj swój kod i jego wyjątki, aby ułatwić innym programistom zrozumienie i utrzymanie.

Lista najczęstszych wyjątków w Javie

Java ma dość długą listę wyjątków. Przyjrzyjmy się niektórym z najczęstszych:

Wyjątek NullPointer

NullPointerException jest typem wyjątku RuntimeException . Dzieje się tak, gdy próbujemy użyć zmiennej referencyjnej, która ma wartość null. Oznacza to, że wskazuje obiekt lub zmienną, której wartość wynosi null . Taki błąd może wystąpić, gdy spróbujemy wywołać metodę lub uzyskać dostęp do pola obiektu, który nie został zainicjowany, lub gdy przekażemy null jako parametr do metody, która go nie obsługuje. Aby zapobiec zgłaszaniu wyjątku NullPointerException , możesz sprawdzić, czy zmienna referencyjna ma wartość null, używając operatora == . W takim przypadku należy poprawnie obsłużyć przypadek zerowy. Alternatywnie możemy zainicjować nasze zmienne do wartości domyślnych (jeśli to możliwe), aby mieć pewność, że nigdy nie spotkamy się z referencją zerową. Innym sposobem uniknięcia wyjątku NullPointerException jest użycie klasy Opcjonalne . W Javie obiekt opcjonalny to obiekt kontenera, który może zawierać wartość różną od null lub nie. Służy do reprezentowania obecności lub braku wartości, podobnie jak wartość null jest używana do reprezentowania braku wartości. Jeśli programista spróbuje uzyskać dostęp do pustej wartości obiektu Opcjonalnego , program nie zgłosi wyjątku NullPointerException , ale zamiast tego zwróci pusty obiekt Opcjonalny . Innymi słowy, Option zmusza programistę do obsługi przypadku, w którym brakuje wartości, co pomaga uniknąć wyjątku NullPointerException .

Wyjątek IndexOutOfBounds

IndexOutOfBoundsException to wyjątek czasu wykonywania, który jest zgłaszany, gdy indeks używany do uzyskania dostępu do tablicy lub kolekcji jest ujemny lub większy lub równy rozmiarowi tablicy lub kolekcji. Aby zapobiec wystąpieniu tego wyjątku, musimy upewnić się, że indeks używany do uzyskania dostępu do tablicy lub kolekcji mieści się w jego granicach, to znaczy musi być większy lub równy zero i mniejszy niż rozmiar tablicy lub kolekcji.

Wyjątek ArrayIndexOutOfBounds

ArrayIndexOutOfBoundsException to typ IndexOutOfBoundsException , który jest zgłaszany w przypadku próby uzyskania dostępu do tablicy o nieprawidłowym indeksie. W Javie indeksy tablicy zaczynają się od 0 i kończą na długości()-1 , gdzie długość() to liczba elementów tablicy. Jeśli spróbujesz uzyskać dostęp do elementu o indeksie spoza tego zakresu, Java zgłosi wyjątek ArrayIndexOutOfBoundsException . W przypadku napotkania wyjątku ArrayIndexOutOfBoundsException należy przejrzeć kod, aby upewnić się, że podczas uzyskiwania dostępu do elementów tablicy używasz poprawnych indeksów.

Wyjątek StringIndexOutOfBounds

StringIndexOutOfBoundsException to typ IndexOutOfBoundsException , który jest generowany, gdy podejmowana jest próba dostępu do znaku w ciągu, który ma nieprawidłowy indeks. Podobnie jak w przypadku poprzedniego wyjątku ArrayIndexOutOfBoundsException , należy pamiętać, że w Javie indeks łańcucha zaczyna się od 0 i kończy na długości()-1 , gdzie długość() to liczba znaków w ciągu. Jeśli spróbujesz uzyskać dostęp do znaku o indeksie spoza tego zakresu, możesz napotkać wyjątek StringIndexOutOfBoundsException . Jeśli napotkasz wyjątek StringIndexOutOfBoundsException , powinieneś przejrzeć swój kod, aby upewnić się, że używasz poprawnych indeksów podczas uzyskiwania dostępu do znaków w ciągu.

Wyjątek ClassCast

Ten wyjątek występuje, gdy próbujemy rzucić obiekt na typ, który jest niezgodny z jego rzeczywistym typem. Aby rozwiązać taki problem, ważne jest, aby program Java próbował rzutować obiekty tylko na klasy, których są instancjami. Możesz sprawdzić typ obiektu za pomocą operatora instancjiof przed zastosowaniem rzutowania.

Wyjątek IllegalArgument

IllegalArgumentException to typ wyjątku RuntimeException , który jest zgłaszany, gdy wywoływana jest metoda z nieprawidłowym lub niewłaściwym argumentem. Innymi słowy, ten błąd może wystąpić, gdy metoda zostanie wywołana z argumentem spoza oczekiwanego zakresu lub nie ma oczekiwanego formatu lub struktury. Na przykład metoda wymaga jako argumentu liczby dodatniej, a my podajemy liczbę ujemną, co jest nieprawidłowym wprowadzeniem. Jeśli napotkasz wyjątek IllegalArgumentException , powinieneś sprawdzić swój kod, aby upewnić się, że wywołujesz metody z prawidłowymi i odpowiednimi argumentami.

Wyjątek IllegalStateException

IllegalStateException to typ wyjątku RuntimeException , który jest zgłaszany, gdy obiekt znajduje się w stanie nieodpowiednim dla wykonywanej operacji. Może się to zdarzyć, jeśli metoda zostanie wywołana na obiekcie, który nie jest w oczekiwanym stanie. Na przykład, jeśli utworzymy obiekt połączenia z bazą danych, a następnie go zamkniemy. Jeśli następnie spróbujemy utworzyć obiekt Statement w zamkniętym połączeniu, zgłosi wyjątek IllegalStateException , ponieważ metoda createStatement() wymaga otwartego połączenia. Jeśli napotkasz wyjątek IllegalStateException , powinieneś przejrzeć swój kod, aby upewnić się, że wywołujesz metody na obiektach, które są w odpowiednim stanie.

Nieobsługiwany wyjątek operacji

UnsupportedOperationException to typ RuntimeException , który jest zgłaszany w przypadku próby wykonania nieobsługiwanej operacji na obiekcie. Ten błąd może wystąpić, gdy wywołamy metodę, która nie jest zaimplementowana przez obiekt lub nie jest obsługiwana przez obiekt. Aby zapobiec rzuceniu wyjątku, nie powinniśmy wywoływać takich operacji, które nie są obsługiwane na obiektach. Musimy przejrzeć nasz kod, aby upewnić się, że wywołujemy metody na obiektach obsługujących tę operację.

Wyjątek arytmetyczny

ArithmeticException to typ wyjątku RuntimeException , który jest zgłaszany, gdy operacja arytmetyczna daje nieprawidłowy wynik. Ten wyjątek może wystąpić, gdy próbujemy wykonać operację arytmetyczną z nieprawidłowym lub niepoprawnym argumentem. Na przykład, gdy próbujesz podzielić przez zero. Aby rozwiązać ten problem, przed wykonaniem operacji arytmetycznej możemy przeprowadzić walidację danych wejściowych i upewnić się, że argumenty spełniają wymagane warunki.

Wyjątek bezpieczeństwa

SecurityException to typ wyjątku RuntimeException , który jest zgłaszany, gdy podczas wykonywania programu nastąpi naruszenie bezpieczeństwa. Ten błąd może wystąpić, gdy program próbuje wykonać operację, która nie jest dozwolona przez politykę bezpieczeństwa. Aby rozwiązać problem, musimy zadbać o to, aby mieć dostęp do zasobów i wykonywać operacje, na które mamy określone uprawnienia.

Wyjątek NumberFormat

NumberFormatException to typ wyjątku RuntimeException , który jest generowany, gdy wywoływana jest metoda w celu przekonwertowania ciągu na format liczbowy, ale ciąg nie ma odpowiedniego formatu. Aby rozwiązać ten problem, musimy najpierw sprawdzić dane wprowadzone przez użytkownika, zanim podejmiemy próbę ich konwersji. Sprawdź także swój kod, aby upewnić się, że próbujesz przekonwertować ciągi znaków, które są sformatowane odpowiednio dla docelowego typu liczbowego.

Przerwany wyjątek

InterruptedException to sprawdzony wyjątek, który jest zgłaszany, jeśli wątek czeka, śpi lub blokuje jakieś zdarzenie, a zdarzenie to zostaje przerwane przez inny wątek. Błąd może wystąpić, gdy wątek oczekuje na dane wejściowe, zwalnia blokadę lub kończy inną operację, a inny wątek przerywa oczekujący wątek. Aby rozwiązać ten problem, możesz przechwycić wyjątek InterruptedException i zareagować, czyszcząc zasoby, zatrzymując wątek lub podejmując inne odpowiednie działanie. Jeśli napotkasz wyjątek InterruptedException , powinieneś sprawdzić swój kod, aby upewnić się, że poprawnie obsługujesz przerwania wątku.

Wyjątek FileNotFoundException

FileNotFoundException to sprawdzony wyjątek, który jest zgłaszany, gdy program próbuje uzyskać dostęp do pliku, który nie istnieje lub nie można go znaleźć w określonej lokalizacji. Może się pojawić, jeśli plik zostanie błędnie napisany, przeniesiony lub usunięty, a nawet wtedy, gdy program nie ma niezbędnych uprawnień dostępu do pliku. Aby naprawić błąd, możesz sprawdzić poprawność danych wejściowych, aby upewnić się, że ścieżka pliku jest poprawna i że program ma niezbędne uprawnienia dostępu do pliku.

Wyjątek IO

IOException to sprawdzony wyjątek w języku Java, który reprezentuje błąd napotkany podczas wykonywania operacji wejściowych lub wyjściowych, takich jak odczyt lub zapis do pliku lub gniazda sieciowego. Może się to zdarzyć z kilku powodów, takich jak brak określonego pliku lub jego niedostępność, błąd sieciowy lub niewystarczające uprawnienia. Aby rozwiązać problem, musisz wykonać kilka czynności, takich jak sprawdzenie komunikatu o błędzie, obsługa wyjątku za pomocą try-catch , zamknięcie zasobów, sprawdzenie uprawnień do pliku i tak dalej.

Wyjątek NoSuchMethodException

NoSuchMethodException to wyjątek zgłaszany w czasie wykonywania, gdy próbujemy wywołać metodę, która nie istnieje w klasie. Ten wyjątek zwykle występuje, jeśli wywołamy metodę za pomocą Class.getMethod() lub Class.getDeclaredMethod() , a podana nazwa metody nie zostanie znaleziona w klasie lub interfejsie. Wyjątek może wystąpić również wtedy, gdy spróbujemy wywołać metodę z wykorzystaniem klasy java.lang.reflect.Method , a podana nazwa metody nie istnieje w obiekcie. Aby uniknąć tego wyjątku, należy wywołać prawidłową metodę z poprawną sygnaturą metody i specyfikatorem dostępu.

Wyjątek NoSuchField

NoSuchFieldException to wyjątek środowiska wykonawczego, który występuje, gdy próbujemy uzyskać dostęp do pola, którego nie ma w klasie. Ten wyjątek zwykle występuje, gdy wywołujemy metodę za pomocą Class.getField() lub Class.getDeclaredField() i określona nazwa pola nie została znaleziona w klasie lub interfejsie. Dodatkowo można je wywołać również wtedy, gdy próbujemy uzyskać dostęp do pola za pomocą klasy java.lang.reflect.Field , a podana nazwa pola nie istnieje w obiekcie. Aby uniknąć tego wyjątku, upewnij się, że uzyskujesz dostęp do prawidłowego pola z poprawną nazwą i modyfikatorami dostępu. Jeśli uzyskujesz dostęp do pola prywatnego, pamiętaj o użyciu metody getDeclaredField() zamiast metody getField() .

Wyjątek IllegalAccess

IllegalAccessException to wyjątek czasu wykonywania, który występuje, gdy próbujemy uzyskać dostęp do pola lub metody w klasie, ale nie mamy wymaganych praw dostępu. Ten wyjątek zwykle pojawia się, gdy próbujemy uzyskać dostęp do prywatnego pola lub metody spoza klasy lub gdy próbujemy uzyskać dostęp do chronionego pola lub metody z klasy, która nie jest podklasą oryginalnej klasy. Można ją także wywołać, próbując uzyskać dostęp do pola lub metody, która została oznaczona jako niedostępna przez klasę java.lang.reflect.AccessibleObject . Aby uniknąć tego problemu, upewnij się, że masz niezbędne uprawnienia do pola lub metody, do której próbujesz uzyskać dostęp. Jeśli pole lub metoda jest prywatna, może być konieczne użycie odbicia i ustawienie AccessibleObject na true (aby uzyskać do niego dostęp). Należy jednak zachować ostrożność podczas korzystania z refleksji w celu uzyskania dostępu do prywatnych pól lub metod, ponieważ może to spowodować przerwanie enkapsulacji i naruszyć integralność klasy.

Sprawdź błąd

VerifyError to błąd wykonania, który jest podklasą LinkageError . Dzieje się tak, gdy wirtualna maszyna Java (JVM) napotyka plik klasy, który narusza określone reguły sprawdzania poprawności. Kiedy kompilowana jest klasa Java, kompilator sprawdza, czy kod bajtowy jest zgodny z pewnymi regułami i ograniczeniami, takimi jak bezpieczeństwo typów oraz prawidłowe użycie stosu i zmiennych lokalnych. Jeśli plik klasy narusza te zasady, maszyna JVM zgłosi błąd VerifyError podczas ładowania i sprawdzania klasy w czasie wykonywania. Aby uniknąć VerifyError , upewnij się, że Twój kod jest zgodny z poprawną składnią i semantyką języka Java. Jeśli napotkasz błąd VerifyError , powinieneś sprawdzić swój kod, aby upewnić się, że jest prawidłowy i nie narusza reguł weryfikacji kodu bajtowego Java.

Błąd brak pamięci

OutOfMemoryError jest podklasą Error , typu Throwable , który wprowadza poważne problemy, których nie można rozwiązać w czasie wykonywania. Mimo że Java 8 zawiera pewne ulepszenia w zakresie usuwania elementów bezużytecznych i zarządzania pamięcią, nadal może wystąpić błąd OutOfMemoryError , jeśli aplikacja zużywa zbyt dużo pamięci lub nieprawidłowo zarządza jej wykorzystaniem. Aby uniknąć OutOfMemoryError , musisz odpowiednio zarządzać wykorzystaniem pamięci w aplikacji Java. Wiąże się to z wykorzystaniem struktur danych i algorytmów efektywnie wykorzystujących pamięć, unikaniem tworzenia niepotrzebnych obiektów i prawidłowym usuwaniem obiektów, gdy nie są już potrzebne. Ponadto można zwiększyć maksymalny rozmiar sterty maszyny JVM, używając flagi -Xmx podczas uruchamiania programu Java.

Błąd przepełnienia stosu

StackOverflowError to rodzaj błędu, który pojawia się, gdy rozmiar stosu wymagany przez program przekracza ilość przydzielonej mu pamięci. Może się to zdarzyć, gdy program wywoła zbyt wiele metod zagnieżdżonych lub gdy metoda wywoła się rekurencyjnie zbyt wiele razy, co spowoduje nieskończoną pętlę. Wirtualna maszyna Java (JVM) przydziela stałą ilość pamięci dla stosu wykonawczego, który służy do śledzenia wywołań metod i zmiennych lokalnych. Gdy stos się przepełni, JVM zgłasza StackOverflowError . Aby uniknąć StackOverflowError , ważne jest, aby upewnić się, że program Java odpowiednio wykorzystuje wywołania rekurencji i metod. Jeśli napotkasz błąd StackOverflowError , możesz spróbować zwiększyć rozmiar stosu, używając flagi -Xss podczas uruchamiania programu Java.

Wyjątek InvocationTargetException

InvocationTargetException to sprawdzony wyjątek zgłaszany przez mechanizm odbicia Java. Jest częścią pakietu java.lang.reflect.InvocationTargetException i służy do wskazania, że ​​wystąpił wyjątek podczas wywołania metody lub konstruktora. Kiedy metoda lub konstruktor jest wywoływany przy użyciu mechanizmu odbicia Java, wywoływana jest metoda invoke() klasy java.lang.reflect.Method lub java.lang.reflect.Constructor . Jeśli wywołana metoda lub konstruktor zgłosi wyjątek, metoda invoke() przechwyci go i zawinie w wyjątek InvocationTargetException . Ten wyjątek jest następnie przekazywany do obiektu wywołującego metodę invoke() . Aby naprawić wyjątek InvocationTargetException , musimy go przechwycić, uzyskać wyjątek przyczyny głównej za pomocą metody getCause() i odpowiednio obsłużyć wyjątek przyczyny głównej. Pamiętaj, że główną przyczyną może być sprawdzony wyjątek lub wyjątek środowiska wykonawczego, więc pamiętaj o prawidłowej obsłudze tego problemu.

Sposoby naprawienia najczęstszych wyjątków w Javie

Jak naprawić wyjątek NullPointerException

Scenariusz: masz metodę uzyskującą dostęp do obiektu o wartości null .
String title= null;
System.out.println(title.length()); // Это вызовет NullPointerException
Rozwiązanie nr 1: Przed użyciem sprawdź, czy obiekt ma wartość null.
if(title!= null) {
   System.out.println(title.length());
} else {
   System.out.println("title is null");
}
Rozwiązanie nr 2: Użyj opcji Opcjonalnie , aby uniknąć wyjątku NullPointerException .
Optional<String> optionalTitle = Optional.ofNullable(getTitle());
if (optionalTitle.isPresent()) {
   String title= optionalTitle.get();
   System.out.println("Title: " + title);
} else {
   System.out.println("Title is not available.");
}

Jak naprawić wyjątek ArrayIndexOutOfBoundsException

Scenariusz: próbujesz uzyskać dostęp do tablicy o indeksie, który znajduje się poza jej granicami.
int[] numbers = {4, 5, 6};
System.out.println(numbers[3]);   // Это вызовет ArrayIndexOutOfBoundsException
Rozwiązanie: Sprawdź długość tablicy przed uzyskaniem do niej dostępu i upewnij się, że używasz prawidłowych indeksów.
int[] numbers = {4, 5, 6};
if (numbers.length > 3) {
   System.out.println(numbers[3]);
} else {
   System.out.println("ArrayIndexOutOfBoundsException: Please use valid indexes of the Array");
}

Jak naprawić wyjątek ClassCastException

Scenariusz: próbujesz rzutować obiekt na typ, który jest niezgodny z jego rzeczywistym typem.
Object obj = "Java Exception";
Integer number = (Integer) obj; // Это вызовет ClassCastException
Rozwiązanie: Upewnij się, że rzucasz obiekty tylko do typów, z którymi są kompatybilne.
Object obj = "Java Exception";
if(obj instanceof Integer) {
   Integer number = (Integer) obj;
   System.out.println(number);
} else {
   System.out.println("Object cannot caste to Integer");
}

Jak naprawić wyjątek IllegalArgumentException

Scenariusz: przekazałeś nieprawidłowy argument do metody.
public void printNumber(int number) {
   if(number <= 0) {
      throw new IllegalArgumentException("You cannot pass a negative number or zero");
   }
   System.out.println(number);
}

printNumber(-1); // Это вызовет IllegalArgumentException
Rozwiązanie: Upewnij się, że przekazujesz prawidłowe argumenty do metod. W takim przypadku podaj liczbę dodatnią.
printNumber(1); //  Это успешно напечатает 1.

Jak naprawić wyjątek IllegalStateException

Scenariusz: obiekt jest w nieprawidłowym stanie.
public class Bike {

   private Boolean isStarted;

   public void start() {
      if(isStarted) {
        throw new IllegalStateException("Bike is already started");
      }
      isStarted = true;
      System.out.println("Bike started");
   }
}

Bike bike= new Bike();
bike.start();
bike.start(); // Это вызовет IllegalStateException потому что bike is already started
Rozwiązanie: Upewnij się, że prawidłowo utrzymujesz stan obiektu.
Bike bike= new Bike();
bike.start();

Jak naprawić wyjątek UnsupportedOperationException

Scenariusz: Używasz operacji, która nie jest obsługiwana przez obiekt. Jednym z popularnych przykładów jest użycie operacji usuwania() na niezmiennej kolekcji, prawdopodobnie zostanie wyświetlony wyjątek UnsupportedOperationException .
List<String> list = Arrays.asList("Java", "Angular", "Spring");
list.add("Python"); // Это вызовет UnsupportedOperationException
Ponieważ metoda Arrays.asList() zwraca niezmienną listę, nie obsługuje ona dodawania ani usuwania elementów. Rozwiązanie: Upewnij się, że wywołujesz tylko obsługiwane operacje na obiektach.
List<String> list = new ArrayList<>(Arrays.asList("Java", "Angular" "Spring"));
list.add("Python");
System.out.println(list);

Jak naprawić wyjątek ArithmeticException

Scenariusz nr 1: Próbujesz wykonać operację dzielenia liczb całkowitych, która daje wynik ułamkowy.
int i = 10;
int j = 4;
int k = i/j; // Это вызовет исключение ArithmeticException: целочисленное деление будет дробным
Tutaj wynik operacji dzielenia wynosi 2,5, co jest wartością ułamkową. Ponieważ liczby całkowite nie mogą przechowywać wartości ułamkowych, zgłaszany jest wyjątek ArithmeticException . Rozwiązanie: Aby uniknąć tego wyjątku, możemy użyć typu danych obsługującego wartości ułamkowe, np. double , do przechowywania wyniku operacji dzielenia. Oto przykład:
int i = 10;
int j = 4;
double k = (double) i/j;
Scenariusz nr 2: Próbujesz podzielić przez zero i otrzymujesz wyjątek. To najczęstszy scenariusz.
int i = 4;
int j = 0;
int k = i/j; // Это вызовет исключение ArithmeticException: нельзя делить на ноль
Rozwiązanie: Prawidłowo obsługuj dzielenie przez zero. Na przykład poniższy kod demonstruje prawidłowe przetwarzanie.
int i = 4;
int j = 0;
if(j != 0) {
int k = i/j;
System.out.println(k);
} else {
System.out.println("ArithmeticException: Cannot divide by zero");
}

Jak naprawić wyjątek IndexOutOfBoundsException

Scenariusz: próbujesz uzyskać dostęp do kolekcji z indeksem, który znajduje się poza nią.
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
System.out.println(list.get(3)); // Это вызовет IndexOutOfBoundsException
Rozwiązanie: Sprawdź rozmiar kolekcji przed uzyskaniem do niej dostępu i upewnij się, że używasz prawidłowych indeksów.
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
if (list.size() > 3) {
   System.out.println(list.get(3));
} else {
   System.out.println("You are using the Index which is out of bounds");
}

Jak naprawić wyjątek IOException

Scenariusz: operacja wejścia/wyjścia kończy się niepowodzeniem, ponieważ plik jest niedostępny.
try {
   File inputFile = new FileReader("pqr.txt");
   BufferedReader reader = new BufferedReader(inputFile);
   String line = reader.readLine();
   System.out.println(line);
} catch (IOException e) {
   e.printStackTrace();
}
Rozwiązanie: Zajmij się błędami we/wy i upewnij się, że zasoby są poprawnie zamknięte.
File inputFile = new File("pqr.txt");

if (!inputFile.exists() || !inputFile.canRead()) {
 System.out.println("The input file is missing or not readable.");
 return;
}

try {
BufferedReader reader = new BufferedReader(inputFile);
 String line = reader.readLine();
 System.out.println(line);
  reader.close();
} catch (IOException e) {
 e.printStackTrace();
}
Zauważ, że alternatywnie możemy użyć funkcji try-with-resource wprowadzonej w Javie 7, aby automatycznie zamknąć zasoby, jak pokazano poniżej. W instrukcji try możemy zadeklarować jeden lub więcej zasobów , a Java automatycznie zamknie zasoby na końcu bloku, niezależnie od tego, czy blok zakończy się normalnie, czy zostanie zgłoszony wyjątek.
try (BufferedReader reader = new BufferedReader(new FileReader("pqr.txt"))) {
....
} catch {
....
}

Jak naprawić wyjątek FileNotFoundException

Scenariusz: Nie znaleziono pliku w określonej lokalizacji.
try {
     BufferedReader reader = new BufferedReader(new FileReader("abc.txt"));
     String line = reader.readLine();
     System.out.println(line);
     reader.close();
} catch (FileNotFoundException | IOException e) {
     System.out.println("An error has occurred while reading the file: " + e.getMessage());
}
Rozwiązanie: Upewnij się, że plik istnieje i masz odpowiednie uprawnienia dostępu do niego.
try {
    File file = new File("abc.txt");
    if(!file.exists()) {
    throw new FileNotFoundException("File not found at the specified location");
    }
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = reader.readLine();
    System.out.println(line);
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

Jak naprawić wyjątek NoSuchMethodException

Scenariusz: jeśli próbujesz uzyskać dostęp do metody, której nie można znaleźć.
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass obj = new TestClass();
Method method = obj.getClass().getMethod("printHello"); // Это вызовет NoSuchMethodException
Rozwiązanie: Sprawdź, czy metoda istnieje oraz czy nazwa i podpis metody są prawidłowe.
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass  obj = new TestClass();
try {
    Method method = obj.getClass().getMethod("sayHello");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

Jak naprawić wyjątek ConcurrentModificationException

Scenariusz: kolekcja zmienia się podczas iteracji.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
for (String str : list) {
  list.remove(str);  // Это вызовет ConcurrentModificationException
}
Rozwiązanie: Użyj iteratora do iteracji po kolekcji i zmodyfikuj ją za pomocą metod iteratora.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    iterator.remove();
}
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION