【Java学习日记】#16 异常处理

异常的分类

Throwable
Exception
Error
RuntimeException

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中的代码。

不会执行的特殊情况
  1. finally块中发生了异常
  2. 在前面的代码中用了System.exit()(强制终端当前的程序)
  3. 程序所在线程死亡
  4. 关闭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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值