Exception - 异常 - Java - 细节狂魔

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

前言

复现以前接触过的异常

算术异常

空指针异常

数组 索引/下标 越界异常

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

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

 

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

防御式编程

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

英雄联盟手游

  1. boolean ret = false;
  2. ret = 登陆游戏();
  3. if (!ret) {// 如果登录失败,执行下面的的操作
  4. 处理登陆游戏错误;
  5. return;
  6. }
  7. ret = 开始匹配();
  8. if (!ret) {// 如果匹配失败,执行下面的的操作
  9. 处理匹配错误;
  10. return;
  11. }
  12. ret = 游戏确认();// 如果游戏确认失败,执行下面的的操作
  13. if (!ret) {
  14. 处理游戏确认错误;
  15. return;
  16. }
  17. ret = 选择英雄();// 如果选择英雄失败,执行下面的的操作
  18. if (!ret) {
  19. 处理选择英雄错误;
  20. return;
  21. }
  22. ret = 载入游戏画面(); 如果载入游戏界面失败,执行下面的的操作
  23. if (!ret) {
  24. 处理载入游戏错误;
  25. return;
  26. }
  27. ......

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

  1. try {// 把可能出现异常的代码,放到try当中
  2. 登陆游戏();
  3. 开始匹配();
  4. 游戏确认();
  5. 选择英雄();
  6. 载入游戏画面();
  7. ...
  8. // catch == 捕捉,捕捉什么呢?捕捉异常
  9. // 异常有很多种,所以不能只捕捉一种异常
  10. } catch (登陆游戏异常) {
  11. 处理登陆游戏异常;
  12. } catch (开始匹配异常) {
  13. 处理开始匹配异常;
  14. } catch (游戏确认异常) {
  15. 处理游戏确认异常;
  16. } catch (选择英雄异常) {
  17. 处理选择英雄异常;
  18. } catch (载入游戏画面异常) {
  19. 处理载入游戏画面异常;
  20. }
  21. ......

总结

异常的基本用法

捕获异常

  1. >try{
  2. 有可能出现异常的语句 ;
  3. }catch (异常类型 异常对象) {
  4. }finally {
  5. 异常的出口
  6. }

注意事项:

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

实例1

实例1的深度解析

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

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

重点:

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

异常的体系结构

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

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

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

实例3 (解决克隆异常)

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

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

实例4 (技巧偷油)

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

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

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

异常处理流程

抛出异常

例题(读取文件)

自定义异常类

用户登录代码实例

  1. public class Test {
  2. private static final String userName = "author";
  3. private static final String password = "12138";
  4. public static void login(String userName, String password) {
  5. if(!Test.userName.equals(userName)){// 用户名不相同,进入if语句
  6. System.out.println("用户名输入错误!");
  7. }
  8. if (!Test.password.equals(password)){
  9. System.out.println("password输入错误!");
  10. }
  11. }
  12. public static void main(String[] args) {
  13. login("author","12138");
  14. }
  15. }

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

回到我们的用户登录代码

注意事项

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

本文结束

相关文章

最新文章

更多

目录