程序意外终止就叫异常。
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Throwable: #
- 属性是信息,
- 属性是Throwable: 一个问题引发另一个问题。。。
- getMessage(); 获取错误信息
- printStackTrace(); 打印错误的 栈跟踪
Throwable cause1 = new Throwable("玩游戏");
Throwable cause = new Throwable("烤鸡", cause1);
Throwable th = new Throwable("挂了", cause);
th.printStackTrace();
System.out.println(cause.getMessage());
System.out.println(th.getMessage());
//结果:
powershell
java.lang.Throwable: 挂了
at lesson16.TestMain2.main(TestMain2.java:8)
Caused by: java.lang.Throwable: 烤鸡
at lesson16.TestMain2.main(TestMain2.java:7)
Caused by: java.lang.Throwable: 玩游戏
at lesson16.TestMain2.main(TestMain2.java:6)
烤鸡
挂了
Throwable的子类 #
- Error: 系统级别错误不需要处理
- Exception: 异常:
- RuntimeException: 运行时异常(java 命令 出的异常)
- CheckedException: 编译时异常,检查异常,( 不存在这个类指的是除了RuntimeException之外的异常)
- 编译器提示我们处理的异常
常见的 运行时异常 #
异常 | 中文 | 补充 |
---|---|---|
NullpointerException | 空指针异常 | null.xxx的时候触发 |
ArrayIndexOutOfBoundsException | 数组下标越界 | args[-1] args[2] |
ArithmeticException | 算术异常 | 10/0 |
ClassCastException | 类型转换异常 | (A)b b不是A的实例 |
illegalArgumentException | 严重的参数异常 | |
– NumberFormatException | int a = Integer.parseInt(“123lkafjlkasdfkla”); |
RuntimeExcepiton: 说明你写错了
需要处理。
- nullpointerException时 要检查
.
前面的对象是否实例化 - ArrayIndexofboundsException: 确定 下标和 数组的长度
- ArithmeticExcepiton: 找算术公式, 例如:除数为零
- ClassCastException: 确定 对象是否是类型的实例
- IllegalArgumentException: 确定参数是否正确
异常的捕获 #
语法1:
try {
// 要捕获的代码
} catch (异常类1 变量) {
// 捕获到 异常时的处理
} catch (异常类2 变量) {
// 捕获到 异常时的处理
} finally {
// 不管是否异常都要执行的代码
}
public static void main(String[] args) {
int a = 0;
Object o = null;
try {
System.out.println("--befor--");
a = 10 / 1; // 10 / 0
System.out.println("--after--");
Class.forName("aaa"); // 加载类
System.out.println(o.toString());
} catch (ArithmeticException e) {
System.out.println("抛出异常了!" + e.getMessage());
e.printStackTrace(); // 新开了一个线程进行打印
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) { // 注意:大的异常放后面
e.printStackTrace();
} finally {
System.out.println("finally");
}
System.out.println(a);
}
语法2:jdk7
“`java
try {} catch(异常1|异常2|异常3 e) { // 异常不可有包含关系的
} finally {
}
int a = 0;
Object o = null;
try {
System.out.println("--befor--");
a = 10 / 1; // 10 / 0
System.out.println("--after--");
Class.forName("aaa"); // 加载类
System.out.println(o.toString());
} catch (ArithmeticException|NullPointerException e) {
System.out.println("抛出异常了!" + e.getMessage());
e.printStackTrace(); // 新开了一个线程进行打印
} catch (Exception e) { // 注意:大的异常放后面
e.printStackTrace();
} finally {
System.out.println("finally");
}
System.out.println(a);
try {
System.out.println("--befor--");
a = 10 / 1; // 10 / 0
System.out.println("--after--");
Class.forName("aaa"); // 加载类
System.out.println(o.toString());
} catch (Exception e) {
System.out.println("抛出异常了!" + e.getMessage());
e.printStackTrace(); // 新开了一个线程进行打印
} finally {
System.out.println("finally");
}
语法3:JDK8
try ( 可关闭的代码 ) {
} catch(异常 e) {
}// 不需要在fianlly里关闭
异常的抛出;throw与throws #
throw: 抛出异常对象
throw e;
throws: 用于方法定义时,抛出异常
public void abc() throws AException, BException{}
- throw + runtimeException对象时,方法声明可以不throws
- throw + checkedExceptiion对象时, 方法后必须什么throws 异常
- 方法有throws checkedException时,谁调用就倒霉。要处理。
- 1. 继续向上层抛throws
- 2.try..catch(){}.. 对象异常进行捕获
Java 内置异常类 #
异常 | 描述 |
---|---|
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数”除以零”时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。
异常 | 描述 |
---|---|
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝访问一个类的时候,抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 |
InterruptedException | 一个线程被另一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |