Java异常浅析
前言
异常二字,从字面上来理解就是:不正常。程序中的异常,就是程序在运行的过程中出现了不正常的情况。对于广大程序员来说,无论是菜鸟新手,还是编程大牛,程序出现各种各样的问题都是在所难免的事。Java语言作为一门成熟的语言,为了应对程序中可能出现的问题,也相应的提供了异常处理机制。本文将针对Java中异常的几个方面进行讨论分析。
异常出现的原因
异常出现的原因非常多,有的是因为用户操作上的错误引起,有的是程序错误引起的,还有其它一些是因为物理原因引起的。我们大致可以将异常出现的原因归为以下两种:
物理层面的原因:网络连接失败,要访问的文件找不到、内存溢出等。
代码层面的原因:传入的非法的数据值,引用类型变量为null调用方法导致空指针等。
注:不符合Java语法导致编译失败的问题不在今天异常的讨论范围
上述问题中,有些是作为程序员难以处理的,但是大部分都是可以利用Java给我们提供的异常处理机制对程序进行优化。接下来咱们来了解Java中的异常分类。
Java异常分类
JAVA中万物皆对象,对于异常来说,也是对象,我们先来看Java异常的体系结构。
2.1 Java异常体系结构
Throwable 异常体系的根类
——Error "错误"类
——Exception "异常"类
—— ... 编译期异常类(太多了,省略)
—— RuntimeException 运行时异常类
解释:
Throwable是异常体系的根类,其类中有一些获取异常信息相关的方法
Error类是一些诸如内存溢出、虚拟机错误等,程序不应该试图捕获的严重问题,不作重点讨论
. Exception是我们讨论的重点,因为其适合被程序处理。
. RuntimeException运行时异常类,其本身和其所有的子类都是运行时异常类。
在Exception中还有一部分类不是RuntimeException的子类,这些类则是编译期异常类
我们重点讨论Exception中的异常两大类:编译期异常和运行时异常。
2.2 编译期异常
众所周知的一件事:一个Java程序从源程序到运行起来要经历编译和运行两个步骤。那么如果在编译阶段出现的异常情况导致编译失败(语法错误不作讨论),我们就可以理解为此异常为编译期异常。
例如:
import java.io.FileWriter;
public class Demo {
public static void main(String[] args) {
FileWriter fw = new FileWriter("a.txt");
}
}
此段代码中,第四行出现编译时异常,提示此行代码必须捕获或者声明IOException。由于没有对编译期异常进行任何处理,所以编译失败了。
2.3 运行时异常
如果程序在编译的时候没有出现任何问题,但是在运行的时候却出现了异常,这些异常大部分都是运行时异常。
例如:
public class Demo {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[5]);
}
}
控制台输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
前言
异常二字,从字面上来理解就是:不正常。程序中的异常,就是程序在运行的过程中出现了不正常的情况。对于广大程序员来说,无论是菜鸟新手,还是编程大牛,程序出现各种各样的问题都是在所难免的事。Java语言作为一门成熟的语言,为了应对程序中可能出现的问题,也相应的提供了异常处理机制。本文将针对Java中异常的几个方面进行讨论分析。
异常出现的原因
异常出现的原因非常多,有的是因为用户操作上的错误引起,有的是程序错误引起的,还有其它一些是因为物理原因引起的。我们大致可以将异常出现的原因归为以下两种:
物理层面的原因:网络连接失败,要访问的文件找不到、内存溢出等。
代码层面的原因:传入的非法的数据值,引用类型变量为null调用方法导致空指针等。
注:不符合Java语法导致编译失败的问题不在今天异常的讨论范围
上述问题中,有些是作为程序员难以处理的,但是大部分都是可以利用Java给我们提供的异常处理机制对程序进行优化。接下来咱们来了解Java中的异常分类。
Java异常分类
JAVA中万物皆对象,对于异常来说,也是对象,我们先来看Java异常的体系结构。
2.1 Java异常体系结构
Throwable 异常体系的根类
——Error "错误"类
——Exception "异常"类
—— ... 编译期异常类(太多了,省略)
—— RuntimeException 运行时异常类
解释:
Throwable是异常体系的根类,其类中有一些获取异常信息相关的方法
Error类是一些诸如内存溢出、虚拟机错误等,程序不应该试图捕获的严重问题,不作重点讨论
. Exception是我们讨论的重点,因为其适合被程序处理。
. RuntimeException运行时异常类,其本身和其所有的子类都是运行时异常类。
在Exception中还有一部分类不是RuntimeException的子类,这些类则是编译期异常类
我们重点讨论Exception中的异常两大类:编译期异常和运行时异常。
2.2 编译期异常
众所周知的一件事:一个Java程序从源程序到运行起来要经历编译和运行两个步骤。那么如果在编译阶段出现的异常情况导致编译失败(语法错误不作讨论),我们就可以理解为此异常为编译期异常。
例如:
import java.io.FileWriter;
public class Demo {
public static void main(String[] args) {
FileWriter fw = new FileWriter("a.txt");
}
}
此段代码中,第四行出现编译时异常,提示此行代码必须捕获或者声明IOException。由于没有对编译期异常进行任何处理,所以编译失败了。
2.3 运行时异常
如果程序在编译的时候没有出现任何问题,但是在运行的时候却出现了异常,这些异常大部分都是运行时异常。
例如:
public class Demo {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[5]);
}
}
控制台输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5