异常处理
异常的分类
Error
类及其子类:用来描述java运行系统中的一些内部错误,以及资源耗尽的错误,这类错误比较严重而且无法解决。
Exception
类:非致命性的错误,可以通过捕捉处理后继续执行的错误。
RuntimeException
:运行时异常
捕捉处理异常
自动捕捉异常
public class Demo {
public static void main(String[] args) {
int a = 2/0;
}
}
在编写时不报错,运行时:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.main(Demo.java:3)
try catch语句捕捉异常
语法:
try{
被捕获的代码
}catch(处理类型 e){
对异常的处理
}
public class Demo {
public static void main(String[] args) {
try{
int a = 2/0;
}catch(ArithmeticException e){
System.out.println("发生了算数异常!");
}
}
}
多重:
try{
被捕获的代码
}catch(处理类型1 e){
对异常的处理
}catch(处理类型2 e){
对异常的处理
}catch(处理类型3 e){
对异常的处理
}
处理顺序:从上往下进行判断,发现错误后不再判断后面的情况。
异常的中断机制
public class Demo1 {
public static void main(String[] args) {
try {
System.out.println("输出第一行");
int a = 1/0;
System.out.println("输出第二行");
System.out.println("输出第三行");
}catch (Exception e){
e.printStackTrace();
}
}
}
输出结果:
java.lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:5)
输出第一行
只输出了第一行
出现异常之后,异常之后的代码就会被屏蔽,不会再运行。
特殊情况:循环
public class Demo1 {
public static void main(String[] args) {
try {
for(int i = 0;i<5;i++){
System.out.println("输出第"+i+"行");
int a = 1/i;
}
}catch (Exception e){
e.printStackTrace();
}
}
}
输出:
输出第0行
java.lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:6)
出现异常后,循环即中断。
如果在循环中处理:
public class Demo1 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
try {
System.out.println("输出第" + i + "行");
int a = 1 / i;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
循环会继续:
输出第0行
输出第1行
输出第2行
输出第3行
输出第4行
java.lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:7)
恢复机制
finally代码块
语法
try{
被捕获的代码
}catch{
对异常的处理
}finally{
最后一定会执行的代码
}
如果程序发生异常,则会处理异常,然后执行finally
中的代码。
如果没有异常,则直接执行finally
中的代码。
不会执行的特殊情况
- 在
finally
块中发生了异常 - 在前面的代码中用了
System.exit()
(强制终端当前的程序) - 程序所在线程死亡
- 关闭CPU
Java常见异常
常见异常
ClassCastException
类型转换异常
ClassNotFoundException
类未找到相应类异常
ArithmeticException
算数异常
ArrayIndexOutOfBoundsException
数组下标越界异常
自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需要继承Exception类即可自定义异常。
创建自定义异常
自己创建一个API中没有的异常
语法
class 自定义异常类 extends 已有异常类{
}
创建继承Exception
类的MyException
类:
public class MyException extends Exception{
public MyException(String Message){
super(Message);
}
}
主方法:
public class MyException extends Exception{
public MyException(String Message){
super(Message);
}
}
输出:
MyException: 有错误
at Demo2.main(Demo2.java:6)
在方法中抛出异常
将异常交给别人处理
使用throws关键字抛出异常
用在方法之后
语法:
public void method()throws 异常类型1,异常类型2,异常类型3…{
}
在被调用时:
try{
method();
}catch(异常类型e){
e.printStackTrace();
}