33.Java的异常机制
- 什么是异常,实际工作中,遇到的情况不是完美的,例如:我们在开发时希望用户输入一个数字,结果用户输入了一个字符串;又或者当我们去打开某些并不存在的文件,读取不存在的数据等待。
- 英文 Exception,当遇到这些特殊情况是给予其合理的解决方案,而不至于导致程序崩溃
- 异常三大类
- 检查异常:最经典的是用户错误或问题所引起异常,这是程序员无法预见的,例如要读取某个文件,这个文件被用户删掉了,这些异常编译时不能被简单的忽略
- 运行时的异常:运行时异常是可能被程序员避免的异常,这类异常编译时会被编译器忽略。
- 错误:错误不是异常,而是脱离了程序员控制的问题,错误在代码中通常被忽略。例如:栈溢出,这种异常,编译器无法在编译时捕捉到。
-
Java中将异常当作对象来处理,并定义了一个java.lang.Throwable作为所有异常的超类
-
Java的API中定义了许多异常,这些异常分为两大类,一类是Error 和异常Exception
-
Error类对象是java虚拟机生成并抛出的,大多数错误与我们的代码没关系
-
Java虚拟机运行错误(Virtual MachineError),当JVM不再继续执行所需的内存资源时,将出现OutOfMemoryError,这些异常出发生时,JVM一般会选择线程终止。
-
Exception类对象也给我们划分了IOException和RuntimeException
-
Exception和Error的区别,Error是毁灭性的,一般发生时,程序会直接终止,Exception发生时,一般并不会终止程序而可以被我们所捕获处理。
-
我们可以通过try…catch…finally 来捕捉处理异常,其中finally为可选项,不管有没有发生异常都一定会被执行
package com.Exception.demo;
public class Demo1 {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
// 监察区
new Demo1().a();
System.out.println(a / b);
} catch (ArithmeticException e) {
// 捕捉算术例外异常
System.out.println("除数不能为0");
} catch (StackOverflowError e) {
// 捕捉堆栈溢出异常
System.out.println("堆栈溢出");
} catch (Throwable e) {
// 捕捉其他异常
System.out.println("未知异常");
} finally {
// 善后处理后继程序
System.out.println("不管有没有发生异常我都会执行");
}
System.out.println("我还会执行吗?当然");
}
public void a() {
b();
}
public void b() {
a();
}
}
-
当捕捉多个异常时,从上到下捕捉的异常必须是从小到大的
-
除了可以用try…catch捕捉处理之外,我们还可以用throw和throws主动抛出异常
package com.Exception.demo;
public class Demo2 {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
new Demo2().Division(a, b);
} catch (ArithmeticException e) {
System.out.println("抓到你了");
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("很ok");
}
public void Division(int a, int b) throws Exception { // 处理不了的异常向更高级抛出
if (b == 0) {
throw new ArithmeticException(); // 主动抛出一个异常
} else {
System.out.println(a / b);
}
}
}
34.自定义异常
- 自定义异常只需要写一个类去继承Exception类就行了
package com.Exception.demo;
public class MyException extends Exception {
public MyException(int detail) {
this.detail = detail;
}
private int detail;
// 当数字大于10时抛出
@Override
public String toString() {
// 异常的打印信息
return "MyException{" +
"detail=" + detail +
'}';
}
}
package com.Exception.demo;
public class Test {
public static void main(String[] args) {
try {
new Test().test(11);
} catch (MyException e) {
System.out.println("异常==>" + e);
}
}
public void test(int i) throws MyException {
if (i > 10) {
System.out.println("传入参数为:" + i);
throw new MyException(i);
} else {
System.out.println(i);
}
}
}