【关于Java:认识异常】

文章目录

  • 一、1. 异常概念与体系结构
    • 1.1 异常的概念
    • 1.2 常见的异常
      • 1.算数异常
      • 2.数组越界异常
      • 3.空指针异常
    • 1.3 异常的体系结构
    • 1.4 异常的分类
      • 1. 编译时异常
      • 2. 运行时异常(RuntimeException)
  • 二、 异常的处理方式
    • 2.1 防御式编程
    • 2.2 EAFP:(异常处理的核心思想)
  • 三、 异常的处理流程
    • 3.1 异常的抛出
      • throw关键字
      • throws关键字
      • try catch
  • 总结


一、1. 异常概念与体系结构

1.1 异常的概念

在写代码的过程中总会出现的一些问题bug,有时很难通过代码去解决它
在Java中,将在程序执行过程中发生的不正常行为称为异常。

异常也分类:

1.2 常见的异常

1.算数异常

public class Test {public static void main(String[] args) {System.out.println(10/0);}
}

在这里插入图片描述

2.数组越界异常

public class Test {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(arr[100]);}
}

在这里插入图片描述

3.空指针异常

public class Test {public static void main(String[] args) {int[] arr = null;System.out.println(arr[0]);}
}

在这里插入图片描述

1.3 异常的体系结构

异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构
在这里插入图片描述
从上图中可以看到:

  1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, ErrorException
  2. Error(错误):指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
public class Test {public static void func(){func();}public static void main(String[] args) {func();}
}

在这里插入图片描述

  1. Exception(异常):异常产生后程序员可以通过代码进行处理,使程序继续执行。平时所说的异常就是Exception。

1.4 异常的分类

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为:

1. 编译时异常

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常
还没来得及运行,在写代码的时候就报异常了。
在这里插入图片描述

2. 运行时异常(RuntimeException)

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常

RunTimeException以及其子类对应的异常,都称为运行时异常。RuntimeException有很多很多子类比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException。

二、 异常的处理方式

2.1 防御式编程

  1. LBYL:
    Look Before You Leap. 在操作之前就做充分的检查,即:事前防御型
    每做一步都要进行一次检查,
    缺陷:正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱。
boolean ret = false;
ret = 登陆游戏();
if (!ret) {
处理登陆游戏错误;
return;
}
ret = 开始匹配();
if (!ret) {
处理匹配错误;
return;
}
ret = 游戏确认();
if (!ret) {
处理游戏确认错误;
return;
}
ret = 选择英雄();
if (!ret) {
处理选择英雄错误;
return;
}
ret = 载入游戏画面();
if (!ret) {
处理载入游戏错误;
return;
}
......

2.2 EAFP:(异常处理的核心思想)

It’s Easier to Ask Forgiveness than Permission. "事后获取原谅比事前获取许可更容易"也就是先操作, 遇到问题再处理,即:事后认错型
优势:正常流程和错误流程是分离开的, 程序员更关注正常流程,代码更清晰,容易理解代码

try {
登陆游戏();
开始匹配();
游戏确认();
选择英雄();
载入游戏画面();
...
} catch (登陆游戏异常) {
处理登陆游戏异常;
} catch (开始匹配异常) {
处理开始匹配异常;
} catch (游戏确认异常) {
处理游戏确认异常;
} catch (选择英雄异常) {
处理选择英雄异常;
} catch (载入游戏画面异常) {
处理载入游戏画面异常;
}
...

三、 异常的处理流程

在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws

处理异常的前提是得抛出异常

3.1 异常的抛出

在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者。
如果出现bug,又不想解决的时候,可以借助throw关键字,抛出一个指定的异常对象,当调用者调用时,调用者就知道这里有一个异常了。

抛出异常的方式有很多种
1.某段程序抛出
2.throw关键字抛出,一般用于抛出自定义的异常

throw关键字

public class Test {public static void main(String[] args) {int a=10;if(a==10){throw new NullPointerException("hahaha!");}}

【注意事项】

  1. throw必须写在方法体内部
  2. 抛出的对象必须是Exception 或者 Exception 的子类对象
  3. 如果抛出的是 RunTimeException 或RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
  4. 如果抛出的是编译时异常,用户必须要处理,在方法声明之后用throws声明异常,否则无法通过编译
  5. 异常一旦抛出,其后的代码就不会执行

throws关键字

使用在方法的声明之后
作用:告诉方法的调用者,调用这个方法,会抛出一个XXX异常。
应用场景:处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助throws将异常抛给方法的调用者来处理。即当前方法不处理异常,提醒方法的调用者处理异常。
在这里插入图片描述

在这里插入图片描述

【注意事项】

  1. throws必须跟在方法的参数列表之后
  2. 声明的异常必须是 Exception 或者 Exception 的子类
  3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。

try catch

在这里插入图片描述
编译时异常(受查异常),必须要处理
所以:
在这里插入图片描述
但是,这个异常最终没有被程序员处理,实际上是交给JVM处理 。

如果不想要JVM处理,想要自己处理,那么就用到try catch

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

使用try catch可以自己抛出异常的代码,让程序正常进行

下面的代码在第二次打印的时候异常了,导致最后一个代码没有打印出来,
因为这种情况就是交给JVM处理,当JVM处理时,就会异常终止。

所以就出现了try catch来弥补这个缺点,使程序正常运转。
在这里插入图片描述

try catch使用方法:
把可能异常的代码用try 包裹起来,在catch括号里面抛出可能异常的类型,只有当catch捕捉到了这个异常,才会执行catch里面的内容,才能使后面的代码正常运行。
所以有一点注意的是:一定要写对异常的类型

public class Test {public static void main(String[] args) {System.out.println("before...");try {System.out.println(10/0);}catch (ArithmeticException e){System.out.println("我来处理异常ArithmeticException异常了");}System.out.println("after...");}
}

在这里插入图片描述

在这里插入图片描述
如果不知道是什么异常,或者异常有很多个,就写多几个catch

public static void main(String[] args) {System.out.println("before...");try {System.out.println(10/0);}catch (ArithmeticException e){System.out.println("我来处理异常ArithmeticException异常了");}catch(NullPointerException a){System.out.println("我来处理异常NullPointerException异常了");}System.out.println("after...");}

如果想知道是哪一行代码有异常,可以这样写

   public static void main(String[] args) {System.out.println("before...");try {System.out.println(10/0);}catch (ArithmeticException e){e.printStackTrace();System.out.println("我来处理异常ArithmeticException异常了");}catch(NullPointerException a){System.out.println("我来处理异常NullPointerException异常了");}System.out.println("after...");}

在这里插入图片描述
在这里插入图片描述

【注意事项】

  1. try块内抛出异常位置之后的代码将不会被执行
  2. 如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到 JVM收到后中断程序----异常是按照类型来捕获的
    3.不能直接用父类接受所有的异常子类,因为此时异常不精准。

如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误:

在这里插入图片描述

子类在前,父类在后是可以的,父类充当了一个垫后的作用。
在这里插入图片描述

总结

例如:以上就是今天要讲的异常的内容,内容多但比较容易理解,多看看复盘一下就能掌握啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126789.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分类】分类性能评价

评价指标 1、准确率、召回率、精确率、F-度量、ROC ​ 属于各类的样本的并不是均一分布,甚至其出现概率相差很多个数量级,这种分类问题称为不平衡类问题。在不平衡类问题中,准确率并没有多大意义,我们需要一些别的指标。 ​ 通…

pyspark 系统找不到指定的路径; \Java\jdk1.8.0_172\bin\java

使用用具PyCharm 2023.2.1 1:pyspark 系统找不到指定的路径, Java not found and JAVA_HOME environment variable is not set. Install Java and set JAVA_HOME to point to the Java installation directory. 解决方法:配置正确环境变量…

万字C语言之分支语句和循环语句

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法…

react-native实现 TextInput 键盘显示搜索按钮并触发回调

<TextInput returnKeyType"search"returnKeyLabel"搜索"onSubmitEditing{e > {toSearch(keyword);}} /><SearchBarref{serachBarEl}placeholder"请输入"onChangeText{handleChangeSearch}value{search}onSubmitEditing{handleSearch…

react16之前diff算法的理解和总结

此篇文章所讨论的是 React 16 以前的 Diff 算法。而 React 16 启用了全新的架构 Fiber&#xff0c;相应的 Diff 算法也有所改变&#xff0c;本片不详细讨论Fiber。 fiber架构是为了支持react进行可中断渲染&#xff0c;降低卡顿&#xff0c;提升流畅度。 react16之前的版本&…

131.【MySQL_基础篇】

MySQL_基础篇 (一)、MySQL 介绍1.MySQL三大阶段(1).基础篇(2).进阶篇(3).运维篇 2.MySQL 概念3.数据模型(1).关系型数据库(RDBMS) 4.数据库三大范式 (二)、SQL 编程语言1.SQL通用语法2.SQL 四大分类3.DDL (数据定义语言)(1).数据库操作 ->(增删改查)(2).表操作 -> (增删改…

IDEA2023隐藏.idea和.iml文件

IDEA2023隐藏.idea和.iml文件 1. 打开file -> setting,快捷键CtrlAlts2. Editor -> File types3. 点击右侧Ignore files and folders一栏4. 添加需要忽略的文件5. 最重要一步 IDEA新建项目会自动生成一个.idea文件夹和.iml文件&#xff0c;开发中不需要对这两个文件修改&…

LeetCode 92. Reverse Linked List II【链表,头插法】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

react使用hook封装一个tab组件

目录 react使用hook封装一个tab组件Tabbar.jsx使用组件效果 react使用hook封装一个tab组件 Tabbar.jsx import PropsTypes from "prop-types"; import React, { useEffect, useState } from react; export default function Tabbar(props) {const { tabData , cur…

Kotlin File writeText appendText appendBytes readBytes readText

Kotlin File writeText appendText appendBytes readBytes readText import java.io.Filefun main(args: Array<String>) {val filePath "./myfile.txt"val file File(filePath)file.writeText("hello,") //如果原有文件有内容&#xff0c;将完全覆…

【Maven教程】(四)坐标与依赖:坐标概念,依赖配置、范围、传递性和最佳实践 ~

Maven 坐标与依赖 1️⃣ 什么是Maven 坐标2️⃣ 坐标详解3️⃣ 依赖的配置4️⃣ 依赖范围5️⃣ 传递性依赖6️⃣ 依赖调解7️⃣ 可选依赖8️⃣ 最佳实践8.1 排除依赖8.2 归类依赖8.3 优化依赖 &#x1f33e; 总结 正如前面文章所述&#xff0c;Maven 的一大功能是管理项目依赖…

sonarqube版本升级

官方文档&#xff1a;Upgrade guide 步骤1、停止原有sonarqube服务&#xff0c;如果是docker部署的直接停掉容器并删除 步骤2、部署最新版sonarqube&#xff0c;保留原有配置 步骤3、访问sonarqube web 显示维护中&#xff0c;根据官方给出的升级方法&#xff0c;在sonarqub…

学习笔记|小数点控制原理|数码管动态显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第十集:数码管动态显示

文章目录 1.数码管动态刷新的原理2.动态刷新原理3.8位数码管同时点亮新建一个数组选择每个位需要显示的内容实战小练&#xff1a;简易10秒免单计数器将刷新动作写成函数 课后练习: 1.数码管动态刷新的原理 上述图片引用自&#xff1a;51单片机初学2-数码管动态扫描 用一排端口来…

mysql 大表如何ddl

大家好&#xff0c;我是蓝胖子&#xff0c;mysql对大表(千万级数据)的ddl语句&#xff0c;在生产上执行时一定要千万小心&#xff0c;一不小心就有可能造成业务阻塞&#xff0c;数据库io和cpu飙高的情况。今天我们就来看看如何针对大表执行ddl语句。 通过这篇文章&#xff0c;…

推荐一款程序员截图神器!

快来看一下程序员必备的一款截图工具 今天就来和大家说一下作为程序员必备截图神器&#xff0c;几乎每一个程序员都会设置开机自启&#xff0c;因为这个截图功能太太太好用了&#xff01;&#xff01;&#xff01;只要你在键盘上按下F1就可以轻松截取整个屏幕&#xff0c;然后…

OpenHarmony:如何使用HDF驱动控制LED灯

一、程序简介 该程序是基于OpenHarmony标准系统编写的基础外设类&#xff1a;RGB LED。 目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网&#xff1a;https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。 …

【【STM32--28--IO引脚的复用功能】】

STM32–28–IO引脚的复用功能 STM32的IO复用功能 何为复用? 我们先了解一下何为通用 IO端口的输入或输出是由GPIO外设控制&#xff0c;我们称之为通用 复用&#xff1a; IO端口的输入或者是输出是由其他非GPIO外设控制就像经常说的USART 由 DR寄存器进行输出 STM32的IO复用功…

docker 笔记11: Docker容器监控之CAdvisor+InfluxDB+Granfana

1.原生命令 docker stats命令的结果 是什么 2.是什么 容器监控3剑客 CAdvisor监控收集InfluxDB存储数据Granfana展示图表 3.CAdvisor 4.InfluxDB 5.Granfana 6.总结 7.compose容器编排&#xff0c;一套带走 新建目录 7.1新建3件套组合的 docker-compose.yml version: 3.1vo…

通过 Jetbrains GateWay实现Remote Development

本次环境准备 环境准备&#xff1a;win10、一台安装有树莓派系统的树莓派&#xff08;也可以是其他的服务器&#xff09; 第一步&#xff1a;通过官网下载JetBrains Gateway 官网地址&#xff1a;https://www.jetbrains.com/remote-development/gateway/ 第二步&#xff1a;安装…

Shell 运算符及语法结构

目录 一、Shell运算符 1.1 表达式expr 1.2 运算操作 1.3 操作实例 二、Shell条件判断 2.1 基本语法 2.2 值、权限、类型、多条件判断 三、Shell流程控制 3.1 if 流程语法 3.2 case 流程语法 3.3 for 流程语法 3.4 内部运算符 3.5 while循环流程语法 四、Shell读…