Sobes.tech
Junior

Kako se greške obrađuju u Javi i kako sa njima raditi?

sobes.tech АИ

Одговор од АИ

У Јави грешке се обрађују коришћењем механизма изузетака. Изузеци представљају догађаје који ремете нормалан ток извршавања програма. Постоје две врсте изузетака: Checked Exceptions и Unchecked Exceptions.

Checked Exceptions:

  • Наслеђују од java.lang.Exception (осим RuntimeException).
  • Обавезно их треба обрадити (try-catch) или их декларисати у сигнатури методе (throws).
  • Представљају грешке које могу настати у нормалним условима (нпр. IOException, FileNotFoundException).

Unchecked Exceptions:

  • Наслеђују од java.lang.RuntimeException или java.lang.Error.
  • Не захтевају обавезну обраду или декларацију.
  • Представљају грешке које често указују на логичке грешке у коду или нестабилна стања окружења за извршавање (нпр. NullPointerException, ArrayIndexOutOfBoundsException).

Обрада изузетака:

За обраду изузетака користе се блокови try-catch-finally:

  • try: Блок кода који може генерисати изузетак.
  • catch: Блок кода који се извршава ако у try дође до изузетка одређеног типа. Могу се имати више catch блокова за различите типове изузетака.
  • finally: Блок кода који се увек извршава, без обзира да ли је дошло до изузетка или не. Често се користи за ослобађање ресурса (нпр. затварање фајлова, веза).
try {
    // Код који може изазвати изузетак
    int result = 10 / 0; // Пример: ArithmeticException
} catch (ArithmeticException e) {
    // Обрада ArithmeticException
    System.err.println("Грешка при дели са нулом: " + e.getMessage());
    // Може се логовати грешка, приказати поруку кориснику итд.
} catch (Exception e) {
    // Обрада било којег другог изузетка, ако раније није обрађен
    System.err.println("Настала је општа грешка: " + e.getMessage());
} finally {
    // Код који се увек извршава
    System.out.println("Блок finally извршен.");
}

Прослеђивање изузетака:

Метода може да декларише да може да генерише одређени изузетак коришћењем кључне речи throws:

public void readFile(String filePath) throws FileNotFoundException, IOException {
    // Код за читање фајла
    // Ако фајл није пронађен, може бити изазван `FileNotFoundException` (подкласа `IOException`)
    FileReader fr = new FileReader(filePath);
    // Ако дође до грешке у улазу-излазу, може бити изазван `IOException`
    // ...
}

Позивајућа метода треба или да обради овај изузетак (try-catch) или да га такође декларише са throws, да га проследи.

Креирање сопствених изузетака:

Могу се креирати сопствене класе изузетака наследивањем од Exception (за Checked Exceptions) или RuntimeException (за Unchecked Exceptions).

public class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

Користи се:

public void processData(int value) throws MyCustomException {
    if (value < 0) {
        throw new MyCustomException("Вредност не може бити негативна");
    }
    // Обрада података
}

Основне класе изузетака (иерархија):

  • java.lang.Throwable (базна класа за све грешке и изузетке)
    • java.lang.Error (за озбиљне проблеме који обично неће бити обрађени од стране програма, нпр. OutOfMemoryError)
    • java.lang.Exception (за изузетке које програм може обрадити)
      • java.lang.RuntimeException (Unchecked Exceptions)
        • NullPointerException
        • ArrayIndexOutOfBoundsException
        • ArithmeticException
        • итд.
      • Друге подкласе Exception (Checked Exceptions)
        • IOException
        • FileNotFoundException
        • SQLException
        • итд.

Рад са грешкама укључује разумевање ове иерархије, избор одговарајућег типа изузетка (при креирању својих), ефикасну употребу try-catch-finally за обраду и прослеђивање, као и логовање грешака за дебаговање.