简单了解java中的异常

异常

1、异常的概述

1.1、概述

异常就是程序出现了不正常的情况,程序在执行过程中,数据导致程序不正常,最终导致JVM的非正常停止。语句错误不算在异常体系中。

1.2、异常的存在形式

异常有类型之分,比如我们比较熟悉的数组越界异常(ArrayIndexOutOfBoundsExceprion)空指针异常(NullPointerException)类型转换异常(ClassCastException)。当程序中产生异常时,其实就是在该异常的位置创建了一个该异常的对象,该对象携带了相关的异常信息因此,异常就是java中提供的类的对象

1.3、程序中出现异常,怎么处理

程序中一旦产生了异常,首先会首先会中断向下执行。异常的传递要根据处理方式而定,如果没有处理,默认是将异常传递给本方法调用者。不断往回传递,知道JVM收到异常信息,此时程序终止执行。

2、异常的体系

  • Error:严重问题,通过代码无法处理。
  • Exception:称之为异常类,它表示程序本身可以处理的问题
    • RuntimeException及其子类:运行时异常。(空指针异常、数组越界异常)
    • 非RuntimeException及其子类:编译时异常,编译时必须处理的,否则程序不能通过编译。(日期格式化异常)
      异常体系

3、虚拟机异常处理方式

JVM的默认处理方案:

如果程序中出现了问题,我们没有没有做任何处理,最终JVM会做默认处理,那么JVM是如何处理的嘞?

  • 把异常的类型、原因、位置打印在控制台
  • 程序停止运行

注意:程序中出现了异常,会在当前位置创建此异常的对象,对象中包含了异常的信息,并把此异常交给本方法的调用者处理。

4、手动处理异常-声明和抛出

4.1、声明异常——throws

格式:

修饰符 返回值类型 方法名(参数列表) throws 异常类型1, 异常类型2...{...}

示例:

public void show() throws NullPointerException, ArrayIndexOutOfBoundsException {...}

作用:

  • 表示告知调用者当前的方法可能会出现某些异常,使用时需要注意
  • 如果当前方法没有出现任何异常,那么代码会正常执行
  • 如果当前方法中出现了异常,会把异常交给本方法调用者处理

代码演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionDemo1 {public static void main(String[] args) throws ParseException {//自己处理demo1("糖锅");//demo2()方法中声明的异常,需要在main方法中处理掉,main方法继续向上抛出ParseException异常demo2();}//运行时异常:RuntimeException(父类)//子类:NullPointerExceptionpublic static void demo1(String name) throws NullPointerException {System.out.println(name.length());}//编译时异常:Exception(父类)//子类:ParseExceptionpublic static void demo2() throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//编译时异常,必须有异常处理代码(声明、捕获)Date date = simpleDateFormat.parse("2024-6-9");}
}

总结:

  • 编译时异常因为在编译时就会检查,所以必须要写在方法后面进行显式声明

  • 运行时异常因为在运行时才会发生,所以在方法后面可以不写

  • 如果声明多个异常有子父类关系,那么只需要声明一个父类即可(多态)

    什么意思嘞?

    就比如我们此时又创建了一个demo3方法,其参数是一个数组和一个字符串,在运行时可能发生数组越界,和空指针异常,此时我们声明异常IndexOutOfBoundsException和NullPointerException

    public static void demo3(int[] array, String str) throws IndexOutOfBoundsException, NullPointerException{System.out.println(array[999]);}
    

    这样写没有问题,但是这样看起来代码看起来很冗余,所以我们可以直接声明它们的父类RuntimeException即可

    public static void demo3(int[] array, String str) throws RuntimeException{System.out.println(array[999]);}
    

4.2、throw——抛出异常

格式:

修饰符 返回值类型 方法名(参数列表){throw new 异常类型();
}

注意:

  • 抛出异常的格式必须在方法内部完成
  • 如果手动抛出一个异常,下面的代码无法执行

示例:

抛出异常下代码不执行

抛出异常的意义所在:

  • 在方法中,但传递的参数有误时,没有继续运行下去的意义了,则采取抛出处理,表示让该方法结束运行。
  • 告诉调用者方法中出现的问题

throws和throw的区别:

throwsthrow
用在方法声明后,跟的是异常类名用在方法体内,跟的是异常对象
表示声明异常,调用该方法有可能出现这样的异常表示手动抛出异常对象,告知调用者数据传输有误
异常对象又JVM创建异常对象我们自己创建

4.3、捕获

4.3.1、捕获处理异常介绍:try,catch

之前的声明或者抛出都是将异常传递出去,让调用者知道异常信息。而捕获处理是本方法内部进行处理,能够阻止异常的传递,从而保证程序能够继续往下执行。

4.3.2、捕获异常的格式
try{//try中存放可能出现问题的代码//1、代码1...//2、代码2...//3、代码3...
}catch(){//4.处理异常方案//举例:打印异常,获取异常原因记录日志
}
//5、其他代码
4.3.3、捕获异常执行方式

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

从上往下一次执行,catch不执行

如果try中代码2遇到了问题,问题下面的代码还会执行吗?

不会执行了,会拿当前异常对象和异常类型匹配,匹配成功执行执行处理异常代码

如果出现的问题没有捕获,那么程序如何运行?

如果异常没有捕获到,虚拟机会帮助我们处理异常

同时有可能出现多个异常如何处理?

  • 多次捕获,多次处理
try{//异常1
}catch(异常1){}try{//异常2
}catch(异常2){}
...
  • 一次捕获,多次处理
try{//异常1//异常2...
}catch(异常1){//处理异常1
}catch(异常2){//处理异常2
}...
  • 一次捕获,一次处理
try{//异常1//异常2....
}catch(Exception e){}

示例:

定义一个demo方法可以将字符串时间转换为时间类型,简单捕获并处理可能出现的异常

import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionDemo3 {private static final Logger LOGGER = LoggerFactory.getLogger("ExceptionDemo3");public static void main(String[] args) {String bir = "2024-6-23";try {//监视可能发生异常的代码//调用的方法可能发生异常,自己处理Date resBir = demo(bir);System.out.println(resBir);} catch (ParseException e) {//拿异常对象类型和当前定义的异常类型进行匹配System.out.println("开始处理异常~");//在日志中记录日常LOGGER.error(e.getMessage());}System.out.println("程序继续执行");}public static Date demo(String demoBir) throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");return simpleDateFormat.parse(demoBir);}
}

以上只是一个简单的处理方式,还有其它处理方式,大家可以自行尝试。

小结:

异常处理方式有两种:声明、捕获,那么在程序开发中我们该如何选择呢?

  • 自定义方法(程序员自己定义的方法):通常都可以使用声明,因为这样做方法体内的代码会比较清爽(阅读性好),把异常统一抛出到main方法中,进行统一处理。

  • 捕获的使用场景:main方法中只能使用捕获,父亲型中的方法不支持throws,在子类重写方法时,重写的方法只能使用捕获。

5、Throwable类中常用的方法

Throwable的成员方法

方法名说明
public String getMessage ()返回此Throwable的详细消息字符串
public String toString ()返回此可抛出的简短描述
public void printStackTrace ()把异常的控制信息输出在控制台

以4.3.3中的示例来演示说明(在catch中添加如下代码)

  • getMessage
System.out.println(e.getMessage());

结果展示

Unparseable date: "2024-6-23"
  • toString
System.out.println(e.toString());

结果展示

java.text.ParseException: Unparseable 
  • printStackTrace
e.printStackTrace();

结果展示(方便程序员定位异常位置)

java.text.ParseException: Unparseable date: "2024-6-23"at java.text.DateFormat.parse(DateFormat.java:366)at com.tg.log.ExceptionDemo3.demo(ExceptionDemo3.java:38)at com.tg.log.ExceptionDemo3.main(ExceptionDemo3.java:20)

6、自定义异常

6.1、概述

当jdk中的异常类型,不满足实际的业务需要时。就可以自定义异常。比如,一个人的的年龄数据,如果是负数认为是不合法的,这就需要抛出异常,jdk中就没有表示年龄的异常,就需要我们自己定义异常了。

6.2、实现

public 自定义异常类 extends Exception{//当前自定义异常为:编译时异常public 自定义异常类(){super();//调用父类中的无参构造方法,可以省略不写}public 自定义异常类(String message){super(message);//不能省略}
}public 自定义异常类 extends RunTimeException{//当前自定义异常为:运行时异常public 自定义异常类(){super();//调用父类中的无参构造方法,可以省略不写}public 自定义异常类(String message){super(message);//不能省略}
}

示例:定义一个打印年龄的方法,年龄不能是负数

定义AgeOutOfBoundsException异常类

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

演示异常处理

public class ExceptionDemo4 {public static void main(String[] args) {int age = -1;try {printAge(age);}catch (AgeOutOfBoundsException e){System.out.println("处理年龄不合法异常");}}public static void printAge(int age){if(age < 0){throw new AgeOutOfBoundsException("年龄不能是负值!");}System.out.println("年龄:" + age);}
}

运行结果

处理年龄不合法异常

ok,说完啦,收工!

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

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

相关文章

Nginx服务配置

一、Nginx服务的主配置文件nginx.conf vim /usr/local/nginx/conf/nginx.conf 全局块&#xff1a;全局配置&#xff0c;对全局生效&#xff1b;events块&#xff1a;配置影响 Nginx 服务器与用户的网络连接&#xff1b;http块&#xff1a;配置代理&#xff0c;缓存&#xff0c…

C语言怎样初始化图形模式?

一、问题 在C语⾔中&#xff0c;initgraph( ) 函数⽤于初始化图形模式。初始化时&#xff0c;那么多参数都是⼲什么的&#xff1f;怎样设置&#xff1f; 二、解答 initgraph( ) 函数⽤于初始化图形模式&#xff0c;其语法格式如下。 void far initgraph(int far * gdriver, i…

Nginx学习笔记(十)如何配置HTTPS协议?(公网)

目录 一、简介二、SSL 证书类型介绍三、公网 SSL 证书3.1 证书管理工具3.2 下载安装 acme.sh3.3 申请并下载证书报错1&#xff1a;没有指定账号报错2&#xff1a;DNS无法解析的域名报错3&#xff1a;无效的响应 404 3.4 配置 Nginx3.5 证书过期刷新 四、补充4.1 同一域名的不同…

局域网测速

对于网管来说&#xff0c;企业局域网络的速度是知道的&#xff0c;因为网管清楚企业局域网络的拓扑结构、网络链路、网络设备以及实际到桌面的情况。 有时候即使千兆到桌面实际因为影响的因素多&#xff0c;实际的网络速度可能会打一定的折扣&#xff0c;那么就需要清楚实际的网…

【数学建模】微分方程的数值求解

微分方程的数值求解 一阶差分求解微分方程原理:四阶龙格-库塔方法应用:小船渡河问题: 进阶求二阶微分方程 一阶差分求解微分方程原理: d y d x f ( x n , y n ) \dfrac{dy}{dx}f(x_n,y_n) dxdy​f(xn​,yn​) y n 1 − y n x n 1 − x n f ( x n , y n ) \dfrac{y_{n1}-y_n…

VMware导入vmdk文件(亲测有效)

场景&#xff1a;从别的地方拷贝了一个系统镜像&#xff0c;实际测试案例是从vulnhub下载的Kioptix Level #4靶场解压缩以后的文件是【Kioptrix4_vmware.vmdk】后缀为名为vmdx,使用常规的方式【文件-----打开】的方式&#xff0c;不能导入虚拟机&#xff0c;现在演示如何导入到…

Java——类和对象

在Java中&#xff0c;类与对象是面向对象编程&#xff08;OOP&#xff09;的核心概念。那面向对象又是什么呢。 一、面向对象和面向过程 1、面向对象 面向对象&#xff08;Object-oriented&#xff09;是一种程序设计的方法和编程范式&#xff0c;它以对象作为程序的基本单位…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

品牌渠道健康发展的关键与方法

一个品牌的渠道健康与否对其长期发展至关重要。品牌虽多&#xff0c;但并非所有产品都能成为品牌&#xff0c;创建品牌需大量精力&#xff0c;而让品牌长久健康发展则需多方面努力。 力维网络服务众多知名品牌&#xff0c;总结出一些渠道治理方法供品牌参考。首先&#xff0c;管…

前端JS必用工具【js-tool-big-box】学习,获取当前浏览器向上滚动还是向下滚动,获取当前距离顶部和底部的距离

这一小节&#xff0c;我们说一下 js-tool-big-box 添加的最新工具方法&#xff0c;在日常前端开发工作中&#xff0c;如果网页很长&#xff0c;我们就需要获取当前浏览器是在向上滚动&#xff0c;还是向下滚动。如果向上滚动&#xff0c;滚动到0的时候呢&#xff0c;需要做一些…

【Mongodb】Mongodb亿级数据性能测试和压测

一&#xff0c;mongodb数据性能测试 如需转载&#xff0c;请标明出处&#xff1a;https://zhenghuisheng.blog.csdn.net/article/details/139505973 mongodb数据性能测试 一&#xff0c;mongodb数据性能测试1&#xff0c;mongodb数据库创建和索引设置2&#xff0c;线程池批量…

React+TS前台项目实战(六)-- 全局常用组件Button封装

文章目录 前言Button组件1. 功能分析2. 代码注释说明3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局按钮组件封装&#xff0c;可根据UI设计师要求自定义修改。 Button组件 1. 功能分析 &#xff08;1&#xff09;可以通过className属性自定义按钮样式&#xff0c;传递…

【计算机网络基础】OSI七层网络模型 TCPIP四层网络模型

文章目录 ISO介绍网络模型介绍OSI七层模型OSI七层模型介绍OSI七层特点一、TCP/IP四层模型介绍二、TCP/IP四层模型TCP/IP协议簇一次C/S通信 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分…

校验参数个数工具类

项目中有个需求&#xff1a;前后端参数一致性校验&#xff0c;在某业务场景下后端代码需要校验参数个数&#xff0c;因此设计了1个工具类方便大伙使用&#xff0c;特此简单记录下。 校验参数个数工具类 一、校验工具类CheckNumInsideParamters二、单元测试ParameterSizeTest三…

从零手写实现 nginx-17-nginx.conf 全局的默认配置

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

哪里有宣传海报制作模板?盘点可以套用的海报软件

不论是精心筹备的盛会、充满爱意的婚礼仪式&#xff0c;还是家庭聚会的温馨时光&#xff0c;一份设计精巧的邀请函都是主人诚挚邀请的最好证明。它不仅传递着邀请&#xff0c;更承载着对宾客的尊重与期待。但你知道在哪里可以找到那些让人眼前一亮的邀请函海报制作模板吗&#…

Simscape Multibody与RigidBodyTree:机器人建模

RigidBodyTree&#xff1a;主要用于表示机器人刚体结构的动力学模型&#xff0c;重点关注机器人的几何结构、质量和力矩&#xff0c;以及它们如何随时间变化。它通常用于计算机器人的运动和受力情况。Simscape Multibody&#xff1a;作为Simscape的一个子模块&#xff0c;专门用…

ICRA 2024:北京工业大学马楠教授联合中科原动力公司推出番茄采摘自主机器人AHPPEBot,实现32.46秒快速准确采摘

当前&#xff0c;农业生产正深受劳动力短缺困扰&#xff0c;这一现状对生产规模的进一步拓展构成了严重制约。为了突破这一瓶颈&#xff0c;实施自动化已成为提升农业生产力的关键途径&#xff0c;这也使得机器人采收技术备受关注。 现今的机器人采收系统普遍采用先进感知方法&…

Android面试题之说说系统的启动流程(总结)

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 启动流程 Boot Rom -> Boot Loader -> Kernel -> 启动Init进程 -> Zygote进程 -> system_server进程 -> 启动AMS、WMS、PMS…

linux 服务器上离线安装 node nvm

因为是离线环境 如果你是可以访问外网的 下面内容仅供参考 也可以继续按步骤来 node 安装路径 Node.js — Download Node.js nvm 安装路径 Tags nvm-sh/nvm GitHub 后来发现 nvm安装后 nvm use 版本号 报错 让我去nvm install 版本 我是内网环境 install不了 下面 你要 把安…