前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >认识异常(1)

认识异常(1)

作者头像
E绵绵
发布2024-04-17 08:13:14
690
发布2024-04-17 08:13:14
举报
文章被收录于专栏:编程学习之路编程学习之路

异常的概念与体系结构

异常的概念

​​​​ 在Java中,将程序执行过程中发生的不正常行为称为异常。 🎯🎯注意开发过程中遇到的语法错误和逻辑错误不被称为异常(): 例如将 System.out.println 拼写错了, 写成了 system.out.println.这是语法错误不是异常。 或者你的冒泡排序中代码错了导致结果不对这也不叫异常。是逻辑错误不是异常。 而下方才是真正的异常 :

从上述过程中可以看到,java中不同类型的异常,都有与其对应的类来进行描述。所以我们常说异常其实是一个类

🎯🎯异常的体系结构

🎯🎯因为异常其实是类,且从上图我们可以得出: 1. Throwable:是异常体系的顶层父类,其派生出两个重要的子类 Error 和 Exception,它们两个是异常的两大类别: 2. Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表: StackOverflowError(栈溢出)和OutOfMemoryError(内存不足),Errow是严重错误,一旦发生程序就会崩溃,怎么救也救不回来。 3. Exception: 是指在程序运行过程中出现的非正常情况,但它不会导致程序立即终止。Exception异常可以被程序员通过代码捕获并进行处理,以保证程序的正常执行。该类异常通常是由于输入错误、网络故障、文件读写错误等引起的。例如,除以零、数组越界等都属于异常。当异常发生时,程序会抛出一个异常对象,并根据异常处理机制进行相应的处理。 虽然Throwable才是真正的异常顶层父类,但我们平时所说的异常通常是Exception,errow虽然本质是异常,但我们通常叫做错误。

❤️❤️除此之外,我们还从上得知exception异常分为运行时异常(非受检异常)和编译时异常(受检异常)

运行时异常

🎯🎯运行时异常:运行时异常是在程序运行过程中才会发生的异常. 常见的运行时异常包括以下五种: NullPointerException(空指针异常):当程序试图访问一个空对象的成员变量或调用空对象的方法时,会抛出空指针异常。 ArrayIndexOutOfBoundsException(数组越界异常):当程序试图访问数组中不存在的索引位置时,会抛出数组越界异常。 ClassCastException(类转换异常):当程序试图将一个对象强制转换为不兼容的类型时,会抛出类转换异常。 IllegalArgumentException(非法参数异常):当方法接收到一个不合法或不适当的参数时,会抛出非法参数异常。 ArithmeticException(算术异常):当程序执行算术运算时出现错误,例如除以零或取模运算的除数为零,会抛出算术异常。 ​​​​​​​这些异常都是在程序运行时可能发生的,可以通过合理的代码设计和异常处理机制来避免或处理这些异常。 运行时异常可以选择处理,也可以不处理: 如果不处理,程序会运行到异常位置时终止并抛出异常信息。处理则可以不报错误一直运行到程序结束。

编译时异常

🎯🎯编译时异常是在编译阶段检测到的异常,在代码中必须对它进行处理。如果不处理编译时异常,编译器会报错并阻止程序的编译,运行都运行不了。 一般是发生网络,数据库和文件操作的时候出现编译异常:

以上我们都还没学。 当然也存在我们学过的编译时异常,就是clone(),必须处理它才能运行程序

处理编译时异常的方式可以使用try-catch语句块捕获异常并进行相应的处理,或者使用throws关键字将异常抛出给上层调用者处理。我们之后会讲述这些关键字。

防御式编程

❤️❤️错误在代码中是客观存在的. 因此我们要让程序出现问题的时候及时通知程序猿. 其主要的方式如下:

❤️❤️ LBYL: Look Before You Leap. 在操作之前就做充分的检查. 即:事前防御型

代码语言:javascript
复制
boolean ret = false;
ret = 登陆游戏();
if (!ret) {
 处理登陆游戏错误;
    return;
}
ret = 开始匹配();
if (!ret) {
 处理匹配错误;
    return;
}
ret = 游戏确认();
if (!ret) {
 处理游戏确认错误;
    return;
}
ret = 选择英雄();
if (!ret) {
    处理选择英雄错误;
    return;
 
}
ret = 载入游戏画面();
if (!ret) {
 处理载入游戏错误;
    return;
}
.....

缺陷:正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱。所以我们一般很少用该方法。

❤️❤️EAFP: It's Easier to Ask Forgiveness than Permission. "事后获取原谅比事前获取许可更容易". 也就是先操作, 遇到问题再处理. 即:事后认错型

代码语言:javascript
复制
try {
    登陆游戏();
    开始匹配();
    游戏确认();
    选择英雄();
    载入游戏画面();
   ...
} catch (登陆游戏异常) {
    处理登陆游戏异常;
} catch (开始匹配异常) {
 处理开始匹配异常;
} catch (游戏确认异常) {
 处理游戏确认异常;
} catch (选择英雄异常) {
 处理选择英雄异常;
} catch (载入游戏画面异常) {
 处理载入游戏画面异常;
}
......

优势:正常流程和错误流程是分离开的, 程序员更关注正常流程,代码更清晰,容易理解代码

所以我们在进行处理时基本都是用EAFP,很少用LBYL。

在Java中,异常处理主要用到这5个关键字:throw、try、catch、final、throws。而这五个关键字要讲解的话要讲很久,所以我们就放到下篇文章里。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常的概念与体系结构
    • 异常的概念
      • 🎯🎯异常的体系结构
        • 运行时异常
        • 编译时异常
    • 防御式编程
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档