7月23日JavaSE学习笔记
异常:
程序中一些程序处理不了的特殊情况
异常类 Exception 继承自 Throwable 类(可抛出的)
Error:错误/事故,Java程序无法处理,如 OOM内存溢出错误、内存泄漏...会导出程序崩溃
常见的异常:
NullPointerException 空指针异常
ArrayIndexOutOfBoundException 数组下标越界异常
StringIndexOutOfBoundsException 字符串下标越界
ArithmeticException: / by zero 数学运算异常:除数为0
...
异常的种类:
1.检查性异常(编译异常):在编译时就会抛出的异常(代码上会报错)
需要在代码中编写处理方式,直接继承自 Exception
常出现在和程序之外的资源进行访问,如 FileNotFoundException 异常,文件找不到
2.运行时异常:在代码运行阶段可能会出现的异常
可以没有明文处理,可以通过代码避免异常的发生,继承自 RunTimeException
编写代码规避异常:
String str = null;String name = "张三";boolean bool = name.equals(str);//确定的值放在前面比较System.out.println(bool);if(str!=null){System.out.println(str.length());}else {System.out.println("str是null值");}int i=12;int a=0;if(a!=0){System.out.println(i/a);}else {System.out.println(a);}
处理异常 try...catch...finally
try:尝试捕捉异常,其中是可能抛出异常的代码块
catch:捕获到的异常类型以及后续要进行处理的代码
finally:无论是否出现异常都会执行的代码块,常用于关闭资源,如关闭流、连接、线程池...
//以处理文件为例File file = new File("D:\\easy.text");FileInputStream fis = null;//声明在外,提升作用域//检查性异常(编译异常)try{//try尝试捕捉异常,其中是可能抛出异常的代码fis = new FileInputStream(file);//中间代码如果有异常抛出被catch捕捉,后续代码没有机会执行}catch (FileNotFoundException e){//捕捉到异常后要处理的代码e.printStackTrace();//打印异常日志}finally {//无论是否出现异常都会执行的代码块if(fis!=null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}
当try的代码块中可能抛出多个异常需要处理时:
1.用多个catch块依次捕获异常(catch异常捕捉的顺序:子类异常优先处理,父类异常后置处理)
try{List list = new ArrayList();//IndexOutOfBoundsExceptionlist.remove(8);int[] arr = new int[2];//ArrayIndexOutOfBoundsExceptionarr[8] = 22;String strA = "abc";//StringIndexOutOfBoundsExceptionstrA.charAt(8);}catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();}catch (StringIndexOutOfBoundsException e){e.printStackTrace();}catch (IndexOutOfBoundsException e){e.printStackTrace();}
2.合并处理方案,用一个catch块捕捉多种异常:使用 | 声明多种异常
//合并处理方案,一个catch块捕捉多种异常try{System.out.println(12/0);Object strA = "";System.out.println((Integer)strA);fis = new FileInputStream(file);}catch (ArithmeticException|ClassCastException|FileNotFoundException e){System.out.println("出现异常");}
3.通过声明父类异常来捕捉所有子类异常
//通过声明父类异常来捕捉所有子类异常try{System.out.println(12/0);Object strA = "";System.out.println((Integer)strA);fis = new FileInputStream(file);}catch(Exception e){e.printStackTrace();}
注意:如果在catch块中抛出异常,后面没有finally就会中断程序;
如果有finally,finally会运行,并且正常返回,此方法会正常运行结束。
public static int test(){try{System.out.println(12/0);return 1;}catch (Exception e){//throw new Exception();return 2;//执行,暂存2}finally {return 3;//运行,最后返回3,参考出栈将2覆盖,返回最后执行的return//如果方法没有正常结束,不会有返回值}}
try不能单独编写,后面必须有其他语句块(catch和finally之一)
检查性异常必须有catch明文处理,只有try和finally而没有catch时不能有检查性异常;
try块中没有检查性异常时,不能在catch块中随意捕捉检查性异常;
运行时异常在try中没有时也可以捕捉,可以捕捉Exception。
自定义异常:
检查性异常:直接继承Exception类
运行时异常:继承RunTimeException
异常声明
class StudentNameIsNullException extends Exception{public StudentNameIsNullException(){}public StudentNameIsNullException(String msg){super(msg);//传入消息}
}
在方法中声明并抛出异常:
throw 用于在方法中声明抛出具体哪种异常对象
throws 用于方法后指出此处可能抛出哪种异常
public void introduce() throws StudentNameIsNullException,NullPointerException, IOException {//name==null是一种特殊情况,不符合业务需求if(name==null){//检查性异常要在方法后抛出:告知此处出现一种特殊情况要注意//具体抛出哪一种异常对象throw new StudentNameIsNullException("Student name is null");}System.out.println("我的名字是"+name);}
注意:抛出的异常在语法上可以扩展到父类,但是在具体业务中不应该扩展;
throw和throws没有处理异常,只是抛给上级调用者;
检查性异常要在方法后抛出,告知此处出现一种特殊情况需要处理;
运行时异常可以不用throws抛出。
class CollegeStudent extends Student{@Overridepublic void introduce()throws StudentNameIsNullException{//重写的方法抛出异常只能更少,更精确,范围更小,可以没有,不能扩大}
}
方法重写时:子类对父类中继承过来的方法进行重新定义
约束:返回值类型、方法名、参数列表不能变;
访问权限只能更开放;
抛出的异常只能更少,更精确,可以没有,不能扩大。
文件处理
java中对文件处理使用 java.io包
常用方法:
1.声明一个文件类型,传入一个字符串作为地址
File f = new File("D:\\easy.txt");
2.是否存在该文件 exists()
boolean bool = f.exists();//是否存在System.out.println(bool);
3.创建文件(或文件夹)createNewFile()
if (!bool){//如果文件不存在try {bool = f.createNewFile();if(bool == true){System.out.println("成功创建文件");}}catch (IOException e){e.printStackTrace();}}
4.删除文件(或文件夹)delete()
删除文件夹时,这个文件夹必须是空文件夹
//删除文件夹时,这个文件夹必须是空的文件夹//f = new File("D:\\123");bool = f.delete();//删除System.out.println("成功删除文件"+bool);
5.判断是否是文件 isFile()
bool = f.isFile();//是否是文件System.out.println(bool);
6.判断是否是文件夹 isDirectory()
bool = f.isDirectory();//是否是文件夹System.out.println(bool);
7.创建文件夹
mkdir() 前面的路径必须都存在才能创建文件夹
mkdirs() 只需要有盘,会把包括路径上不存在的文件夹都依次创建
//前面的路径必须都存在才能创建文件夹f.mkdir();//只需要有盘,会把路径上不存在的文件夹依次创建f.mkdirs();
8.获取文件路径 getPath()
String str = f.getPath();//获取路径System.out.println(str);
9.获取长度(二进制多少B)length()
//获取长度long len = f.length();//返回long类型System.out.println(len/1024/1024+"MB");
IO输入输出流
流:流动的是数据,是二进制
流的分类:
1.根据流动的方向不同:输入流和输出流
2.根据流动的介质(单位)不同:字符流和字节流
字符流只能读取文本文件如: .txt .xml .properties .html .csv等
字节流可以读取所有文件类型
3.根据功能(作用)不同:节点流、工具流、打印流、数据流、对象流
字节输入流 InputStream
//字节流输入流public static void readFile(){FileInputStream fis = null;try {fis = new FileInputStream("D:\\easy.txt");byte[] arr=new byte[1024];int lenth=0;while ((lenth=fis.read(arr))!=-1){//arr中就是读取的数据String str = new String(arr,0,lenth);System.out.print(str);String.valueOf(arr);}}catch (IOException e){e.printStackTrace();}finally {if (fis!=null){try{fis.close();}catch (IOException e){e.printStackTrace();}}}}
字符输入流 Reader
//字符输入流public static void readFile(){FileReader fr=null;try{fr = new FileReader("D:\\0723.txt");char[] arr=new char[1024];int lenth=0;while ((lenth=fr.read(arr))!=-1){String str = new String(arr,0,lenth);System.out.print(str);}}catch (IOException e){e.printStackTrace();}finally {if(fr!=null){try{fr.close();}catch (IOException e){e.printStackTrace();}}}}
字符缓冲流 BufferedReader
工具流,字节转换流:把几个字节转换成一个字符,把字节流转换成字符流
缓冲流,有一个默认容量8192的字符数组,对输入的数据进行缓存,方便读写操作。
//字符缓存流public static void readFileBuffer(){FileInputStream fis=null;InputStreamReader isr = null;BufferedReader br=null;try{fis = new FileInputStream("D:\\0723.txt");isr = new InputStreamReader(fis);br = new BufferedReader(isr);String line;while ((line = br.readLine())!=null){System.out.println(line);}}catch (IOException e){e.printStackTrace();}finally {if(fis!=null){try{fis.close();}catch (IOException e){e.printStackTrace();}}if(isr!=null){try{isr.close();}catch (IOException e){e.printStackTrace();}}if(br!=null){try{br.close();}catch (IOException e){e.printStackTrace();}}}}
字节输出流 OutputStream
默认会覆盖文件原本的内容,如果想在原内容上追加,需要传入第二个参数为true。
//字节输出流public static void writeFile(){String str = "老崔很水";byte[] arr=str.getBytes();FileOutputStream fos = null;try{//默认覆盖,如果像在原本内容上追加,传入第二个参数为truefos = new FileOutputStream("D:\\easy.txt",true);fos.write(arr);}catch (IOException e){e.printStackTrace();}finally {if(fos!=null){try{fos.close();}catch (IOException e){e.printStackTrace();}}}}
对象输出流 ObjectOutputStream
序列化:将内存对象转换成序列(流)的过程;
进行序列化的对象必须是可序列化的,实现Serializable接口(标识接口,不需要实现方法)
//对象输出流public static void writeObject(){//将内存对象转换成序列(流)的过程叫做序列化//这个对象必须是可序列化的Serializable,标识接口,不需要实现方法Staff staff=new Staff();staff.name="张三";staff.sex="男";staff.salary=3500;//对象输出流ObjectOutputStream oos = null;FileOutputStream fos = null;try{fos=new FileOutputStream("D:\\easy.txt");oos=new ObjectOutputStream(fos);oos.writeObject(staff);}catch (IOException e){e.printStackTrace();}finally {try{if(fos!=null){fos.close();}}catch (IOException e){e.printStackTrace();}try{if(oos!=null){oos.close();}}catch (IOException e){e.printStackTrace();}}}
对象输入流 ObjectInputStream
反序列化:将对象序列读入程序,转换成对象的方式。反序列化会创建新的对象。
public static void readObject(){//将对象序列读入程序,转换成对象的方式:反序列化//反序列化会创建新的对象FileInputStream fis = null;ObjectInputStream ois = null;try{fis = new FileInputStream("D:\\easy.txt");ois = new ObjectInputStream(fis);Object obj = ois.readObject();System.out.println(obj);}catch (Exception e){e.printStackTrace();}finally {try{if(fis!=null){fis.close();}}catch (IOException e){e.printStackTrace();}try{if(ois!=null){ois.close();}}catch (IOException e){e.printStackTrace();}}}
创建对象的方式:1.new 2.克隆 3.反序列化 4.反射
字节流、字符流与缓冲流的区别与联系
字节流(Byte Streams)
用途:
- 用于读写原始字节数据,不关心数据的编码方式。
- 适用于处理所有类型的二进制数据,如图片、视频、音频文件等。
主要类:
InputStream:字节输入流,用于从源读取字节数据。OutputStream:字节输出流,用于向目标写入字节数据。
特点:
- 直接操作字节序列,不解析或修改数据内容。
- 适用于文件操作、网络通信等场景。
字符流(Character Streams)
用途:
- 专门用于读写字符数据,特别是文本数据。
- 涉及字符编码和解码,能够处理不同字符集之间的转换。
主要类:
Reader:字符输入流,用于读取字符数据。Writer:字符输出流,用于写入字符数据。
特点:
- 以字符为单位进行读写,方便处理文本数据。
- 自动处理不同平台的字符编码差异。
缓冲流(Buffered Streams)
用途:
- 作为字节流或字符流的包装器,通过内部缓冲区提高读写效率。
主要类:
- 字节缓冲流:
BufferedInputStream、BufferedOutputStream - 字符缓冲流:
BufferedReader、BufferedWriter
特点:
- 减少实际的I/O操作次数,提高性能。
- 一次性读取或写入大块数据到内存中的缓冲区。
区别与联系
区别:
- 用途:字节流用于二进制数据,字符流用于文本数据,缓冲流用于提高读写效率。
- 编码:字节流不关心编码,字符流需要考虑字符编码。
- 性能:缓冲流通过减少I/O操作次数显著提高性能。
联系:
- 缓冲流可以包装在任何类型的字节流或字符流之上。
- 所有这些流类型的最终目标都是实现数据的输入和输出。
- 字节流和字符流是基础,缓冲流是优化手段,可以相互结合使用以达到最佳效果。
相关文章:
7月23日JavaSE学习笔记
异常: 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类(可抛出的) Throwable继承树 Error:错误/事故,Java程序无法处理,如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…...
Linux——DNS服务搭建
(一)搭建nginx 1.首先布置基本环境 要求能够ping通外网,有yum源 2.安装nginx yum -y install nginx 然后查看验证 3.修改网页配置文件 修改文件,任意编写内容,然后去物理机测试 (二)创建一…...
C#中的wpf基础
在WPF中,Grid 是一种非常强大的布局控件,用于创建网格布局。它允许你将界面划分为行和列,并将控件放置在这些行和列中。 以下是一些关键点和示例,帮助你理解 WPF 中的 Grid: 基本属性 RowDefinitions:定义…...
基于微信小程序+SpringBoot+Vue的刷题系统(带1w+文档)
基于微信小程序SpringBootVue的刷题系统(带1w文档) 基于微信小程序SpringBootVue的刷题系统(带1w文档) 本系统是将网络技术和现代的管理理念相结合,根据试题信息的特点进行重新分配、整合形成动态的、分类明确的信息资源,实现了刷题的自动化,…...
SSH -i的用法
缘起 今天使用ssh -i指定私钥时遇到以下错误: WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0644 for /home/ken/.ssh/my.pem are too open. It is required that your private key files are NOT accessible by others. This private key will b…...
小白学习webgis的详细路线
推荐打开boss直聘搜索相关岗位,查看岗位要求,对症下药是最快的。 第一阶段:基础知识准备 计算机基础 操作系统:理解Windows、Linux或macOS等操作系统的基本操作,学会使用命令行界面。网络基础:掌握TCP/I…...
使用ChatGPT来撰写和润色学术论文的教程(含最新升级开通ChatGpt4教程)
现在有了ChatGPT4o更加方便了, 但次数太少了 想要增加次数可以考虑升级开桶ChatGpt4 ( OPENAI4 可以减2刀) 一、引言 在学术研究中,撰写高质量的论文是一项重要的技能。本教程将介绍如何利用ChatGPT来辅助完成从论文构思到润色的全过程…...
常见的 HTTP 状态码分类及说明
HTTP 响应状态码(HTTP status code),表示服务器对请求的处理结果。常见的 HTTP 状态码有以下几类: 1xx: 信息响应 (Informational Responses) 100 Continue: 请求已收到,客户端应继续发送请求的其余部分。101 Switch…...
Leetcode700.二叉搜索树中搜索具体值
二叉搜索树的定义: 一颗空树或者具有以下性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;任意节…...
自动导入unplugin-auto-import+unplugin-vue-components
文章介绍 接下来将会以Vite Vue3 TS的项目来举例实现 在我们进行项目开发时,无论是声明响应式数据使用的ref、reactive,或是各种生命周期,又或是computed、watch、watchEffect、provide-inject。这些都需要前置引入才能使用: …...
Conda修改包/虚拟环境储存目录
Conda修改包/虚拟环境储存目录 关键字样例 关键字 通过conda config --show [key]可以查看某个配置的值,[key]留空可以查看所有配置 其中: envs-dirs 存放虚拟环境的储存目录pkgs_dirs 包的目录 通过conda config --add [key] [value]可以为配置添加值…...
Live555源码阅读笔记:哈希表的实现(C++)
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
警务平台app
智慧公安以大数据、云计算、人工智能、物联网和移动互联网技术为支撑,以“打、防、管、控”为目的,综合研判为核心,共享信息数据资源,融合业务功能,构建公安智慧大数据平台,实现公安信息数字化、网络化和智…...
Java代理模式详解
Java代理模式详解 概念 代理模式是一种设计模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中,代理…...
docker centos镜像 npm安装包时报错“npm ERR! code ECONNRESET”
1.采用新的镜像地址 npm config set registry https://registry.npmmirror.com2.清理缓存 npm cache clean --force3.安装yarn npm install -g yarn4. 安装模块 在node_modules 同级目录执行下面命令: yarn add napi-build-utils env-paths express ejs cors …...
Angular中component和directive的区别?
在Angular中,Component和Directive都是重要的构建块,用于构建和组织应用程序的UI。然而,它们有不同的用途和特点。以下是Component和Directive的主要区别: Component(组件) 1、定义:Component…...
Unity 资源 之 Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享
精彩呈现:Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享 一、Pop It 3D 解压玩具的魅力二、双人游戏的互动乐趣三、Unity 游戏资源包的优势四、如何获取资源包 亲爱的游戏爱好者们,今天为大家带来一款令人兴奋的游戏资源——Pop It 3D 解压玩具双人带…...
linux离线安装mysql8(单机版)
文章目录 一、检查服务器是否有残留mysql资源,有的话就全删除1.1、查询mysql已安装的相关依赖:1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…...
【Python】快速创建一个简易 HTTP 服务器(http.server)
目录 官方文档安装教程用命令行创建编写代码创建 实例 官方文档 http.server 警告: http.server 不推荐用于生产环境。它仅仅实现了 basic security checks 的要求。 安装 Python3 内置标准模块,无需安装。(在之前的 Python2 版本名称是 Si…...
随着软件开发方法的不断演进,Cobol 程序如何适应敏捷开发和持续集成/持续部署(CI/CD)的流程?
Cobol是一种古老的编程语言,最初设计用于商业数据处理。虽然它不是为敏捷开发和CI/CD流程而设计的,但仍然可以通过一些技术和方法来使其与这些现代开发流程兼容。 以下是一些方法可以帮助Cobol程序适应敏捷开发和CI/CD流程: 拆分和模块化&am…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
