Exception - 异常 - Java - 细节狂魔

x33g5p2x  于2021-11-30 转载在 Java  
字(1.9k)|赞(0)|评价(0)|浏览(315)

前言

复现以前接触过的异常

算术异常

空指针异常

数组 索引/下标 越界异常

克隆异常,可参考面向对象的编程(三个常用接口)

输入的数据类型不匹配的异常

 

编译期 错误 / 异常 和 运行时 错误 / 异常

防御式编程

LBYL风格的代码(不使用异常)

英雄联盟手游

boolean ret = false;
ret = 登陆游戏();
if (!ret) {// 如果登录失败,执行下面的的操作
 处理登陆游戏错误;
    return;
}
ret = 开始匹配();
if (!ret) {// 如果匹配失败,执行下面的的操作
 处理匹配错误;
    return;
}
ret = 游戏确认();// 如果游戏确认失败,执行下面的的操作
if (!ret) {
 处理游戏确认错误;
    return;
}
ret = 选择英雄();// 如果选择英雄失败,执行下面的的操作
if (!ret) {
    处理选择英雄错误;
    return;
}
ret = 载入游戏画面(); 如果载入游戏界面失败,执行下面的的操作
if (!ret) {
 处理载入游戏错误;
    return;
}
......

EAFP 风格的代码(使用异常)

try {// 把可能出现异常的代码,放到try当中
    登陆游戏();
    开始匹配();
    游戏确认();
    选择英雄();
    载入游戏画面();
   ...
   // catch == 捕捉,捕捉什么呢?捕捉异常 
   // 异常有很多种,所以不能只捕捉一种异常
} catch (登陆游戏异常) {
    处理登陆游戏异常;
} catch (开始匹配异常) {
 处理开始匹配异常;
} catch (游戏确认异常) {
 处理游戏确认异常;
} catch (选择英雄异常) {
 处理选择英雄异常;
} catch (载入游戏画面异常) {
 处理载入游戏画面异常;
}
......

总结

异常的基本用法

捕获异常

>try{ 
 有可能出现异常的语句 ; 
}catch (异常类型 异常对象) {
}finally {
 异常的出口
}

注意事项:

  1. try 代码块中放的是可能出现异常的代码.
  2. catch 代码块中放的是出现异常后的处理行为.
  3. finally 代码块中的代码用于处理善后工作, 会在最后执行.
  4. 其中 finally 都可以根据情况选择加或者不加.,catch必须加,不然程序会报错。

实例1

实例1的深度解析

在没处理异常的情况下,程序方式异常为什么会终止运行。
错误信息与处理

还有一个点:判断程序是否是正常结束运行

重点:

实例2(处理空指针异常与数组越界异常 - catch 捕捉异常不限于1种)

异常的体系结构

小技巧(快速得知目前异常的父类,父类的父类。。。。)

前面我们catch的异常 都是 精确到某种异常类型的,而且 还想要捕获其它异常,就需要再写一个catch捕获,或者用按位或,再链接一个异常,但是现在我们知道这些异常的最终父类,那么我们可不可直接捕获它,这样我们只用写一个捕获,捕获一个异常。该异常包括所有子类异常。一劳永逸,岂不美哉。

还有一种捕获写法,是可以怎么去写的。来看下面程序

实例3 (解决克隆异常)

finally 表示最后的善后工作,例如释放资源

实例4 (处理输入数据不匹配异常)

实例4 (技巧偷油)

疑问:将异常交由JVM处理,我们的finally还会被执行吗?

实例5 (处理调用方法所带来的异常)

画面一转,继续讲finally 的一些特点,来看下面

异常处理流程

抛出异常

例题(读取文件)

自定义异常类

用户登录代码实例

public class Test {
    private static final String userName = "author";
    private static final String password = "12138";

    public static void login(String userName, String password) {
        if(!Test.userName.equals(userName)){// 用户名不相同,进入if语句
            System.out.println("用户名输入错误!");
        }
        if (!Test.password.equals(password)){
            System.out.println("password输入错误!");
        }
    }

    public static void main(String[] args) {
        login("author","12138");
    }
    }

我们的想法是将自定义一个用户登录错误异常

回到我们的用户登录代码

注意事项

自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常.

本文结束

相关文章

微信公众号

最新文章

更多

目录