8、异常机制
8.1 Error和Exception
- 什么是异常
- 在实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序正在运行,内存或硬盘可能满了。等等
- 程序软件在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们称之为异常,英文是Exception,意思是是例外。这些例外的情况称之为异常,异常能让我们写的程序做出合理的处理。而不至于程序崩溃。
- 异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
- 异常发生在程序运行期间,它影响了正常的程序执行流程
错误示例:递归调用
package com.baidu.www.exception;
public class Demo01 {
public static void main(String[] args) {
new Demo01().a();
}
public void a(){
b();
}
public void b(){
a();
}
}
/**
* Exception in thread "main" java.lang.StackOverflowError
* at com.baidu.www.exception.Demo01.a(Demo01.java:8)
* at com.baidu.www.exception.Demo01.b(Demo01.java:11)
* at com.baidu.www.exception.Demo01.a(Demo01.java:8)
* at com.baidu.www.exception.Demo01.b(Demo01.java:11)
*
* Process finished with exit code 1
*/
异常示例
package com.baidu.www.exception;
public class Demo01 {
public static void main(String[] args) {
System.out.println(11/0);
}
}
/**
* Exception in thread "main" java.lang.ArithmeticException: / by zero
* at com.baidu.www.exception.Demo01.main(Demo01.java:5)
*
* Process finished with exit code 1
*/
/
-
异常简单的分类
Java异常主要掌握一下三种类型的异常
- 检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常(比如用户输入错误,这也是很多公司有测试人员这个职位的原因,专门站在用户的角度来找程序的各种bug),这是程序员无法预见的。例如用户要打开一个不存在的文件时(这个时候程序员无法去处理,因为用户要做什么事情程序员根本不知道),一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常:(比如递归调用,在我们写程序的时候并没有报错,但是在程序运行时就会报错,这种异常是程序员最容易避免的异常,因为程序是自己编写的,知道程序那里会出现问题)运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误ERROR:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译也检查不到的。
-
异常体系结构
异常处理框架:所有的异常都可以用一个异常类表示。
Java把异常作为对象来处理,并定义一个基类java.long.Throwable作为所有异常的超类。
在java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
从图中我们可以看出所有的错误和异常都是Throwable的子类,Error主要是虚拟机错误和AWT错误(GUI编程即图形界面化编程遇到的错误)
Error与Exception一些简单的区别
Error
- Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
- Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
- 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
Exception
-
在Exception分支中有一个非常重要的子分支(子类)RuntimeException(运行时异常)
- ArrayIndexOutOfBoundsException(数组下标越界)
- NullPointerException(空指针异常)
- ArithmeticException(算术异常)
- MissingResourceException(丢失资源)
- ClassNotFoundException(找不到类)等异常
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理,这些异常百分之百与程序员有关系,一般情况下我们把除了运行时异常之外的异常都成为非运行时异常
-
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
-
Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中尽可能的去处理这些异常。
-
Java异常处理机制
-
处理异常
-
自定义异常
-
总结