Java基础-异常-概述
概念:
Java异常是Java提供的一种识别及响应错误的一致性机制。异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中进行的。
为什么要有异常处理
首先,程序遇到异常会导致程序功能中止,严重时直接会导致系统奔溃。在实际项目中,系统是不能崩溃的,所以在实际工作中,异常处理是一个工作中的重要部分。
Java中是具有异常处理的框架方案的。所有的异常都可以用一个类型(Throwable)来表示,不同类型的异常对应不同的子类异常,定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟踪异常!
在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免、不可预测的情况则在考虑异常发生时如何处理。
异常分类
Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误程序是无法处理。
Error(错误):是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果
出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。
Exception(异常):Exception异常主要分为两大类:检查异常和运行时异常。
检查异常:CheckedException。在编译期,就会检查,如果没有处理异常,则编译失败。
特点: Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。
运行时异常:RuntimeException(unchecked exception)。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)(如数学异常)。如果出现 RuntimeException,那么一定是程序员代码书写导致的错误。
特点: Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fail机制产生的ConcurrentModificationException异常等,都属于运行时异常。
可以通过throws进行声明抛出,也可以通过try-catch-finally对它进行捕获处理。
如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!
检查异常与运行时异常的处理示例
public static void main(String[] args) {
System.out.println(divErht());//不运行不报错
System.out.println(divErhte());//不运行的时候,idea报:Unhandled exception: java.lang.Exception;处理方法try…catch或者throws,二选一
}
public static int divErht() throws ArithmeticException {
int result = 0;
try {
result = 1/0;
System.out.println("process try");
return result;
} catch (ArithmeticException e) {
result = 2;
System.out.println("process catch");
throw new ArithmeticException("方法执行异常");// finally 里有return,这里throw失效
} finally {
result = 3;
System.out.println("process finally");
}
}
public static int divErhte() throws Exception {
int result = 0;
try {
result = 1/0;
System.out.println("process try");
return result;
} catch (ArithmeticException e) {
result = 2;
System.out.println("process catch");
throw new ArithmeticException("方法执行异常");// finally 里有return,这里throw失效
} finally {
result = 3;
System.out.println("process finally");
}
}