- 实际工作中,遇到的情况不可能非常完美。比如:写好的某个模块,用户输入不一定符合要求;程序要打开某个文件,但这个文件可能不存在或者格式不对;你要读取数据库的数据,数据可能是空的;程序在跑着,内存或者硬盘满了……等等情况。
- 软件程序在运行过程中,这类例外情况,通称“异常”,英文:Exception,意思是例外。
- 写程序要对异常做出合理处理,不至于程序崩溃。
- 一些定义:
- 异常制程序运行中出现的不期而至的各种状况。
- 异常发生在程序运行期间,影响正常的程序执行流程。
- 一个简单的循环调用(这是个比较严重的Error)
public class Demo1 {
public static void main(String[] args) {
new Demo1().a();
}
public void a() {
b();
}
public void b() {
a();
}
}
====运行报错====
Exception in thread "main" java.lang.StackOverflowError
- 又比如常见的除数为零
public class Demo2 {
public static void main(String[] args) {
System.out.println(11/0);
}
}
====运行报错====
Exception in thread "main" java.lang.ArithmeticException: / by zero
- 软件公司常有“测试”岗位,专门负责找bug,测试在某些情况下出现特定的问题。
- 要理解Java异常处理是如何工作的,需要掌握以下三种异常类型:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常想相反,运行时异常可以在编译时被忽略。
- 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也检查不到。
-
异常处理框架的思想:Java把异常当作一个对象处理,并定义一个基类
java.lang.Throwable
作为所有异常的超类。 -
在Java API中已经定义了许多异常类,这些异常分为两大类,错误
Error
和异常Exception
。详见:Class Throwable -
Error
类对象Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。 -
Java虚拟机运行错误
VirtualMachineError
,当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError
。这些异常发生时,JVM一般会选择线程终止。 -
还有发生在JVM试图执行应用时,如:类定义错误
NoClassDefFoundError
、链接错误LinkageError
。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的情况。 -
Exception
分支中有一个重要的子类运行时异常RuntimeException
。这些异常不是检查异常,程序中可以选择捕获处理,也可以不处理。- 数组下标越界
ArrayIndexOutOfBoundsException
- 空指针异常
NullPointerException
- 算数异常
ArithmeticException
- 丢失资源
MissingResourceException
- 找不到类
ClassNotFoundException
- 数组下标越界
-
这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽量避免这类异常的发生
-
Error和Exception的区别:
- Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这种异常时,JVM一般会终止线程。
- Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。