Понять, что такое исключение Java - заметки по исследованию Java

Обзор исключений

Исключение Java относится к ситуации, которая несовместима с нормальной ситуацией во время выполнения программы, и это в конечном итоге приведет к аварийной остановке JVM.

В процессе программирования мы всегда сталкиваемся с сообщениями об ошибках Java, и это сообщение об ошибках обычно называется исключением. Фактически, это в объектно-ориентированных языках программирования, таких как Java. Исключение само по себе является классом. Чтобы создать исключение, нужно создать объект исключения и выбросить объект исключения.

Классификация аномалий

Корневым классом исключения является java.lang.Throwable, который имеет два подкласса: java.lang.Error и java.lang.Exception,
Вставьте описание изображения сюда

Проверяемое исключение
- это проверяемое исключение, которое очень часто используется при кодировании. Все проверенные исключения необходимо обрабатывать в коде. Их возникновение предсказуемо, и нормальная ситуация может быть разрешена разумно. Например, IOException или некоторые настраиваемые исключения. За исключением RuntimeException и его подклассов, проверяются все исключения.

RuntimeException
означает, что компилятор не будет проверять, обработала ли программа RuntimeException. Нет необходимости перехватывать исключения типа RuntimeException в программе и не нужно объявлять класс RuntimeException в теле метода. Когда возникает RuntimeException, это означает, что в программе произошла ошибка программирования, поэтому вы должны выяснить ошибку и изменить программу вместо того, чтобы перехватывать RuntimeException.

Несколько распространенных исключений и причины этого исключения

1, java.lang.NullpointerException (исключение нулевого указателя)

Причина: это исключение встречается часто.Причина исключения состоит в том, что в программе есть нулевой указатель, то есть в программе вызывается неинициализированный объект или несуществующий объект. Это часто встречается в коде создания объектов и вызывающих массивов, например, объект не инициализирован, или путь при создании изображения неправильный и т. Д.

2. java.lang.ClassNotFoundException (указанный класс не существует)

Причина: при попытке преобразовать данные типа String в указанный числовой тип, но строка не соответствует требованиям числовых данных, возникает это исключение. Например, при преобразовании данных строкового типа «123456» в данные числового типа их можно преобразовать. Но если данные типа String содержат нечисловые символы, например 123 * 56, при преобразовании в числовой тип возникнет исключение. Система перехватит это исключение и обработает его.

3. java.lang.ClassNotFoundExceptio (указанный класс не существует)

Причина: поскольку имя и путь к классу неверны, обычно, когда программа пытается загрузить определенный класс через строку, может возникнуть исключение. Например: исключение возникает при вызове Class.forName () или вызове ClassLoadfinaSystemClass () или LoadClass ()

4. java.lang.IndexOutOfBoundsException (исключение индекса массива вне границ)

Причина: проверьте, не превышает ли значение нижнего индекса массива или строки, вызываемой в программе, диапазон массива. Вообще говоря, сделать такую ​​ошибку при отображении вызывающего массива непросто, но неявный вызов может привести к ошибке. Есть еще один В этом случае длина массива, определенного в программе, определяется каким-то конкретным методом, не объявленным заранее. В это время вы можете сначала проверить длину массива, чтобы избежать этого исключения.

5. java.lang.IllegalArgumentException (ошибка параметра метода)

Например, если в методе g.setColor (int red, int green, int blue) есть три значения, это исключение возникнет, если их больше 255. Если это исключение существует в программе, проверьте параметр, передаваемый в вызове метода. Или значение параметра неверно

6, java.lang.IllegalAccessException (нет разрешения на доступ)

Это исключение возникает, когда программа хочет вызвать класс, но текущий метод не имеет доступа к этому классу. Это исключение может возникнуть, если в программе используется пакет.

7, java.lang.ArithmeticException (исключение математической операции)

Такая аномалия возникает, когда в математической операции есть такая операция, как деление на ноль.

8, java.lang.ClassCastException (исключение преобразования типа данных)

Это исключение возникает при попытке принудительного преобразования объекта, но объект не может быть ни преобразован, ни преобразован в экземпляр своего подкласса.

9. java.lang.FileNotFoundException (исключение файл не найден)

Это исключение будет вызвано, когда программа откроет файл, который не существует для чтения или записи. Это исключение вызывается объявлением конструктора FileInputStream, FileOutputStream, RandomAccessFile, даже если обрабатываемый файл существует, но по какой-то причине недоступен, например, открытие файла с разрешением только для чтения и запись в него данных, указанный выше метод построения все еще остается Выдает исключение

10. java.lang.ArrayStoreException (исключение хранения массива)
при попытке сохранить объект несовместимого типа в массиве Object [] будет выдано исключение.

11. java.lang.NoSuchMethodException (исключение метода не существует).
Когда программа пытается создать объект посредством отражения, доступа (изменения или чтения) к методу, но метод не существует, возникает исключение.

12. java.lang.EOFException (исключение конца файла),
когда программа встречает конец файла или потока во время процесса ввода, выдается исключение. Таким образом, это исключение используется для проверки, достигнут ли конец файла или потока.

13. java.lang.InstantiationException (исключение создания экземпляра)
возникает при попытке создать экземпляр определенного класса с помощью метода newInstance () класса, но программа не может создать объект через конструктор. Объект Class представляет абстрактный класс, интерфейс, класс массива и базовый тип. Класс, представленный этим Class, не имеет соответствующего конструктора.

14. java.lang.InterruptedException (прерванное исключение) генерируется,
когда поток находится в долгом ожидании, бездействии или другом приостановленном состоянии, в то время как другие потоки завершают поток с помощью метода прерывания Thread.

15. java.lang.CloneNotSupportedException (исключение clone не поддерживается).
Когда интерфейс Cloneable не реализован или метод клонирования не поддерживается, вызов его метода clone () вызовет исключение.

16. java.lang.OutOfMemoryException (ошибка нехватки памяти) выдается, когда доступной памяти недостаточно для виртуальной машины Java для выделения объекту.

17. java.lang.NoClassDefFoundException (ошибка определения класса не найдена)
Эта ошибка возникает, когда виртуальная машина Java или загрузчик классов пытается создать экземпляр класса, но определение класса не может быть найдено.

Обработка исключений: модель поймать и выбросить

Процесс 1:
«Бросок»:
при нормальном выполнении программы с ключевым словом throws , как только возникает исключение, соответствующий объект класса исключения будет сгенерирован в коде исключения, и после того, как объект будет брошен, следующий Код больше не выполняется.
Второй процесс:
"catch": обработка исключений: try-catch-finally

бросить ключевое слово

Роль:
используется для создания указанного объекта исключения. Бросок используется в методе для создания объекта исключения, передачи объекта исключения вызывающей стороне и завершения выполнения текущего метода.
Формат использования:

throw new 异常类名(参数);
throw new NullPointerException("要访问的arr数组不存在");
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");

выбрасывает объявление ключевого слова для обработки исключений

Объявление исключения обработки :
используйте ключевое слово throws для определения проблемы, что означает, что текущий метод не обрабатывает исключение, а вместо этого напоминает вызывающему объекту обработать его ... В конце концов, виртуальная машина завершит программу напрямую и распечатает информацию об исключении.
Формат использования:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ 
 // 可以抛出一个,也可以多个。
}	

Использование try-catch-finally

Код:

try{
    可能会出现异常的代码
}catch(异常的类型 变量名){
    处理异常的代码
    //记录日志/打印异常信息/继续抛出异常
}finally{
    无论异常是否发生,都会执行这里的代码
    (正常情况,都会执行finally中的代码,一般用来释放资源)
}

Шаги выполнения:
1. Сначала выполните код в try. Если в коде в try есть исключение, затем выполните код напрямую в catch (). После выполнения код в finally будет выполнен, а затем программа продолжит выполнение

2. Если в коде в try нет исключения, то код в catch () не будет выполнен, но код в finally все равно будет выполняться, а затем программа продолжит выполнение

Примечание:
1. окончательно не обязательно, писать не обязательно.
2. Используйте команду try, чтобы обернуть возможный код исключения Во время выполнения, как только возникает исключение, будет сгенерирована команда, соответствующая объекту класса исключения.
В соответствии с типом исключения этого объекта перейдите к перехвату для сопоставления.
3. Как только объект исключения в попытке соответствует перехвату, он переходит к перехвату и продолжает обрабатывать исключение.
После завершения обработки он выходит из текущей структуры try-catch (без окончательной записи). Продолжите выполнение следующего кода
4. Если тип исключения в
catch не имеет отношения дочерний-родительский, не имеет значения, кто объявляет тип исключения в catch. Если отношения дочерний-родительский удовлетворены, дочерний класс должен быть объявлен над родительским классом, в противном случае Сообщите об ошибке.
5. Обычно используемые решения для объектов исключения: String getMessage () printStackTrace ()
6. Переменные, объявленные в структуре try, не могут быть вызваны повторно после того, как структура try отсутствует.
7. Структура try-catch-finally может быть вложенной.

Пользовательское исключение

Что такое настраиваемый класс исключения:

Определите класс исключения в соответствии с ненормальной ситуацией в вашем собственном бизнесе во время разработки.

Настройте исключение бизнес-логики: RegisterException . Зарегистрированный класс исключения.

Как определить класс исключения:
Настроить исключение времени компиляции: Настроить класс и унаследовать от java.lang.Exception.
Настройте класс исключения среды выполнения: пользовательский класс и наследовать от java.lang.RuntimeException.

Упражнение с настраиваемым исключением.
Требование: мы моделируем операцию регистрации, если имя пользователя уже существует, будет выдано исключение и запрос: уважаемый, имя пользователя зарегистрировано.

Сначала определите зарегистрированный класс исключения RegisterException:

// 业务逻辑异常
public class RegisterException extends Exception {
    /**
     * 空参构造
     */
    public RegisterException() {
    }

    /**
     *
     * @param message 表示异常提示
     */
    public RegisterException(String message) {
        super(message);
    }
}

Смоделируйте операцию входа в систему, используйте массив для моделирования данных, хранящихся в базе данных, и предоставьте метод для оценки того, существует ли текущая зарегистрированная учетная запись.

public class Demo {
    // 模拟数据库中已存在账号
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {     
        //调用方法
        try{
              // 可能出现异常的代码
            checkUsername("nill");
            System.out.println("注册成功");//如果没有异常就是注册成功
        }catch(LoginException e){
            //处理异常
            e.printStackTrace();
        }
    }

    //判断当前注册账号是否存在
    //因为是编译期异常,又想调用者去处理 所以声明该异常
    public static boolean checkUsername(String uname) throws LoginException{
        for (String name : names) {
            if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
                throw new LoginException("亲"+name+"已经被注册了!");
            }
        }
        return true;
    }
}

рекомендация

отblog.csdn.net/LinKin_Sheep/article/details/109329938