Не говорите об этих бесполезных сериях: Исключения Java

Java задняя часть программист переводчик
Не говорите об этих бесполезных сериях: Исключения Java

Введение

Давайте посмотрим на следующий код:

package com.huangzx.Exception;
/**
 * @author huangzx
 * @date 2018/11/27
 */
public class ExceptionTypeTest {
    public class ExceptionTypeTest {
    public int doSomething() throws ArithmeticException {
        return 5 / 0;
    }
    public static void main(String[] args) {
        ExceptionTypeTest ett = new ExceptionTypeTest();
        ett.doSomething();
    }
}

В: Может ли приведенный выше код скомпилироваться и пройти?

Ответ: Да. ArithmeticException — это исключение RuntimeException, которое нельзя перехватить или сгенерировать. Если изменить на IOException, следующим образом:

package com.huangzx.Exception;
import java.io.*;
/**
 * @author huangzx
 * @date 2018/11/27
 */
public class ExceptionTypeTest {
    public void doSomething() throws IOException {
        InputStream is = new FileInputStream(new File("/Users/huangzx/test.txt"));
        is.read();
    }
    public static void main(String[] args) {
        ExceptionTypeTest ett = new ExceptionTypeTest();
        ett.doSomething();
    }
}

Q: Он все еще компилируется и проходит?

Ответ: нет. IOException — это исключение, напрямую унаследованное от Exception, оно должно быть обработано, либо перехвачено, либо выброшено.

Проверенные исключения и непроверенные исключения

В приведенных выше двух примерах и ArithmeticException, и IOException исходят из системы исключений.Почему одно не нужно обрабатывать, а другое нужно обрабатывать? Это включает в себя два понятия: проверенные исключения и непроверенные исключения. Давайте сначала рассмотрим систему исключений Java:

Java异常体系

  • Непроверенные исключения: RuntimeException и его подклассы. Такие исключения вызваны логическими ошибками программиста и должны нести ответственность. Компилятор Java не требует принуждения, т. е. поймать или бросить или не поймать или бросить.
  • Checked Exception: Исключение, не связанное с RuntimeException. Такие аномалии вызываются какими-то внешними случайными факторами. Компилятор Java требует обязательной обработки, т.е. должен быть пойман или выброшен.

Появились представители этих двоих (аплодисменты, пожалуйста~~):

  • Непроверенные исключения: RuntimeException, ArithmeticException, NullPointerException, ClassCastException, ArrayIndexsOutOfBoundsException
  • Проверенные исключения: Exception, IOException, SQLException, FileNotFoundException

Как обрабатывать исключения

Теперь, когда концепция этих двух ясна, метод обработки также очевиден.

Для проверенных исключений:

  • бросает бросает. (это низкоуровневая практика)
  • обработка захвата try/catch. (рекомендуется, высококлассная практика)

Для непроверенных исключений:

  • бросает бросает.
  • обработка захвата try/catch.
  • Не обработано. (Это потрясающе, мне все равно, вылетит программа или нет, я свалю вину на Бога~~)

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

Вышеизложенное является базовым, а следующее — некоторыми продвинутыми.

Когда нам нужны какие-то классы информации об исключении, связанные с конкретным бизнесом, мы можем написать проверенный класс исключения, который наследуется от Exception в дополнение к исключению, определенному самой Java, или мы можем написать непроверяемый класс исключения, который наследуется от RuntimeException или его подклассов.

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

Пример:

1. Пользовательский класс бизнес-исключений, унаследованный от RuntimeException.

package com.huangzx.Exception;
/**
 * @author huangzx
 * @date 2018/11/27
 */
public class BusinessException extends RuntimeException {
    private String code;    // 异常返回码
    private String msg;     // 异常信息
    public BusinessException() {
        super();
    }
    public BusinessException(String message) {
        super(message);
        this.code = code;
    }
    public BusinessException(String code, String msg) {
        super();
        this.code = code;
        this.msg = msg;
    }
    public String getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

2. Определите метод и объявите настраиваемые исключения. Чтобы использовать его, класс вызывающего кода должен быть уведомлен и готов «удерживать» исключение. Точка, в которой возникает исключение в логике кода, должна быть выброшена.

public void logicCode() throws BusinessException {
    throw new BusinessException("-1000", "业务出错");
}

3. Протестируйте основной метод пользовательского исключения.

public static void main(String[] args) {
    ExceptionTest et = new ExceptionTest();
    try {
        et.logicCode();
    } catch (BusinessException e) {
        e.printStackTrace();
        System.out.println("code=" + e.getCode() + "msg=" + e.getMsg());
    }
}

В принципе, об этом. Есть еще один момент, на который следует обратить внимание, а именно: не бросайте нетрадиционное исключение в finally, потому что оно обязательно будет выполнено, в результате чего исключение, захваченное блоком кода, отслеживаемым вашим try{}, не будет обработано, что приведет к воспроизведению роль в Пожалуйста, имейте в виду, что эффект сбивает с толку аудиовизуальные и запутывает вас при устранении неполадок. Пример выглядит следующим образом:

package com.huangzx.Exception;
/**
 * @author huangzx
 * @date 2018/11/27
 */
public class ExceptionLoseTest {
    public static int throwException() throws Exception {
        try {
            throw new Exception();
        } catch (Exception e) {
            throw e;
        } finally {
            throw new NullPointerException();
        }
    }

    public static void main(String[] args) {
        try {
            throwException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Результат выполнения следующий:

java.lang.NullPointerException
	at com.huangzx.Exception.ExceptionLoseTest.throwException(ExceptionLoseTest.java:14)
	at com.huangzx.Exception.ExceptionLoseTest.main(ExceptionLoseTest.java:20)

Суммировать

  • Простое понимание проверенных исключений и непроверенных исключений: непроверенные исключения являются исключениями RuntimeException и его подклассов, а остальные понимаются как проверенные исключения
  • Пользовательские исключения предназначены для конкретных бизнес-потребностей, позволяя вам определить, какие исключения произошли по типам исключений, чтобы лучше исправить и оптимизировать ваш логический код.
  • try/catch исключения, которые вы уже знаете, как обрабатывать, генерировать исключения, которые вы еще не знаете, как обрабатывать

Ладно, выходи из класса окончено. . . (Учитель ~ пока~~)

(над)