Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。
Java的异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。
1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。
2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。
3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。
1.异常的结构
Java的异常是class,它的继承关系如下:

从继承关系可知:Throwable是异常体系的根,它继承自Object。Throwable有两个体系:Error和Exception,Error表示严重的错误,程序对此一般无能为力,例如:
OutOfMemoryError:内存耗尽 VirtualMachineError:虚拟机错误 StackOverflowError:栈溢出 ThreadDeath:线程死锁
而Exception则是运行时的错误,它可以被捕获并处理。
某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:
NumberFormatException:数值类型的格式错误 FileNotFoundException:未找到文件 SocketException:读取网络失败 还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:
NullPointerException:对某个null的对象调用方法或字段 IndexOutOfBoundsException:数组索引越界
Exception又分为两大类:
1)RuntimeException以及它的子类;称为不受检异常。
2)非RuntimeException(包括IOException、ReflectiveOperationException等等);称为受检异常。
==java语法规定:受检异常是必须进行处理的异常,如果不处理,程序就不能编译通过。而不受检查异常程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。==
常见的不受检查性异常有:

例如:
public static void main(String[] args) throws Exception {
int[] arr = {1,2,3,4,5};
for(int i=0;i<=arr.length;i++){
System.out.println(arr[i]);
}
}
程序运行时抛出不受检查异常:
1
2
3
4
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at encapsulationdemo.Demo1.main(Demo1.java:36)
不受检查异常通常由程序逻辑错误引起,仔细观察我们发现是由于循环结束条件误写i<=arr.length出现了数组下标越界异常。
常见的受检查异常有:

例如:
public static void main(String[] args) {
String s = "2020-abc-ef";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date d = sdf.parse(s); //这里会抛出受检查异常,必须进行异常处理,捕获异常并处理异常。
} catch (ParseException e) {
e.printStackTrace();
}
}
运行时抛出受检查异常:
java.text.ParseException: Unparseable date: "2020-abc-ef"
at java.text.DateFormat.parse(DateFormat.java:366)
at encapsulationdemo.Demo1.main(Demo1.java:39)
小结:
1)Java的异常类都是从Throwable继承;
2)Error是无需捕获的严重错误,Exception是应该捕获的可处理的错误;
3)RuntimeException无需强制捕获,称为不受检查性异常,非RuntimeException(Checked Exception)称为受检查性异常,必须进行处理的异常,如果不处理,程序就不能编译通过。