Java 异常 随机数 包装类

异常,随机数,包装类,日期类

正如 “人无完人”一样,程序也不是完美的,它总会存在这样那样的问题,而有些问题并不是能够通过程序员开发更好的代码来解决的,如果我们忽视它,可能就会造成程序的终止,甚至是系统的崩溃。因此,我们需要想办法来合理的解决它,这就是Java中异常的由来。

异常

  • 异常的定义:是指在程序运行的过程中出现的非正常的情况,最终可能导致JVM的终止,异常本身是一个类,产生异常就是创建了异常对象并抛出一个异常对象.
  • 误区: 异常并不是语法错误,语法错误会直接导致程序无法编译成功,不会产生.class文件,而异常是在程序运行时发生的.

异常的分类

在java中,异常被当成一个对象来看待,其根类是java.lang.Throwable ,Throwable类又分为ErrorException

  1. Error:不能处理的异常,这是系统内部异常,运行时报错,属于系统问题.一般发生Error异常,JVM会选择终止程序,开发人员需提前避免该异常
  2. Exception:可以处理的异常,这是比较常见的异常,开发人员可以根据java中异常得类来处理.

Error

  • 对于严重的Error,没有办法处理,只能做到提起规避.常见的Error有:(栈溢出错误)和(内存溢出错误)。
  • Java中堆是用来存储对象实例的,因此如果我们不断地创建对象, 并且对象没有被垃圾回收, 那么当创建的对象过多时, 会导致内存不足, 进而引发 异常。

Exception

我们一般说的异常都是指的是Exception异常,这种异常一旦出现我们就要堆代码进行更正修复程序.

  • 根据编译时期还是运行时期可以将异常分为一下两类

编译时异常(checked Exception)

  • 即在编译时期就会检查程序是否有的异常,如何没有处理异常,则会编译失败,如文件无法找到等异常,异常对于编译时异常我们必须处理否则无法编译通过.

运行时异常(runtime Exception)

  • 即在运行时就对程序检查的异常,在编译时期运行异常不会被编译器检测(开发工具不会提示,只有运行时才会报的异常),如空指针异常,类型转化异常,数字操作异常.
public class Test01 {public static void main(String[] args)  {//FileInputStream inputStream = new FileInputStream("java笔记.txt");//会报编译时异常String str=null;System.out.println(str.length());//运行时异常->空指针异常Object o = new Object();String s=(String) o;//运行时异常->类型转换异常int i=10/0;//运行时异常->数字操作异常}
}

异常的传递

在java程序try 语块中抛出一个异常,若这个异常没有被catch语句块捕获,这个异常会沿着调用栈向上传递,直到它被某个catch 语句捕获,或者若直到到达程序顶层(main方法或程序入口)仍没有被捕获,那么程序就会终止,并打印出异常堆栈的信息.该过程就是异常传递

异常的处理

异常的处理有三种,throw(抛出),throws(声明,向上抛),try-catch(捕获)代码块

throw

java程序出现异常时会创建一个异常对象,该对象将会被提交到java运行系统,并将控制权转移给能够处理该异常的代码,这个过程被称为抛出→抛出一个异常对象

  • 自动生成:程序运行时,JVM检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应的异常类的实例对象并抛出,即自动抛出
  • 手动生成: Expectation expectaion=new Expectation(); 这样创建的异常对象若不抛出则对程序没有任何影响,即和创建一个普通对象一样,但是一旦抛出,就会对程序运行产生影响,会导致程序终止.
//自动抛出异常例子
public class Test01 {public static void main(String[] args)  {int arr[]={1,2,3,4};int index=4;//我们写相应的异常处理程序代码,由虚拟机自动检测创建异常对象自动抛出。System.out.println(getElements(arr, index));}public  static int getElements(int arr[],int index){return arr[index];//下标越界之后JVM会自动识别异常并创建一个异常对象并抛出}
}
//手动抛出异常
public class Test01 {public static void main(String[] args)  {int arr[]={1,2,3,4};int index=4;System.out.println(getElements(arr, index));}public  static int getElements(int arr[],int index){if (arr==null) throw new NullPointerException("数组为空");//手动抛出异常if(index<0||index>arr.length-1) throw new IndexOutOfBoundsException("下标越界");return arr[index];}
}

throws

throw 不同相同的是,throws,只是在可能出现异常的方法声明异常,throws不会抛出一个异常对象,作用的对象是方法

  • 不处理异常:try-catch 不同,throws 并不会在方法内部处理异常,只是声明告诉调用者”该方法可能会抛出这些异常,你需要处理它”若调用者不处理可接着throws 接着甩锅
  • 向上传递:若一个地方使用了throws 声明了可能会抛出的异常,但方法内部没有将其捕获,那么这些异常会向上传递到调用该方法的代码中.
  • 受检查异常与非受检查异常:
public class Test01 {public static void main(String[] args) //在主函数也可以向上抛出FileNotFoundException{//调用该方法时会报错,以为getFile的异常被抛到调用其方法的代码getFile();}public  static void getFile () throws FileNotFoundException//向上抛出异常,但不处理,交给调用者处理{FileInputStream inputStream = new FileInputStream("java开发");}
}

try-catch

try-catch 的核心思想是将程序中可能会出现异常的代码块(try块)与处理异常代码(catch块)分离,从而提高程序处理异常的能力

  • 异常捕获:try 块中包含了可能抛出异常的代码.当执行这些代码发生异常,java会立即停止try块中的剩余代码,创建一个异常对象并抛出,并查找与之匹配的catch块.
  • 异常处理:catch 用于处理try块中
public class Test02 {public static void main(String[] args) {int result;try{result=10/0; //此时有除0异常System.out.println("result:" + result);//若没有异常此语句将会被执行}catch (ArithmeticException e){System.err.println("An arithmeticException happened here"+e.getMessage());}System.out.println("try-catch语句之后保持顺序执行");}
}

finally

finally是java异常处理中一个重要的部分,它与try语句和catch语句共同使用,以确保无论是否发生异常,某些代码都是能运行的 ,即finally块用于包含那些无论是否发生异常都必须执行的代码

执行时机

  • 正常完成:如果try 块中的代码正常运行,没有发生异常,则finally块在try块之后运行
  • 异常发生:如果try块中的的代码抛出异常,并且这个异常被相应的catch块捕获(或者没有被catch捕获但异常被传递出去),则finally块会在catch块之后执行,或者是在try块之后异常传递之前执行
  • Return:若在try块和catch块中带有return关键字,则finally块会在return之前执行,但finally块不会改变return的返回值,除非finally块中也包含return语句,则返回finally块中的值
public class Test01 {public static void main(String[] args)throws {getFile();}public  static void getFile () {try {//可能会找不到文件FileInputStream inputStream = new FileInputStream("java开发");}catch (FileNotFoundException e){//若找不到文件者抛出notFound异常System.out.println(e.getMessage());}finally { //无论如何都会执行关闭文件语句System.out.println("关闭文件");}}
}

自定义异常

通过继承java中Exception类或其他子类(如RuntimeException)来创建异常类,该方式可以让开发者自定义特定的错误异常,可以更灵活和准确处理程序中的错误异常

自定义异常的创建

  1. 确定基类(父类)
  • 自定义异常应该继承相应的Exception或其子类,如希望检验受检异常则应该继承Exception,如果希望运行时异常,则应该继承RuntimeException 因此在每次自定义异常时要准确的继承相应基类
  1. 编写自定义异常类
  • 可以创建一个新的类,并使其继承所选择的异常父类
  • 可添加自定义属性和方法
  • 可重写相应的的toString() getMessage()方法
public class LessThan0Exception extends RuntimeException{
//自定义一个异常类LessThan0Exception 继承了RuntimeException类public LessThan0Exception() { //无参构造方法super("该数为负数!");//调用父类抛出信息方法}
}public static void main(String[] args) {int age=-10;//主函数中if(age<10){  //若age为负数则会抛出自定义异常throw new LessThan0Exception();}}

随机数

随机数在日常开发中也是十分常见的,例如抽奖,随机点名等等,所有随机数都是Random类的使用

基本用法

 public static void main(String[] args) {Random random = new Random();//实例化一个random对象System.out.println(random.nextInt());//随机产生一个int类型的数System.out.println(random.nextInt(10));//随机产生一个[0,10)的数System.out.println(random.nextDouble());//随机产生一个双精度的浮点数System.out.println(random.nextDouble(10));//随机产生一个[0,9)的浮点数}

日期类

在开发工作中日期类也是十分常见的

Date

作为一个最基础的日期类,是我们学习的必要

  public static void main(String[] args) {Date date = new Date();//Date重写了toString()方法System.out.println(date);//以美国国家习惯打印出该天的日期格式符System.out.println(date.getTime());//打印从1970.01.01到目前为止的毫秒数}

日历类

 public static void main(String[] args) {Calendar calendar = Calendar.getInstance();//获取日历类对象System.out.println(calendar.get(Calendar.YEAR));//获取当前年份System.out.println((calendar.get(Calendar.MONTH) + 1));//获取当前月份//由于java月份范围是[0,11] 因此要加上一个1System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//显示今天是该月的第几天System.out.println(calendar.get(Calendar.HOUR));//获取当前小时数(12进制)System.out.println(calendar.get(Calendar.HOUR_OF_DAY));//获取当前小时(24进制)System.out.println(calendar.get(Calendar.MINUTE));//获取分钟数System.out.println(calendar.get(Calendar.SECOND));//获取秒数System.out.println(calendar.get(Calendar.MILLISECOND));//获取毫秒数System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//获取该填是该年的第几天System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//获取该天是该周的第几天即 星期几calendar.set(Calendar.MONTH,6);//设置当前月份为6月System.out.println(calendar.get(Calendar.MONTH));calendar.add(Calendar.YEAR,1);//add(),将y,m,d或加上一定的数System.out.println(calendar.get(Calendar.YEAR));calendar.getTime();}

SimpleDataFormat

该类是用于格式化和解析日期的具体类,允许进行格式化(日期→文本),解析(文本→日期)和规范化

  • 构造方法:SimpleDataFormat(String pattern) 指定日期格式 其中y:年,MM:月,dd日 HH:小时,mm:分钟,ss秒;例如”yyyy-MM-dd HH:mm:ss” 则表示为 2024-07-03 22:42:15
  • 日期格式化:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//将当前的日期格式化为yyyy-MM-dd HH:mm:ssString date=simpleDateFormat.format(new Date());//传入一个Date类型的参数System.out.println(date);结果为:2024-07-03 23:26:58
  • 日期解析:在日期解析中会用到SimpleDateFormat类中的Parse函数,其主要的作用是数据类型的转换(包括将字符串转化为程序所需的类型,int,float,date,time等等),复杂数据结构的生成(主要包括引用数据类型,数组,列表,等等),
String dateString="2000-01-01 12:00:00";try{   //可能会出现解析错误异常因此要做好异常处理Date date1 = simpleDateFormat.parse(dateString);System.out.println(date1);}catch (ParseException e){  //当出现解析错误异常则向控制台打印出相应的错误e.printStackTrace();}结果为:Sat Jan 01 12:00:00 CST 2000

包装类

包装类,是基本数据类型的封装形式,它允许将基本数据类型当作对象来处理,从而可以调用相应的方法.

基本数据类型与包装类对应关系

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

包装类的作用

  • 提供对象化的方法:包装类提供了一系列的方法,允许对基本数据类型进行跟复杂的操作,如类型转化,解析字符串等等
  • 自动装箱与拆箱:允许包装类与基本数据类型可以相互转化,简化了编程工作

自动装箱与拆箱

自动装箱

自动装箱指的是java编译器在编译阶段自动将基本数据类型转化为包装类,该过程是透明的,无需手动编写代码

         int num=10;Integer integer = num; //相当于Integer integer= Integer.valueof(num);System.out.println(integer);

解释:num是基本数据类型int,integer是一个Integer类型变量,当把num的值赋给integer时,编译器会自动执行装箱操作,将int类型的num转化为Integer类型

底层实现原理

  • 自动装箱实际是调用包装类valueOf() 方法实现的,编译器会自动将装箱操作转化为对valueOf()方法的调用,例如上述例子就是自动调用了
Integer integer=Integer.valueOf(num);
  • 注意!!

每次JVM执行时,对于Integer,Short,Byte,Character,Boolean 会自动缓存-128到127之间的整数(Byte,Short)以及字符值和布尔值.这意味着在给范围内的装箱操作会返回缓存中的对象引用,而不是新创建对象

自动拆箱

自动拆箱是装箱的逆过程,指的是在编译阶段自动将包装类转化为基本数据类型的过程,该操作也是透明的,无需手写转化代码

  Integer integer=10;int i=integer;// int num=integer.intValue(i);System.out.println(i);

解释:num是基本数据类型int,integer是一个Integer类型变量,当把num的值赋给integer时,编译器会自动执行拆箱操作,将Integer类型的num转化为int类型

底层实现原理

自动拆箱的过程实际上是调用了包装类中的xxxValue()方法(如 doubleValue(),intValue()),编译器会自动将拆箱操作转化为相对应的xxxValue() 操作,上述例子实际被编译器转为

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

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

相关文章

DataWhale暑期夏令营第一期——大模型技术方向task2笔记

Task 2 笔记 数据分析 可以先通过对标签中各个项进行数据分析(使用values_count方法),可以得到主要任务的各个指标的值分布情况。 我认为这一步的作用:帮助理解数据。 大模型的本质还是概率生成,通过prompt提示词去进行生成Baseline优化思路 1.数据处理角色合并:将同一个…

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统,后台管理页面兼容所有主流浏览器,完全响应式布局(支持电脑、平板、手机等所有主流设备),可切换至 Blazor 多 Tabs 模式,权限控制细化到网页内任意元素(按钮、表格、文本框等等):Boots…

03-立即执行函数

JS中的立即执行函数01 立即执行函数的定义 立即执行函数有自己的作用域,因此可以防止全局变量之间的污染02 应用场景 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible…

初体验Sonar10.6 之 从部署到实战

Sonar介绍及下载 Sonar是一个代码质量管理的开源平台,用于管理源代码的质量。 SonarLint IDE插件安装 https://plugins.jetbrains.com/plugin/7973-sonarlint https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarlint-vscode sonar scanner下载地址 http…

charles使用

一,下载 去官网下载charles,如果有破解版的更好,不用花钱,但是一般也有30天试用期 二,安装 按照步骤安装即可 三,使用 1,首先,安装本地证书。按照指引一步一步安装。(注意:保存的时候最好放到受信任的证书目录中)2,安装移动端证书:它会告诉你ip和port。 首先你需要…

算法金 | 致敬深度学习三巨头:不愧是腾讯,LeNet问的巨细。。。

​大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」抱个拳,送个礼 读者参加面试,竟然在 LeNet 这个基础算法上被吊打~ LeNet 确实经典,值得好好说道说道 更多内容,见微*公号往期文章:有史以来最详细的卷积神经网络…

[大疆航线] 系列(3) 无人机多角度航线规划软件μMAPLE

关键词:无人机航线、航点动作,航线软件 作者:ludwig1860 日期:2024.7.3 1. 多角度航线规划软件μMAPLE的编写 我们研究团队编写了一个名为μMAPLE (uav-based Multi-Angular flight PLannEr)的多角度航线规划软件。当然,我们也很乐意协助研究人员们开发符合各自需求的航线…

Windows Terminal 中设置常用命令的别名

Windows Terminal 中设置常用命令的别名 ‍ E:\zhpj\Desktop>cmd /? 启动 Windows 命令解释器的一个新实例 . . . 如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找 以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或 两个都存在,这两个变量会先被执行。HKE…

ssrf结合python反序列化

存储session对象时 当然不能直接存储对象 需要转换成有规律的字符串 这一过程就涉及到了序列化 将对象转换成字符串这一过程称之为序列化 PYTHON反序列化漏洞 本文中就涉及到了pickle这一序列化模块导致的反序列化漏洞 在反序列化结束时 会触发__reduce__魔术方法 类似于php中的…

Web基础知识扫盲

1、中间件 定义:中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。常见的中间件:IIS、Apache、Nginx、Tomcat 2、NAT网络地址转换 这里只介绍动态转换一种 动态转换…

MySQL-16.MVCC(多版本并发控制)

C-16.多版本并发控制 1.什么是MVCCMVCC(Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一事务更…

[JLU] 数据结构与算法上机题解思路分享-课程设计第一次与第二次上机

这是吉林等通知大学数据结构与算法上机题的题解思路,没有精妙的解法,只是一个记录罢前言 首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。 这里只是思路解析的博客,代码仓库在 JLU_Data_Structures_Record 希望你能在这里找到你想要…

【Python】GUI开发笔记

一、环境搭建: 1、Pycharm开发工具pycharm历史版本 https://www.jetbrains.com/pycharm/download/other.html破解插件 https://blog.csdn.net/weixin_50737119/article/details/135628513 2、PYENV 版本管理 Python也有对应的版本管理工具,叫pyenv 这个东西挺奇怪的,直接发…

Day1| 704. 二分查找 27. 移除元素

704.二分查找 题目链接 : https://leetcode.cn/problems/binary-search/description/ 思路😗*切记二分查找要基于排序好的数组或者数据,否则二分查找必不能使用!!!!!!!!! ** 双指针写最简单,一个头指针从0开始,一个尾指针从数组长度-1开始,中间指针是头+尾/2,每次比较头尾中间…

不同操作系统下的换行符

1. 关键字 2. 换行符的比较 3. ASCII码 4. 修改换行符4.1. VSCode5. 参考文档1. 关键字 CR LF CRLF 换行符 2. 换行符的比较英文全称 英文缩写 中文含义 转义字符 ASCII码值 操作系统Carriage Return CR 回车 \r 13 MacIntosh(早期的Mac)Linefeed LF 换行/新行 \n 10 Unix/Li…

1s内控制向某个请求请求的次数

背景 有的时候后端提供的接口对相同的IP进行限制,在某个时间内不能发送超过X条的请求,一旦超过指定的请求数会导致后续请求接口会出现异常。 效果需求 比如:在1s内最多同时发送2个请求,多出来的请求在后续的1s或者后续的Ns中发起 代码 <template><div class="…

电脑hold escape key to prevent startlsback怎么处理?

电脑出现hold escape key to prevent StartlsBack from,一般遇到这种问题之后,一直按住ESC键就没有了。但是还需彻底的解决掉这个问题。 首先我们按下“ctrl +alt +del”组合键打开任务管理器,左上角“运行新任务”,输入“control”并确定,就可以打开控制面板,查看方式为…

7.3日RTOS自学心得

我现在用的单片机主要是裸机系统,轮询系统和前后台系统(中断处理),但是为了以后的职业发展肯定还是要学习下操作系统的,也就是多任务系统FreeRTOS,在看野火的资料【[野火]uCOS-III 内核实现与应用开发实战指南】,学习到了第六章,任务的定义与任务切换的实现。 总结如下…

fisher线性判别分析和多分类问题探究

本文继续来讨论另一种分类模型————fisher线性判别分析 目录一、模型思想二、SPSS的实现1.参数设置(1)定义范围(2) 统计(3)保存与分类2.结果分析(1)典则判别函数系数(2)分类结果(3)分类函数系数(4)保存预测结果四、多分类问题 一、模型思想 我们以二分类问题举例…

[Paper Reading] GAIA-1: A Generative World Model for Autonomous Driving

GAIA-1: A Generative World Model for Autonomous Driving GAIA-1 时间:23.09 机构:Wayve TL;DR 本文介绍一种生成世界模型,该模型利用视频、文本和动作输入来生成逼真的驾驶场景,同时提供对自身车辆行为和场景特征的细粒度控制。 Method模型输入 训练过程输入video/text(…