Java异常机制入门详解(下)

  • 异常的处理方式

异常有3中处理方式,分别是:

①JVM默认的处理方式

②自己处理

③抛出异常

  • JVM默认的处理方式

●把异常的名称,异常原因及异常出现的位置等信息输出在了控制台(以红色字体)

●程序停止执行,下面的代码不会再执行了

public class ExceptionDemo1 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};System.out.println(arr[5]);// 异常后的代码System.out.println("看看我执行了吗?");}
}

以上代码将会抛出java.lang.ArrayIndexOutOfBoundsException,由于采用的是JVM默认的处理方式,因此在执行输出语句时遇到异常后将停止执行,异常出现后的代码将不会执行。

  • 自己处理(捕获异常)

格式:

try {可能出现异常的代码;}catch(异常类名 变量名){异常的处理代码;}

目的:当代码出现异常时,可以让程序继续往下执行。

public class ExceptionDemo1 {public static void main(String[] args) {// 定义一个数组int[] arr = {1, 2, 3, 4, 5};try {// 可能出现异常的代码System.out.println(arr[5]); //此处出现了异常,程序就会在这里创建一个ArrayIndexOutOfBoundsException对象// new ArrayIndexOutOfBoundsException();//拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接收这个对象// 如果能被接收,就表示该异常就被捕获(抓住),执行catch里面对应的代码// 当catch里面所有的代码执行完毕,继续执行try...catch体系下面的其他代码}catch (ArrayIndexOutOfBoundsException e){// 如果出现了ArrayIndexOutOfBoundsException异常// 要采取的操作System.err.println("数组越界!");}// 异常后的代码System.out.println("看看我执行了吗?");}
}
  • 关于异常的灵魂四问

灵魂一问:如果try中没有遇到问题,怎么执行?

会把try里面所有的代码全部执行完毕,不会执行catch里面的代码。

注意:只有当出现了异常才会执行catch里面的代码

灵魂二问:如果try中可能会遇到多个问题,怎么执行?

会写多个catch与之对应

细节:

如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面

了解性:

在JDK7之后,我们可以在catch中同时捕获多个异常,中间用竖线|进行隔开表示如果出现了A异常或者B异常的话,采取同一种处理方案,如下:

try {// 代码
}catch (ArrayIndexOutOfBoundsException | NullPointerException e){System.err.println("出现异常!");
}

灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?

相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理。

灵魂四问:如果try中遇到了问題,那么try下面的其他代码还会执行吗?

try语句块下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体,但是如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理。

  • Throwable类的常用方法

方法名称

说明

public String getMessage()

返回此throwable的详细消息字符串

public String tostring()

返回此可抛出的简短描述

public void printStackTrace()

把异常的错误信息输出在控制台

Idea快捷键Ctrl+Alt+T可以把选中的代码快速包裹进语句块。

方法printStackTrace()打印异常的详细信息,但不会停止程序运行。

  • 抛出处理
  1. 关键字throws

写在方法定义处,表示声明一个异常告诉调用者,使用本方法可能会有哪些异常。格式如下:

public void myMethod() throws ArrayIndexOutOfBoundsException, NullPointerException{// 方法的代码
}

●编译时异常:必须要写。

●运行时异常:可以不写。

  1. 关键字throw

写在方法内,结束方法,表示手动抛出异常对象,交给调用者,方法中下面的代码不再执行了。

public void myMethod(){// 方法的代码throw new NullPointerException();}如下代码:public class ExceptionDemo3 {public static void main(String[] args) {int[] arr = {1};System.out.println(getMax(arr));}/*** 获取数组中的最大值* @param arr 数组* @return 最大值*/public static int getMax(int[] arr){if (arr == null){//手动创建一个异常对象,并把这个异常交给方法的调用者处理// 此时方法就会结束,下面的代码不会再执行了// 抛出空指针异常throw new NullPointerException();}else if(arr.length == 0){// 抛出越界异常throw new ArrayIndexOutOfBoundsException();}int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max){max = arr[i];}}return max;}
}
  • 小结

1.虚拟机默认处理异常的方式

把异常信息以红色字体打印在控制台,并结束程序

2.捕获:try…catch

捕获的主要作用是不让程序停止。

一般用在调用处,能让代码继续往下运行。

3.抛出:throw throws

抛出的主要作用是告诉调用者出错了。

在方法中,出现异常了。方法就没有继续运行下去的意义了,采取抛出处理。让该方法结束运行并告诉调用者出现了问题。

  • 练习

需求:

键盘录入自己心仪的女朋友姓名和年龄。

姓名的长度在3~10之间,

年龄的范围为18-40岁,

超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止。

提示:

需要考虑用户在键盘录入时的所有情况。比如:录入年龄时超出范围,录入年龄时录入了abc等情况

import java.util.Scanner;public class GirlfriendInput {public static void main(String[] args) {//1.创建键盘录入的对象Scanner sc = new Scanner(System.in);//2.创建女朋友的对象Girlfriend gf = new Girlfriend();while (true) {//3.接收女朋友的姓名try {System.out.println("请输入你心仪的女朋友的名字");String name = sc.nextLine();gf.setName(name);//4.接收女朋友的年龄System.out.println("请输入你心仪的女朋友的年龄");String ageStr = sc.nextLine();int age = Integer.parseInt(ageStr);gf.setAge(age);//如果所有的数据都是正确的,那么跳出循环break;} catch (NumberFormatException e) {System.out.println("年龄的格式有误,请输入数字");//continue;} catch (RuntimeException e) {System.out.println("姓名的长度或者年龄的范围有误");//continue;}}//5.打印System.out.println(gf);}
}

Girlfriend类代码:

public class Girlfriend {private String name;private int age;public Girlfriend() {}public Girlfriend(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {int len = name.length();if (len < 2 || len > 10){// 如果姓名长度不对,则抛出异常throw new RuntimeException();}this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {if (age < 18 || age > 40){// 如果年龄不符合要求,抛出异常throw new RuntimeException();}this.age = age;}public String toString() {return "Girlfriend{name = " + name + ", age = " + age + "}";}
}

  • 自定义异常

自定义异常的步骤与方法:

①定义异常类,类名要见名知意

②要写继承关系:运行时异常继承于RuntimeException、编译时异常继承于Exception

③空参构造

④带参构造

意义:就是为了让控制台的报错信息更加的见名知意

Alt+Insert快捷键快速生成代码块。

上例中,我们可以自定义两个异常,分别用于姓名和年龄输入不符合要求时抛出:

姓名格式不符合要求的异常:

public class NameFormatException extends RuntimeException{//技巧://NameFormat:当前异常的名字,表示姓名格式化问题//Exception:表示当前类是一个异常类//运行时:RuntimeException核心就表示由于参数错误而导致的问题//编译时:Exception核心提醒程序员检查本地信息// Alt + Insert插入2个构造方法:空参和带参public NameFormatException() {}public NameFormatException(String message) {super(message);}
}

年龄输入不符合要求时的异常:

public class AgeOutOfBoundsException extends RuntimeException{public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message) {super(message);}
}

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

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

相关文章

CopyOnWriteArrayList怎么用

什么是CopyOnWriteArrayListCopyOnWriteArrayList常用方法CopyOnWriteArrayList源码详解CopyOnWriteArrayList使用注意点CopyOnWriteArrayList存在的性能问题CopyOnWriteArrayList 使用实例基本应用实例并发应用实例 拓展写时复制 什么是CopyOnWriteArrayList CopyOnWriteArra…

企业网络安全守护者:EventLog Analyzer日志审计系统

在当今数字时代&#xff0c;企业网络不仅仅是业务运营的核心&#xff0c;也成为各种潜在威胁的目标。为了保障企业的网络安全&#xff0c;日志审计系统成为了不可或缺的一环。其中&#xff0c;ManageEngine的EventLog Analyzer作为一款强大而全面的日志管理与审计解决方案&…

回顾Django的第六天

1.session的使用 1.1Cookie 客户端浏览器上的键值对----为了做会话保持 -怎么来的&#xff1f; 服务端写入的---》服务端再返回的响应头中写入---》浏览器会自动取出来--》存起来 -key value 形式--》过期时间---》path---》http only。。。 -只要浏览器中有cookie&…

【第三方】微信登录

目录 前言小程序登录步骤说明前端效果涉及到的接口登录凭证&#xff1a;wx.login获取用户信息&#xff1a;wx.getUserInfo 后端涉及到接口小程序登录 代码展示 微信扫码登录 前言 微信官方文档&#xff0c;需要对接哪个模块就从哪里进入。 由于本次我们需要的是小程序的登录。…

有趣的代码——有故事背景的程序设计3

这篇文章再和大家分享一些有“背景”的程序设计&#xff0c;希望能够让大家学到知识的同时&#xff0c;对编程学习更感兴趣&#xff0c;更能在这条路上坚定地走下去。 目录 1.幻方问题 2.用函数打印九九乘法表 3.鸡兔同笼问题 4.字数统计 5.简单选择排序 1.幻方问题 幻方又…

【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目

什么是UL9540测试&#xff0c;UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室&#xff08;Underwriters Laboratories&#xff09;发布的标准&#xff0c;名称为"UL 9540: Energy Storage Systems and Equipment"&#xff0c;翻译为中文为"能量存储…

【JavaWeb】前端工程化(VUE3)

前端工程化&#xff08;VUE3&#xff09; 文章目录 前端工程化&#xff08;VUE3&#xff09;一、概述二、ECMA6Script2.1 es6的变量和模板字符串2.2 es6的解构表达式2.3 es6的箭头函数2.4 rest和spread2.5 es6的对象创建和拷贝2.6 es6的模块化处理 三、前端工程化环境搭建3.1 N…

数据分析师的学习之路-pandas篇(7)

继续接上篇&#xff0c;这次学习下透视表、线性回归还有根据条件上颜色。 3.9 透视表 在excel里也经常用到透视表来构建想要的列的组合来形成一个新的表&#xff0c;在pandas里也能做。 举例数据是这样的&#xff1a; 是各种类产品的订单数据&#xff0c;现在想做一个透视表&…

按照官网文档 通过useExtendedLib扩展库 引入WeUI,报错 组件未定义 | 解决办法

检查开发者工具版本是否过老 参考博客 不要使用 游客模式&#xff0c;游客模式不支持&#xff0c;请注册Appid 使用。 注意 扩展库方式 和 npm 方式不能同时使用&#xff0c;会有相应报错

electron 应用图标修改

修改窗口图标 更换Electron应用程序的桌面图标 准备好你想要作为图标的图片文件&#xff0c;可以是PNG格式安装一个可以转换图片格式为ICO的工具&#xff0c;例如在线转换工具“在线转换icon图标工具”。将你的PNG图片文件上传并转换为ICO格式将转换得到的ICO文件放到你的El…

Haiku库和Jax库介绍

Haiku 是由DeepMind开发的一个深度学习库&#xff0c;它建立在JAX&#xff08;Just Another XLA&#xff0c;为Accelerated Linear Algebra的缩写&#xff09;之上。JAX 是一个由Google开发的数值计算库&#xff0c;专注于高性能数值计算和自动微分。 JAX 提供了强大的数值计算…

synxflow 安装环境

介绍&#xff1a; 该软件可以动态模拟洪水淹没&#xff0c;滑坡跳动和泥石流使用多个cuda支持的gpu。它还提供了一个用户友好但多功能的Python界面&#xff0c;可以完全集成到数据科学工作流程中&#xff0c;旨在简化和加速危害风险评估任务。 这个包我从网上找到的资源特别特…

GAN:WGAN-DIV

论文&#xff1a;https://arxiv.org/pdf/1712.01026.pdf 代码&#xff1a; 发表&#xff1a;2018 摘要 在计算机视觉的许多领域中&#xff0c;生成对抗性网络已经取得了巨大的成功&#xff0c;其中WGANs系列被认为是最先进的&#xff0c;主要是由于其理论贡献和竞争的定性表…

11、信息打点——红队工具篇FofaQuakeSuize水泽Arl灯塔

网络空间测绘引擎 Fofa Quake shodan Zoomeye 主要搜关联资产、特征资产、资产信息&#xff08;在测绘引擎上直接搜IP&#xff0c;它会显示所有与该域名有关的信息。&#xff09; fofa和Quake测绘引擎集成化工具&#xff1a;Finger 自动化信息收集项目 ARL灯塔 Suize水泽 …

洗地机好用吗?口碑好的洗地机有哪些?

自从洗地机开始引入市场以来&#xff0c;它一直受到人们的关注。它在解放家庭清洁劳动力和提供快速方便的清洁方面表现出色&#xff0c;超越了多年来传统的拖把清洁方式。越来越多的人选择使用洗地机来完成家庭清洁任务。如果你也对洗地机产生了浓厚的兴趣&#xff0c;并想购买…

在 AlmaLinux 9.2 上安装Oracle Database 23c

在 AlmaLinux 9.2 上安装Oracle Database 23c 1. 安装 Oracle Database 23c2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开机启动数据…

Linux环境执行命令python3 test.py传入字符串,test.py接收并处理字符串

可以使用Python脚本文件中的sys模块来接收并处理从Linux环境中传入的字符串命令。 下面是一个具体的示例&#xff1a; Linux环境中执行以下命令&#xff0c;传入字符串参数&#xff1a; python3 test.py "hello world"在test.py文件中&#xff0c;通过sys模块获取…

【面试】Java最新面试题资深开发-JVM第一弹

问题一&#xff1a;Java中的垃圾回收机制 在Java中&#xff0c;垃圾回收是如何工作的&#xff0c;可以简要描述一下垃圾回收的算法有哪些吗&#xff1f; 在Java中&#xff0c;垃圾回收是一种自动管理内存的机制&#xff0c;它负责识别不再被程序引用的对象并释放其占用的内存…

Linux(11):Linux 账号管理与 ACL 权限设定

Linux 的账号与群组 每个登入的使用者至少都会取得两个 ID&#xff0c;一个是使用者 ID(User ID &#xff0c;简称UID)、一个是群组ID (Group ID &#xff0c;简称GID)。 Linux系统上面的用户如果需要登入主机以取得 shell 的环境来工作时&#xff0c;他需要如何进行呢? 首先…

【Android】IntentService

Service 中的代码都是默认运行在主线程当中的&#xff0c;如果直接在Service 里处理一些耗时的逻辑&#xff0c;就很容易出现ANR(Application Not Responding )的情况。 所以&#xff0c;我们应该在Service 的每个具体的方法里开启一个子线程&#xff0c;然后在这里处理那些耗…