Java中的异常


一、认识异常

  异常,是每一个学习编程语言都会遇到的问题。在Java中其实我们也见到过很多种异常了,比如:数组下标越界异常(java.lang.ArrayIndexOutOfBoundsException)、空指针异常(java.lang.NullPointerException)、类型转换异常(java.lang.ClassCastException)等。

  那么了解什么是异常后,来真正的认识一下异常。异常分为两种(图一):① 运行时异常(也称为非受查异常):顾名思义运行时异常就是运行的期间发生的异常。②编译时异常(也称为受查异常):编译时期发生的异常,编译工具会自行检查,因此也被成为受查异常。那么出现了异常,怎么处理呢?
在这里插入图片描述



二、捕获异常

  Java中提供有try、catch、finally等关键字来捕获异常并且处理异常。

基本语法格式:

try {
   //此处为可能出现异常的语句;
}[catch (异常类型 异常对象){
   //输出异常等操作;
}
...
//可以有多个catch语句用来捕获异常
]
[finally{
  //异常的出口;
}]

例:使用try…catch处理异常

public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try{
            int c = a/b;
            System.out.println(c);
        }catch (ArithmeticException e){//catch进行异常捕获
            System.out.println("除数不能为0");
            e.printStackTrace();//输出具体的异常类型
        }
    }
}

执行结果:

除数不能为0
java.lang.ArithmeticException: / by zero
	at Test.main(Test.java:6)

说明

  ① 如果没有使用try…catch语句来进行异常捕获处理,那么一旦出现异常就会终止代码的执行,但是使用try…catch之后,程序会继续执行try…catch之后的代码。

  ② 若捕获到异常之后可以调用e.printStackTrace()方法输出具体异常类型。

  ③ catch只能处理对应的异常


例:使用多个catch捕获不同的异常类型

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();//当b输入非int类型的数据时,会发生输入异常
        try{
            int c = a/b;
            System.out.println(c);
        }catch (ArithmeticException  | InputMismatchException e){
            System.out.println("出现算数异常或者是输入异常");
            e.printStackTrace();
        }catch (RuntimeException e){//捕获运行时异常
            e.printStackTrace();
        }catch (Exception e){//捕获异常,范围太大,不建议使用
            e.printStackTrace();
        }
    }
}

使用finally的注意事项:

① finally中的代码在方法结束前一定会执行到。finally中的一般用于关闭/释放资源。

切记在finally中谨慎的使用return语句。例:在finally中使用return语句

public class Test {
    public static void main(String[] args) {
        System.out.println(print());
    }
    public static String print(){
        try{
            return "hahaha!";
        }finally {
            return "你好呀!";
        }
    }
}

执行结果:

你好呀!


三、异常处理流程

  ① 程序先执行try中的代码

  ② 如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配

  ③ 如果找到匹配的异常类型,就会执行catch中的代码

  ④ 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者

  ⑤ 无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束前)

  ⑥ 如果上层调用者也没有处理该异常,就会继续向上传递

  ⑦ 一直到main方法也没有合适的代码处理异常,就会交给JVM来进行处理,此时程序就会异常终止


1、抛出异常

  除了Java内置的类会抛出一些异常之外,程序员也可以使用throw关键字来完成手动抛出异常。

public class Test {
    public static void main(String[] args) {
        String str = null;
        System.out.println(fun(str));
    }
    public static String fun(String str){
        if(str == null){
            throw new NullPointerException("操作不当,产生空指针异常");
        }
        return str;
    }
}

执行结果:
在这里插入图片描述
说明:使用了throw关键字之后,一定要使用throws关键字声明使用该方法会产生异常,这样是为了提醒调用者要注意捕获这些异常。

public static String fun(String str) throws NullPointerException{
    if(str == null){
        throw new NullPointerException("操作不当,产生空指针异常");
    }
    return str;
}

2、自定义异常类

  Java 中虽然已经内置了丰富的异常类,但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展,创建符合我们实际情况的异常。我们可以基于已有的异常类进行扩展(继承), 创建和我们业务相关的异常类。

class OverSpeed extends RuntimeException{
    public OverSpeed(String string){
        super(string);
    }
}
public class Test {
    public static void main(String[] args) {
        int speed = 100;
        System.out.println(speedDetection(speed));
    }
    public static int speedDetection(int speed){
        if(speed > 60){
            throw new OverSpeed("检测到您在城市里的速度超过60公里/小时,属于超速");
        }else{
            return speed;
        }
    }
}

执行结果:
在这里插入图片描述

注意事项:
  ① 自定义异常通常会继承自 Exception 或者 RuntimeException

  ② 继承自 Exception 的异常默认是受查异常

  ③ 继承自 RuntimeException 的异常默认是非受查异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值