异常是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类

异常类如果使用正确,可以提高程序的可读性,可靠性和可维护性,如果使用不当会带来负面效果

java异常体系

Java 异常强制用户考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应处理

java中所有的异常类型都是 java.lang.Throwable的子类,分为两种类型Error错误Exception异常

Error

程序中无法处理的错误,表示运行应用程序中出现了严重的错误,出现此类异常,JVM将终止线程

比如:

Exception

  • 运行时异常

    此类异常实现都是RuntimeException类及其子类

    运行时异常不必在代码中强制进行try-catch

    这类异常通常由程序逻辑错误引起,应尽量避免此类异常的发生

  • 非运行时异常

    除了运行时异常外,继承了Exception的异常类

    非运行时异常必须要在程序中进行try-catch,如果不处理,则程序编译不通过

自定义异常

自定义异常需要继承Exception类

public class WarnException extends Exception {

    public WarnException(String message) {
        super(message);
    }
}

测试:

public static void test() throws WarnException{
    try {
         int i= 1/0;
    }catch (Exception e){
        throw new WarnException("自定义异常");
    }
}

异常信息:

异常处理流程

捕获异常:

try {

} catch (Exception e) {
    e.printStackTrace();
} finally {
}
  • 执行流程:

    正常try-catch中无异常时:执行顺序是try - finally

    正常try-catch中有异常时:执行顺序是try - catch - finally

捕获多重异常:

try{

}catch(WarnException we){

}catch(Exception e){

}finally{

}

try代码块后跟多个catch代码块,这种情况就叫多重捕获

抛出异常:

public static void test() throws WarnException{
    try {
         int i= 1/0;
    }catch (Exception e){
        throw new WarnException("自定义异常");
    }
}

在方法上抛出异常使用throws关键字,如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来抛出这个异常

在方法内抛出异常使用throw关键字

常见异常

Error:

  • NoClassDefFoundError:类定义错误
  • OutOfMemoryError:内存溢出错误
  • StackOverflowError:堆栈溢出错误
  • UnknownError:未知错误

RuntimeException/运行时异常:

  • NullPointerException:空指针异常
  • NumberFormatException:数字格式异常
  • ClassCastException:类型转换异常
  • IndexOutOfBoundsException:索引越界异常

非运行时异常:

  • IOException:IO异常
  • SQLException:sql异常
  • FileNotFoundException:文件找不到异常
  • ClassNotFoundException:找不到类异常