java tutorial - Обработка исключений Java - учебник java - java programming - учиться java - java basics - java for beginners




1- Что такое Exception (Исключение)?

  • Для начала, давайте посмотрим иллюстрированный пример ниже:
  • В данном примере имеется часть кода с ошибкой в результате деления на 0. Деление на 0 вызыввет исключение: ArithmeticException

HelloException.java

package org.wikitechy.tutorial.exception;
 
public class HelloException {
 
    public static void main(String[] args) {
 
        System.out.println("Three");
 
        // Данное деление не имеет проблем.
        int value = 10 / 2;
 
        System.out.println("Two");
 
        // Данное деление не имеет проблем.
        value = 10 / 1;
 
        System.out.println("One");
 
        // Данное деление имеет проблему, деление на 0.
        // Ошибка происходит здесь.
        value = 10 / 0;
 
        // И строка кода ниже не будет выполнена.
        System.out.println("Let's go!");
 
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Результат запуса примера: 
Вы можете увидеть оповещение ошибки на экране  Console, оповещение ошибки очень ясное, включает информацию, где произошла информация на какой строке кода.
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
 Обработка исключений в Java
java - джава - учиться java - учебник java -
Обработка исключений в Java
- примеры java - java-программы
  • Посмотрим поток программы через следующую иллюстрацию.
  • Программо запущенно по обыкновению начиная с шага (1),(2) до (5)
  • В шаге (6) происходит проблема при делении на 0.
  • Программа выходит из метода main, и линия кода (7) не выполнена.
 Привет исключение java
java - джава - учиться java - учебник java -
Привет исключение java
- примеры java - java-программы
  • Мы исправим код примера выше.

HelloCatchException.java

package org.wikitechy.tutorial.exception;
 
public class HelloCatchException {
 
    public static void main(String[] args) {
 
        System.out.println("Three");
 
        // Данное деление совершенно не имеет проблем
        int value = 10 / 2;
 
        System.out.println("Two");
 
        // Данное деление тоже
        value = 10 / 1;
 
        System.out.println("One");
 
        try {
            // Данное деление имеет проблему, деление на 0.
            // Ошибка произошла здесь.
            value = 10 / 0;
 
            // Данная строка не будет выполнена.
            System.out.println("Value =" + value);
 
        } catch (ArithmeticException e) {
            // Строки кода в catch будут выполнены.
            System.out.println("Error: " + e.getMessage());
 
            // Строки кода в catch будут выполнены.
            System.out.println("Ignore...");
 
        }
 
        // Данная строка кода будет выполнена.
        System.out.println("Let's go!");
 
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • И результаты запуска примера:
 catch исключение java Привет
java - джава - учиться java - учебник java -
catch исключение java Привет
- примеры java - java-программы
  • Мы объясним поток программы иллюстрацией ниже.
    • Шаги (1)-(5) абсолютно нормальны.
    • Исключение происходит в шаге (6), проблема при делении на 0.
    • Сразу же выполняет команду в блоке catch, шаг (7) пропущен.
    • Шаг (8),(9) выполнен.
    • Шаг (10) выполнен.
 Java Привет перехватывать исключение explannation
java - джава - учиться java - учебник java -
Java Привет перехватывать исключение explannation
- примеры java - java-программы

2- Иерархия исключения

  • Это модель иерархической карты Exception в java.
    • Самый высокий класс это Throwable
    • Два прямых подклассов это Error и Exception.
  • В ветке Exception есть подветка RuntimeException это исключение непроверенное в java во время компиляции. Значение проверенный и непроверенный во время компиляции будет изображено в следующих примерах.
 java Привет поймать ошибка исключения
java - джава - учиться java - учебник java -
java Привет поймать ошибка исключения
- примеры java - java-программы

Error

  • Когда динамическое соединение не удается, или в виртуальной машине происходит серьезная проблема, то она выбрасывает Error. Типичным программам Java не стоит ловить ошибку (Error). Помимо этого, это неточно выбрасывают ли когда-нибудь ошибку типичные программы Java.

Exceptions

  • Большинство программ выбрасывающих и ловящих объекты, являются подклассом Exception. Случай Exception показывает происхождение проблемы, но это не серьезная системная проблема. Большинство написанных вами программы будут выбрасывать и ловить Exception.
  • Класс Exception имеет много подклассов с определением в пакете Java. Наследники показывают, что может произойти много случаев исключения. Например, NegativeArraySizeException выбрасывается, когда вы пытаетесь создать массив (array) с отрицательным элементом.
  • Подкласс Exception так же имеет особое значение в языке Java: RuntimeException.

Runtime Exceptions

  • Класс RuntimeException представляет исключения произшедшие во время запуска программы. Пример исключения при запуске это NullPointerException, происходит когда вы заходите в метод или поле объекта через ссылку null. Для таких испключений обычно проверяют чтобы гарантировать этот объект отличается от null, чем искать исключение.
  • Так как исключения при запуске очень распространены и пытаться найти или определить их всех это не эффективно. Компилятор Java не проверяет эти исключения в процессе компиляции кода .
  • Java определяет некоторые классы RuntimeException. Вы можете словить (Catch) эти исключения как и другие обычные исключения. Методы которые могут выбрасывать RuntimeException не требуют объявленмя по его определению. Помимо этого, вы можете создать ваш собственный подкласс RuntimeException.

3- Обработка исключения через try-catch

  • Напишем exception унаследованный от класса Exception.

AgeException.java

public class AgeException extends Exception {
 
  public AgeException(String message) {
      super(message);
  }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

TooYoungException.java

public class TooYoungException extends AgeException {
 
 public TooYoungException(String message) {
     super(message);
 }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

TooOldException.java

public class TooOldException extends AgeException {
 
 public TooOldException(String message) {
     super(message);
 }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • И класс AgeUtils со статистическим методом для проверки возраста.

AgeUtils.java

public class AgeUtils {
 
    // Этот метод выполняет обязанность проверки возраста.
    // Если возраст меньше 18 он выбросит исключение TooYoungException
    // Если возраст старше 40 он выбросит исключение TooOldException
    public static void checkAge(int age) throws TooYoungException, TooOldException {
        if (age < 18) {
            // Если возраст меньше 18, выбросится исключение
            // Этот метод заканчивается здесь.
            throw new TooYoungException("Age " + age + " too young");
        } else if (age > 40) {
            // Если возраст старше 40, выбросится исключение.
            // Этот метод заканчивается здесь.
            throw new TooOldException("Age " + age + " too old");
        }
        // Если возраст является в пределах 18-40.
        // Этот код будет запущен.
        System.out.println("Age " + age + " OK!");
    }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Checked Exception & Unchecked Exception:

  • AgeException это подкласс Exception, TooOldException и TooYoungException это 2 прямые подклассы AgeException, поэтому они являются "Checked Exception"
  • В методе AgeUtils.checkAge(int) выбрасывает это исключение, поэтому на объявлении вашего метода нужно из перечислить через ключевое слово "throws". Или вы можете объявить выбрасывание на более общем уровне
  • throws Exception.
  • Там где используется AgeUtils.checkAge(int) тоже должна быть обработка чтобы словить эти исключения, или продолжить выбрасывание наружу.
 который может создаваться исключение зарегистрированного
java - джава - учиться java - учебник java -
который может создаваться исключение зарегистрированного
- примеры java - java-программы
  • "Checked exception" будет проверен с помощью "Java Compiler".
 исключение демо
java - джава - учиться java - учебник java -
исключение демо
- примеры java - java-программы
  • У вас есть 2 варианта обработки:
    • Выбросить наружу
    • Словить и выпонить обработку исключения через try-catch.
 Попробуйте поймать
java - джава - учиться java - учебник java -
Попробуйте поймать
- примеры java - java-программы

TryCatchDemo1.java

package org.wikitechy.tutorial.exception.basic;
 
public class TryCatchDemo1 {
 
    public static void main(String[] args) {
 
        // Начать рекрутирование.
        System.out.println("Start Recruiting ...");
        // Проверка возраста.
        System.out.println("Check your Age");
        int age = 50;
 
        try {
 
            AgeUtils.checkAge(age);
 
            System.out.println("You pass!");
 
        } catch (TooYoungException e) {
 
            // Сделать что-то здесь ..
            System.out.println("You are too young, not pass!");
            System.out.println(e.getMessage());
 
        } catch (TooOldException e) {
            // Сделать что-то здесь
            System.out.println("You are too old, not pass!");
            System.out.println(e.getMessage());
 
        }
 
    }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • В примере ниже, мы словим исключения через родительские исключения. На высшем уровнем можно словить эти исключения и все наследованные исключения.

TryCatchDemo2.java

package org.wikitechy.tutorial.exception.basic;
 
public class TryCatchDemo2 {
 
    public static void main(String[] args) {
 
        // Начать рекрутирование
        System.out.println("Start Recruiting ...");
        // Проверить ваш возвраст.
        System.out.println("Check your Age");
        int age = 15;
 
        try {
            // Здесь может получиться исключение TooOldException,
            // или TooYoungException
            AgeUtils.checkAge(age);
 
            System.out.println("You pass!");
 
        } catch (AgeException e) {
            // Если происходит исключение, вида AgeException.
            // Этот блок catch будет запущен.
            System.out.println("Your age invalid, you not pass");
            System.out.println(e.getMessage());
 
        }
    }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Вы так же можете собрать для обработки разные исключения в один блок catch, если они имеют одинаковый способ обработки в логике вашей программы.

TryCatchDemo3.java

package org.wikitechy.tutorial.exception.basic;
 
public class TryCatchDemo3 {
 
    public static void main(String[] args) {
 
        System.out.println("Start Recruiting ...");
 
        System.out.println("Check your Age");
        int age = 15;
 
        try {
            // Здесь может произойти исключение TooOldException,
            // или TooYoungException
            AgeUtils.checkAge(age);
 
            System.out.println("You pass!");
 
        } catch (TooYoungException | TooOldException e) {
            // Поймать много исключений в 1 блоке Catch.
            System.out.println("Your age invalid, you not pass");
            System.out.println(e.getMessage());
 
        }
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

4- Блок try-catch-finally

  • Мы уже ознакомились с улавливением ошибки через блок try-catch. Для полной обработки исключений используется try-catch-finally.
try {
 
   // Сделать что-то здесь.
} catch (Exception1 e) {
 
   // Сделать что-то здесь.
} catch (Exception2 e) {
 
   // Сделать что-то здесь.
} finally {
 
   // Блок finally всегда выполняется.
   // Сделать что-то здесь.
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

TryCatchFinallyDemo.java ?

package org.wikitechy.tutorial.exception.basic;
 
public class TryCatchFinallyDemo {
 
    public static void main(String[] args) {
 
        String text = "001234A2";
 
        int value = toInteger(text);
 
        System.out.println("Value= " + value);
 
    }
 
    public static int toInteger(String text) {
        try {
 
            System.out.println("Begin parse text: " + text);
 
            // Здесь может произойти исключение NumberFormatException.
            int value = Integer.parseInt(text);
 
            return value;
 
        } catch (NumberFormatException e) {
 
            // В случае 'text' не является числом.
            // Данный блок catch будет выполнен.
            System.out.println("Number format exception " + e.getMessage());
 
            // Когда происходит NumberFormatException, возвращает 0.
            return 0;
 
        } finally {
 
            System.out.println("End parse text: " + text);
 
        }
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Это поток программы. Блок finally всегда выполняется.
 Блок finally
java - джава - учиться java - учебник java -
Блок finally
- примеры java - java-программы

5- Свернуть один Exception в другой Exception

  • Нам нужно несколько классов участвующих в данном примере:
  • Person: Симулирует человека участвующего в рекрутировании в компанию с информацией
    • Имя, возраст, пол.
  • GenderException: Исключить пол.
  • ValidateException: Исключение оценки участников.
  • ValidateUtils: Класс имеющий статистический метод оценивающий подходит или кандидат или нет.
    • Стандартом является возраст 18-40
    • и мужской пол.

Person.java

package org.wikitechy.tutorial.exception.wrap;
 
public class Person {
 
  public static final String MALE = "male";
  public static final String FEMALE = "female";
 
  private String name;
  private String gender;
  private int age;
 
  public Person(String name, String gender, int age) {
      this.name = name;
      this.gender = gender;
      this.age = age;
  }
 
  public String getName() {
      return name;
  }
 
  public void setName(String name) {
      this.name = name;
  }
 
  public String getGender() {
      return gender;
  }
 
  public void setGender(String gender) {
      this.gender = gender;
  }
 
  public int getAge() {
      return age;
  }
 
  public void setAge(int age) {
      this.age = age;
  }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

GenderException.java

package org.wikitechy.tutorial.exception.wrap;
 
// Исключение пола.
public class GenderException extends Exception {
  
      public GenderException(String message)  {
          super(message);
      }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Класс ValidateException обвалакивает другой Exception.

ValidateException.java

package org.wikitechy.tutorial.exception.wrap;
 
public class ValidateException extends Exception {
     
    // Обернуть(wrap) Exception в другой Exception 
    public ValidateException(Exception e)  {
        super(e);
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

ValidateUtils.java

package org.wikitechy.tutorial.exception.wrap;
 
import org.wikitechy.tutorial.exception.basic.AgeUtils;
 
public class ValidateUtils {
 
    // Метод проверки 1 кандидатуры.
    public static void checkPerson(Person person) throws ValidateException {
        try {
 
            // Проверка возраста.
            // Действительно это в рамках 18-40
            // Этот метод может выбросить TooOldException,TooYoungException.
            AgeUtils.checkAge(person.getAge());
 
        } catch (Exception e) {
 
            // Nếu không hợp lệ
            // Gói ngoại lệ này bởi ValidateException, và ném ra
            // If not valid
            // Wrap this exception by ValidateException, and throw
            throw new ValidateException(e);
 
        }
 
        // Nếu người đó là Nữ, nghĩa là không hợp lệ.
        // If that person is Female, ie invalid.
        if (person.getGender().equals(Person.FEMALE)) {
 
            GenderException e = new GenderException("Do not accept women");
            throw new ValidateException(e);
 
        }
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

WrapperExceptionDemo.java

package org.wikitechy.tutorial.exception.wrap;
 
public class WrapperExceptionDemo {
 
    public static void main(String[] args) {
 
        // Кандидатура.
        Person person = new Person("Marry", Person.FEMALE, 20);
 
        try {
 
            // Исключение может произойти здесь.
            ValidateUtils.checkPerson(person);
 
        } catch (ValidateException wrap) {
 
            // Получить действительную причину.
            // Может быть TooYoungException, TooOldException, GenderException.
            Exception cause = (Exception) wrap.getCause();
 
            if (cause != null) {
                System.out.println("Not pass, cause: " + cause.getMessage());
            } else {
                System.out.println(wrap.getMessage());
            }
 
        }
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

6- RuntimeException т подклассы

  • Класс RuntimeException и подклассы являются "Unchecked exception". Он не проверяется компилятором java во время компиляции. В некоторых случаях вы можете написать ваши собственные исключения наследованные от этих веток. Есть некоторые исключения в этой ветке, требующие внимания.
  • Ниже являются некоторые классы принадлежащие веткам RuntimeException (Конечно не все).
 исключение времени выполнения
java - джава - учиться java - учебник java -
исключение времени выполнения
- примеры java - java-программы
  • Попробуем обработать некоторые примеры с данными видами исключений:

6.1- NullPointerException

  • Это один из общих исключений, и часто создающий ошибки в программе. Исключение выбрасывается когда вы вызываете метод или заходите в поля объекта null.

NullPointerExceptionDemo.java

package org.wikitechy.tutorial.exception.runtime;
 
public class NullPointerExceptionDemo {
 
    // Например это метод, который может вернуть строку null.
    public static String getString() {
        if (1 == 2) {
            return "1==2 !!";
        }
        return null;
    }
 
    public static void main(String[] args) {
 
        // Это переменная с ссылкой отличающаяся от null.
        String text1 = "Hello exception";
 
        // Вызвать метод для получения длины строки.
        int length = text1.length();
 
        System.out.println("Length text1 = " + length);
 
        // Это переменная с ссылкой null.
        String text2 = getString();
 
        // Вызвать метод для получения длины строки.
        // NullPointerException произойдет здесь.
        // Это исключение, появляющееся во время запуска (runtime).
        // (ВидRuntimeException).
        // Компилятор (compiler) Java не обязателен
        // вам нужно поймать (catch) его во время компиляции (compile-time).
        length = text2.length(); // ==> exception!
 
        System.out.println("Finish!");
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Results of running the example:
 Исключение нулевого указателя
java - джава - учиться java - учебник java -
Исключение нулевого указателя
- примеры java - java-программы
  • В действительности, как и обработка других исключений, вы можете использовать try-catch чтобы уловить это исключение для обработки. Но это механический способ, обычно стоит проверить, чтобы удостовериться объект отличается от null перед тем, как его использовать.
  • Вы можете изменить код как внизу, чтобы избежать NullPointerException:
// Метод getString() возвращает значение null.
// Это объект с ссылкой null.
String text2 = getString();
 
// Проверка, чтобы удостовериться text2 отличается от null.
// Вместо использования try-catch.
if (text2 != null) {
  length = text2.length();
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • В действительности, как и обработка других исключений, вы можете использовать try-catch чтобы уловить это исключение для обработки. Но это механический способ, обычно стоит проверить, чтобы удостовериться объект отличается от null перед тем, как его использовать.
  • Вы можете изменить код как внизу, чтобы избежать NullPointerException:
// Метод getString() возвращает значение null.
// Это объект с ссылкой null.
String text2 = getString();
 
// Проверка, чтобы удостовериться text2 отличается от null.
// Вместо использования try-catch.
if (text2 != null) {
  length = text2.length();
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

6.2- ArrayIndexOfBoundException

  • Это исключение выбрасывается когда вы пытаетесь зайти в элемент с недействительным индексом в массиве. Например массив имеет 10 элементов, а вы заходите в элемент с индексом 20.

ArrayIndexOfBoundsExceptionDemo.java

package org.wikitechy.tutorial.exception.runtime;
 
public class ArrayIndexOfBoundsExceptionDemo {
 
    public static void main(String[] args) {
 
        String[] strs = new String[] { "One", "Two", "Three" };
        // Доступ в элемент индекса 0.
        String str1 = strs[0];
 
        System.out.println("String at 0 = " + str1);
 
        // Доступ в элемент индекса 5
        // ArrayIndexOfBoundsException происходит здесь.
        String str2 = strs[5];
 
        System.out.println("String at 5 = " + str2);
 
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Чтобы избежать ArrayIndexOfBoundsException вам стоит проверить массив вместо того, чтобы использовить try-catch.
if (strs.length > 5) {
   String str2 = strs[5];
   System.out.println("String at 5 = " + str2);
} else {
   System.out.println("No elements with index 5");
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Related Searches to Обработка исключений Java