异常处理详解

异常概述

什么是异常?

异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。 比如:数组索引越界、空指针异常、 日期格式化异常,等。

为什么要学习异常?

异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止.

研究异常并且避免异常,然后提前处理异常,体现的是程序的安全, 健壮性。

问题体系

Error: 错误,系统级别问题、JVM退出等,代码无法控制。 

Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题.

         RuntimeException及其子类:运行时异常,编译阶段不会报错,运行时可能出现的错误,例如:空指针异常,数组索引越界异常。

        除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。 (日期格式化异常)。

编译时异常和运行时异常的区别

运行时异常

定义:直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。

示例:

数组索引越界异常: ArrayIndexOutOfBoundsException。

空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。

数学操作异常:ArithmeticException。

类型转换异常:ClassCastException。

数字转换异常: NumberFormatException。

运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误, 自己的水平有问题!

编译时异常

定义:

继承自Exception的异常或者其子类且不是RuntimeException或者其子类的异常,编译阶段就报错,必须处理,否则代码不通过。

示例:

编译时异常的作用是什么:

        是担心程序员的技术不行,在编译阶段就爆出一个错误, 目的在于提醒不要出错!

        编译时异常是可遇不可求。遇到了就遇到了呗。

异常的默认处理流程

/**目标:异常的产生默认的处理过程解析。(自动处理的过程!)(1)默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。(2)异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。(3)虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。(4)直接从当前执行的异常点干掉当前程序。(5)后续代码没有机会执行了,因为程序已经死亡。小结:异常一旦出现,会自动创建异常对象,最终抛出给虚拟机,虚拟机只要收到异常,就直接输出异常信息,干掉程序!!默认的异常处理机制并不好,一旦真的出现异常,程序立即死亡!*/
public class ExceptionDemo {public static void main(String[] args) {System.out.println("程序开始。。。。。。。。。。");chu(10, 0);System.out.println("程序结束。。。。。。。。。。");}public static void chu(int a , int b){System.out.println(a);System.out.println(b);int c = a / b;System.out.println(c);}
}

编译时异常的处理机制

三种:

出现异常直接抛出去给调用者,调用者也继续抛出去。  

出现异常自己捕获处理,不麻烦别人。  

前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。

异常处理方式1 —— throws

throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。

这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。

抛出异常格式:

方法 throws 异常1 ,异常2 ,异常3 ..{ }

规范做法:方法 throws Exception{ },代表可以抛出一切异常,因为只要发生其中一个异常,其他异常就不会发生。

异常处理方式2 —— try…catch…

监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。

格式:

   try{// 监视可能出现异常的代码!}catch(异常类型1 变量){// 处理异常}catch(异常类型2 变量){// 处理异常}...

建议格式: 

try{// 可能出现异常的代码!
}catch (Exception e){e.printStackTrace(); // 直接打印异常栈信息
}//Exception可以捕获处理一切异常类型!

异常处理方式3 —— 前两者结合

 方法直接将异常通过throws抛出去给调用者, 调用者收到异常后直接捕获处理。

运行时异常的处理机制

运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。

按照规范,建议还是处理:建议在最外层调用处集中捕获处理即可。 

异常处理的总结

1、在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。

2、实际应用中,只要代码能够编译通过,并且功能能完成,那么每一种异常处理方式似乎也都是可以的。

异常处理使代码更稳健的案例

需求  键盘录入一个合理的价格为止(必须是数值,值必须大于0)。

分析 定义一个死循环,让用户不断的输入价格。

public class Test2 {public static void main(String[] args) {Scanner sc  = new Scanner(System.in);while (true) {try {System.out.println("请您输入合法的价格:");String priceStr = sc.nextLine();// 转换成double类型的价格double price = Double.valueOf(priceStr);// 判断价格是否大于 0if(price > 0) {System.out.println("定价:" + price);break;}else {System.out.println("价格必须是正数~~~");}} catch (Exception e) {System.out.println("用户输入的数据有毛病,请您输入合法的数值,建议为正数~~");}}}
}

自定义异常

自定义异常的必要?Java无法为这个世界上全部的问题提供异常类。 如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了。

自定义异常的好处: 可以使用异常的机制管理业务问题,如提醒程序员注意。 同时一旦出现bug,可以用异常的形式清晰的指出出错的地方。

分类

1、自定义编译时异常        

定义一个异常类继承Exception.  

重写构造器。  

在出现异常的地方用throw new 自定义对象抛出,

作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!

2、自定义运行时异常

定义一个异常类继承RuntimeException.

重写构造器。

在出现异常的地方用throw new 自定义对象抛出!

作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!

示例

public class ExceptionDemo {public static void main(String[] args) {
//        try {
//            checkAge(-34);
//        } catch (ItheimaAgeIlleagalException e) {
//            e.printStackTrace();
//        }try {checkAge2(-23);} catch (Exception e) {e.printStackTrace();}}public static void checkAge2(int age)  {if(age < 0 || age > 200){// 抛出去一个异常对象给调用者// throw :在方法内部直接创建一个异常对象,并从此点抛出// throws : 用在方法申明上的,抛出方法内部的异常throw new ItheimaAgeIlleagalRuntimeException(age + " is illeagal!");}else {System.out.println("年龄合法:推荐商品给其购买~~");}}public static void checkAge(int age) throws ItheimaAgeIlleagalException {if(age < 0 || age > 200){// 抛出去一个异常对象给调用者// throw :在方法内部直接创建一个异常对象,并从此点抛出// throws : 用在方法申明上的,抛出方法内部的异常throw new ItheimaAgeIlleagalException(age + " is illeagal!");}else {System.out.println("年龄合法:推荐商品给其购买~~");}}
}
public class ItheimaAgeIlleagalException extends Exception{public ItheimaAgeIlleagalException() {}public ItheimaAgeIlleagalException(String message) {super(message);}
}

 

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

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

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

相关文章

.9.png编译报错

android项目中使用9-patch图编译报错&#xff1a;AAPT: error: file failed to compile. 原因是因为.9.png图中有线之间断开或者黑点的存在&#xff0c;把线连上或者把黑点去掉就可以了。如下&#xff1a;

2024 年 SEO 现状

搜索引擎优化&#xff08;SEO&#xff09;一直以来都是网络知名度和成功的基石。随着我们踏上 2024 年的征程&#xff0c;SEO领域正在经历重大变革&#xff0c;有些变革已经开始&#xff0c;这对企业、创作者和营销人员来说既是挑战也是机遇。 语音搜索 语音搜索曾是一个未来…

Python爬取酷我音乐

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

用23种设计模式打造一个cocos creator的游戏框架----(十三)模板方法模式

1、模式标准 模式名称&#xff1a;模板方法模式 模式分类&#xff1a;行为型 模式意图&#xff1a;定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构图&#xff1a…

BigData之Google Hadoop中间件安装

前言 Hadoop / Zookeeper / Hbase 因资源有限 这三个都是安装在同一台Centos7.9的机器上 但通过配置 所以在逻辑上是distributed模式 1 Java安装 1.1 下载java11 tar/opt/java/jdk-11.0.5/ 1.2 环境配置修改 文件/etc/profile export JAVA_HOME/opt/java/jdk-11.0.5/ e…

【复现】vid2vid_zero

问题及解决方法总结。 code&#xff1a;GitHub - baaivision/vid2vid-zero: Zero-Shot Video Editing Using Off-The-Shelf Image Diffusion Models 1.AttributeError: UNet2DConditionModel object has no attribute encoder 据说是预训练模型结构不匹配&#xff0c;偷懒把a…

java工程(ajax/axios/postman)向请求头中添加消息

1、问题概述 在项目中我们经常会遇到需要向请求头中添加消息的场景&#xff0c;然后后端通过request.getRequest()或者RequestHeader获取请求头中的消息。 下面提供几种前端向请求头添加消息的方式 2、创建一个springmvc工程用于测试 2.1、创建工程并引入相关包信息 sprin…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展&#xff0c;众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说&#xff0c;选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大&#xff0c;云服务…

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问&#xff1f;docker容器Post…

arm-linux设备fsck命令移植

arm-linux设备fsck命令移植 文章目录 **arm-linux设备fsck命令移植**1、下载e2fsprogs-源码2、解压3、进入源码目录4、配置编译环境&#xff1a;使用以下命令配置交叉编译环境5、测试 1、下载e2fsprogs-源码 首先要确定自己的文件系统格式&#xff0c;IG2000的文件系统是ext4&…

【银行测试】第三方支付功能测试点+贷款常问面试题(详细)

前言 1、第三方支付功能测试点 支付流程&#xff1a; 我们在测试一个功能时&#xff0c;需要先了解一下这个逻辑&#xff0c;而订单支付逻辑普遍都会有以下内容&#xff1a; 1&#xff09;创建本地唯一订单号&#xff1b; 2&#xff09;去调用支付&#xff0c;在支付平台生…

kubeadm搭建单master多node的k8s集群--小白文,图文教程

参考文献 K8S基础知识与集群搭建 kubeadm搭建单master多node的k8s集群—主要参考这个博客&#xff0c;但是有坑&#xff0c;故贴出我自己的过程&#xff0c;坑会少很多 注意&#xff1a; 集群配置是&#xff1a;一台master&#xff1a;zabbixagent-k8smaster&#xff0c;两台…

pycharm手动安装包

1.下载对应的包 TTS PyPI 2.手动解压&#xff0c;找到文件放到pycharm对应项目的lib文件夹中 以TTS包为例&#xff0c;找到下载并解压的包中的2个文件&#xff0c;一个名称一个info结尾 3.放到项目的lib文件夹中 eg&#xff1a;路径&#xff1b;C:\doc\myProject\speaker\venv…

离散型随机变量的分布律(也称概率质量函数:probability mass function, PMF)

设是一个离散型随机变量&#xff0c;可能的取值为&#xff0c;取各个值的概率记为&#xff1a; &#xff08;1&#xff09; 其中 并且&#xff0c; 公式&#xff08;1&#xff09;就称为离散型随机变量的分布律&#xff0c;也称概率质量函数&#xff1a;probability ma…

【漏洞修复】Cisco IOS XE软件Web UI权限提升漏洞及修复方法

关于Cisco IOS XE软件Web UI权限提升漏洞及修复方法 文章目录 漏洞基本信息漏洞影响范围确认设备是否受影响漏洞修复方法推荐阅读 漏洞基本信息 Cisco IOS XE Unauthenticatd Remote Command Execution (CVE-2023-20198) (Direct Check) Severity:Critical Vulnerability Pri…

react中img引入本地图片的方式

在html文件中&#xff0c;可以直接<img src./roadBook.png /> 但是在jsx文件中&#xff0c;不支持这种写法 必须这样写 在css样式中 App.css .img{background: url(./img/roadBook.png) }App.js import ./App.css;<div classNameimg></div> 1.基于es6Mod…

Zabbix自定义飞书webhook告警媒介1

说明&#xff1a;此配置仅适用于7版本及以上&#xff0c;低版本可能有问题 JavaScript 内容如下&#xff1a; try {var sourceData JSON.parse(value),req new HttpRequest(),response;if (sourceData.HTTPProxy) {req.setProxy(sourceData.HTTPProxy);}req.addHeader(Conte…

IDEA中的Postman!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

Python基础期末复习 新手 2

虽然age 10在__init__方法中定义了一个局部变量age&#xff0c;但这个局部变量并不会影响类属性age的值。类属性是在类级别上定义的&#xff0c;不属于任何一个实例。因此&#xff0c;在创建实例s1和s2时&#xff0c;它们的age属性值都为类属性的初始值0。 尽管对类的属性值进…