异常 --java学习笔记

异常

  • 异常就是代表程序出现的问题

        当一个方法出现问题,这个方法内部就会把这个问题的信息封装成一个异常对象,然后把这个异常对象抛给jvm虚拟机,jvm收到之后会先把出问题的程序先停下来,然后再把这个异常对象打印出来,里面会包含该问题的很多信息        

例:

异常的体系

Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来。说白了,Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它

Exception:叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的孩子来封装程序出现的问题

  • 运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)
  • 编译时异常:编译阶段就会出现错误提醒的。(如:日期解析异常)

运行时异常:

刚才举出的例子就是运行时异常:

还有典型的数组越界异常:

编译时异常:

当你写代码时就会通过报错强制提醒你这个方法很容易出问题,提醒你最好认真检查一下~如果不检查不处理,程序将会报错。可以通过try  catch捕获可能出现的异常抛出去,也可以通过throws把异常抛给上一层(jvm虚拟机)处理,当然jvm也不知道怎么处理你的问题,只是帮你去用rty catch去环绕问题代码

try catch 捕获异常:

throws抛出异常:

自定义异常

  • Java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。

自定义异常的种类:

自定义运行时异常

自定义异常继承类:

public class AgeIllegalRuntimeException extends RuntimeException{   //运行时异常必须继承自RuntimeExceptionpublic AgeIllegalRuntimeException() {}public AgeIllegalRuntimeException(String message) {super(message);}
}

test:

public class 自定义异常 {public static void main(String[] args) {try {   //用try catch捕获异常SetAge(151);    //非法值System.out.println("底层执行成功!");} catch (Exception e) {e.printStackTrace();System.out.println("底层出现bug!");}}private static void SetAge(int age) {if(age >= 0 && age <= 150){System.out.println("年龄设置成功");}else{  //触发else说明age的值有问题不合法//用一个异常对象封装这个问题//用throw抛出去throw new AgeIllegalRuntimeException("年龄异常,年龄为非法值(Age is illegal, your age is):"+age);  }           }
}

运行结果:

自定义编译时异常

public class AgeIllegalException extends Exception{      //编译时异常必须继承自Exceptionpublic AgeIllegalException() {}public AgeIllegalException(String message) {super(message);}
}

test:

public class 自定义异常 {public static void main(String[] args) {try {   //用try catch捕获异常或抛出异常,否则直接报错SetAge(151);    //非法值System.out.println("底层执行成功!");} catch (Exception e) {e.printStackTrace();System.out.println("底层出现bug!");}}private static void SetAge(int age) throws AgeIllegalException{if(age >= 0 && age <= 150){System.out.println("年龄设置成功");}else{  //触发else说明age的值有问题不合法//用一个异常对象封装这个问题//用throw抛出去//用throws用在方法上,抛出这个方法内部出现的异常throw new AgeIllegalException("年龄异常,年龄为非法值(Age is illegal, your age is):"+age);}}
}

运行结果:

总结:自定义运行时异常和自定义编译时异常用法是非常相似的,不过在效果上自定义编译时异常会在编译时就提醒你处理

异常有什么作用?

  1. 异常是用来查询系统Bug的关键参考信息
  2. 异常可以作为方法内部的一种特殊返回值,以便通知上层调用者底层的执行情况

开发中关于异常的常见处理方式

1、捕获异常,记录异常并响应合适的信息给用户

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExceptionTest2 {public static void main(String[] args) throws ParseException{try {   //调用者捕获异常test1();} catch (Exception e) { //记录异常并响应合适的信息给用户System.out.println("您当前的操作有问题");e.printStackTrace();}}//直接抛Exception就行了,不用抛具体异常private static void test1() throws Exception{   //异常,抛给调用者SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse("2021-07-07 23:23:20");System.out.println(d);test2();}private static void test2() throws Exception{   //异常,抛给调用者SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse("2021-07-07 23:23");System.out.println(d);}
}

运行结果:

2、捕获异常,"尝试重新修复

import java.text.ParseException;
import java.util.Scanner;public class ExceptionTest3 {public static void main(String[] args) throws ParseException {while (true) {  //循环围住,直到成功执行try {System.out.println(getMoney());break;} catch (Exception e) {System.out.println("请输入数字!");}}}private static double getMoney() {Scanner sc = new Scanner(System.in);while (true) {  //循环围住,直到输入合适的价格或者非法价格(往上层抛异常)System.out.print("请输入合适的价格:");double money = sc.nextDouble(); //假如输入非double型就会往上抛异常if(money >= 0){return money;}else{System.out.println("您输入的价格不合适吧");}}}
}

运行结果:

可以大大增加程序的健壮性

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

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

相关文章

python之jsonpath的使用

文章目录 介绍安装语法语法规则举例说明 在 python 中使用获取所有结构所有子节点的作者获取所有子孙节点获取所有价格取出第三本书的所有信息取出价格大于70块的所有书本从mongodb 中取数据的示例 介绍 JSONPath能在复杂的JSON数据中 查找和提取所需的信息&#xff0c;它是一…

JavaMySQL高级一(下)

目录 1.常用函数 1.字符串函数 2.时间日期函数 3.聚合函数 4.数学函数 2.分布查询 3.子查询基础 1.简单子查询 1.常用函数 在程序开发过程中&#xff0c;除了简单的数据查询&#xff0c;还有基于已数据进行数据的统计分析计算等需求。因此&#xff0c;在SQL中将一…

电感回路中的电阻突然变大会怎样

大家好&#xff0c;我是砖一。 我们经常会看到这样一个电路&#xff0c;电感和电阻搭配在一块&#xff0c;加上5v供电&#xff0c;如果电感回路中的电阻突然变大会怎样&#xff1f; 假设电感L1100uH&#xff0c;电阻R110Ω。 图1 串入电感图 1&#xff0c;由开关状态分析电路…

【C语言】基本语法知识C语言函数操作符详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.基本语法 1.1 代码解释 1.1.1 main()主函数 1.1.2 int 1.1.3 { } 1.1.4 printf()库函数 1.1.5 stdio.h头文件 1.2 C语言的…

#LT8713SX适用于Type-C/DP1.4转三路Type-C/DP1.4/HDMI2.0应用方案,分辨率高达4K60HZ,支持SST/MST功能。

1. 描述 LT8713SX是一款高性能Type-C/DP1.4转Type-C/DP1.4/HD-DVI2.0转换器&#xff0c;具有三个可配置的DP1.4/HD-DVI2.0/DP输出接口和音频输出接口。LT8713SX 支持 DisplayPort™ 单流传输 &#xff08;SST&#xff09; 模式和多流传输 &#xff08;MST&#xff09; 模式。当…

韵达国际邀您参观2024杭州快递物流供应链与技术装备展览会

2024年7月8-10日 | 杭州国际博览中心 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 展会介绍 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09;&#xff0c;于2024年7月8-10日在杭州国际博览中心召开&#…

LeetCode每日一题【206. 反转链表】

思路&#xff1a;双指针&#xff0c;一前一后&#xff0c;逐个把指向后面的指针指向前面。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), ne…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh &#x1f373;食用&#x1f959;子物体独立生成CubeMesh&#x1f96a;合并成一个CubeMesh&#x1f32d;Demo &#x1f373;食用 下载并导入插件&#x1f448;即可在代码中调用。 &#x1f959;子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

109 项目整合 spring-quartz 启动自动执行定时任务

前言 项目中使用了 quartz 来支持定时任务的相关基础支撑, 但是 最近添加了一个 资源消耗比较高的定时任务, 发布到测试环境之后, 发现服务突然 起不起来了[资源比较有限] 然后 查看了一下日志, 这个定时任务怎么在执行?, 不是 配置的是 凌晨两点么, 然后 仔细一看 几乎配置…

jscpd检测代码的重复率

官方文档&#xff1a;jscpd jscpd 是一个开源的代码重复检测工具&#xff0c;它用于查找代码中的重复部分并生成相应的报告 1、比较两个目录之间的差异 yarn jscpd --skipLocal sre/test1/** sre/test2 --reporters html生成报告文档在 ./report/html 下面&#xff0c;可以打开…

linux下用docker安装mysql及导入文件

目录 1. 非root用户设置docker权限2. user账号安装mysql2. root账号打开防火墙3. 启动mysql容器3.1 在指定工作目录下建立文件夹3.2 配置文件3.3 开启mysql容器 4. 进入容器4.1 通过容器进入mysql4.1 设置账号4.2 建立数据库4.3 导入文件 5. windows连接数据库参考文件 1. 非ro…

水泥领域智慧工厂物联网解决方案

水泥领域智慧工厂物联网解决方案 在水泥生产行业中&#xff0c;构建智慧工厂物联网解决方案已经成为推动产业升级、实现智能制造的关键路径。该方案深度融合了先进的信息技术与传统的水泥生产工艺&#xff0c;通过全面感知、可靠传输、智能处理等环节&#xff0c;实现了对整个…

MySql实战--深入浅出索引(上)

提到数据库索引&#xff0c;我想你并不陌生&#xff0c;在日常工作中会经常接触到。比如某一个SQL查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&#xff0c;索引又是如何工作的呢&#xff1f;今天就…

oracle设置主键自增步骤

设置主键自增步骤&#xff1a; 每一张表都要设置序列&#xff0c;然后设置触发器。比mysql繁琐。 一、设置序列 选中表后&#xff0c;—》 文件—》新建—》其他—》序列. 设置如下四个值即可。 crtls保存。 给序列起个名字&#xff0c;一定要全大写字母。 二、设置触发器…

如何设置IDEA远程连接服务器开发环境并结合cpolar实现ssh远程开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

Pudgy Penguins交易量一路攀升 多次创下历史新高

日前&#xff0c;一个名为胖企鹅&#xff08;Pudgy Penguins&#xff09; NFT 项目交易量持续攀升&#xff0c;一度在3月9日成为NFT市场的“销冠”。事实上&#xff0c;从2023年下半年开始&#xff0c;Pudgy Penguins的地板价就在不断上升&#xff0c;进入2024年更是多次创下历…

算法打卡day11

今日任务&#xff1a; 1&#xff09;239. 滑动窗口最大值 2&#xff09;347.前 K 个高频元素 239. 滑动窗口最大值 题目链接&#xff1a;239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移…

TouchGFX之性能测量

TouchGFX Core开放了几个信号&#xff0c;可用于测量性能。 当这些信号在内部触发时&#xff0c;用户可在应用程序中同步触发单个GPIO&#xff0c;从而实现“渲染时间”和其他有用信号的可视化。 信号在GPIO.hpp中定义 /* 用于操作GPIO的接口类&#xff0c;以便在目标硬件上进…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速&#xff0c;停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息&#xff0c;帮助用户快速找到空闲车位&#xff0c;提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…