7-23学习笔记

一、异常

        即程序中一些程序处理不了的特殊情况

        Exception 能被程序本身处理( try-catch )Error 是无法处理的(只能尽量避免)

1、异常类   Exception

见过的异常  NullPointerException  ArrayIndexoutOfBoundException等
        String str=null;System.out.println(str.length());//NullPointerException异常String name="张三";boolean bool=str.equals(name);//NullPointerException异常System.out.println(bool);int i=12;int a=0;System.out.println(i/a);//ArithmeticException异常

 2、异常的分类

        当程序中出现异常,就会中断程序,代码不会继续运行
(1)检查型异常(编译异常)

        在编译时就会抛出的异常(代码上会报错),需要在代码中编写处理方式  (和程序之外的资源访问)  直接继承Exception

        File file=new File("D:\\easy.text");//检查性异常   编译异常FileInputStream fis=new FileInputStream(file);//FileNotFoundException

(2) 运行时异常

        在代码运行时可能会出现的异常,可以不用明文处理,而通过代码避免异常的发生 继承RunTimeException

        String str=null;//System.out.println(str.length());//NullPointerException异常if(str!=null){System.out.println(str.length());}else{System.out.println("str是null值");}String name="张三";//boolean bool=str.equals(name);//NullPointerException异常boolean bool=name.equals(str);System.out.println(bool);int i=12;int a=0;//System.out.println(i/a);//ArithmeticException异常if(a!=0){System.out.println(i/a);}else {System.out.println("a==0不能做除数");}

3、处理异常

        try...catch...finally
        File file=new File("D:\\easy.text");//检查型异常   编译异常//FileInputStream fis=new FileInputStream(file);//FileNotFoundExceptionFileInputStream fis=null;try{//try块尝试捕捉异常   其中是可能会抛出异常的代码fis=new FileInputStream(file);//fis.close();}catch (FileNotFoundException e){//捕捉到异常后要处理的代码e.printStackTrace();//打印异常日志}finally {//无论是否出现异常都会执行的代码块//一般用在关闭资源if(fis!=null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}

4、处理多种异常

(1)try处理
        try {System.out.println(12/0);Object strA="";System.out.println((Integer)strA);fis=new FileInputStream(file);}catch (ArithmeticException e){//出现ArithmeticException要执行的代码System.out.println("出现ArithmeticException");}catch (ClassCastException e){System.out.println("出现ClassCastException");}catch (FileNotFoundException e){System.out.println("出现FileNotFoundException");}finally {if (fis!=null){try {fis.close();}catch (IOException e){e.printStackTrace();}}}
(2)合并处理方案 一个catch块捕捉多种异常
        使用 | 声明多种异常
        try {System.out.println(12/0);Object strA="";System.out.println((Integer)strA);fis=new FileInputStream(file);}catch (ArithmeticException | ClassCastException | FileNotFoundException e){}
(3)catch块声明父类异常,捕捉所有子类异常
        try {System.out.println(12/0);Object strA="";System.out.println((Integer)strA);fis=new FileInputStream(file);}catch (Exception e){}

5、catch 异常捕捉的顺序

        子类异常优先处理,父类异常后置处理
        try{List list=new ArrayList();list.remove(8);//Indexoutint[] arr=new int[2];arr[8]=22;//ArrayIndexString strA="abc";strA.charAt(8);//StringIndex}catch (ArrayIndexOutOfBoundsException e){}catch (StringIndexOutOfBoundsException e){}catch (IndexOutOfBoundsException e){e.printStackTrace();}

 6、注意

        如果catch块抛出了异常,没有finally就会中断程序
        执行try 或者catch中的return语句之后,在返回之前,如果有finally,就会运行finally,如果finally中有return语句,那么程序就按finally中return,所以finally中的return是一定会被return的
 public class EasyException {public static void main(String[] args) {System.out.println(test());//3}public static int test(){try{System.out.println(12/0);return 1;}catch (Exception e){return 2;}finally {//System.out.println(12/0);return 3;}//只返回最后一次执行的返回值//若finally中没有return 且try中有异常,那么返回catch中的return//若finally中没有return 且try中没有异常,那么返回try中的return}
}
      try不能单独编写 必须有其他语句块
      try块中没有检查性异常,不能在catch块中随意捕捉
 try...catch
    public static void testA(){try{System.out.println(12/0);}catch (Exception e){}}
try...finally
    public static void testA(){File file=null;FileInputStream fis=null;try{System.out.println(12/0);//不能出现检查型异常 该类异常必须用catch捕捉//fis=new FileInputStream(file);}finally {}}

7、自定义异常 

//自定义一个检查型异常   是Exception的直接子类
class StudentNameIsNullException extends Exception{public StudentNameIsNullException(){}public StudentNameIsNullException(String msg){super((msg));}
}

8、throws、throw   

throws 声明方法可能要抛出哪种异常   声明抛出多个异常(用','连接)
throw 在方法体中抛出一个具体的异常对象  没有解决异常,只是抛给使用这段代码的人
运行时异常不用必须声明要抛出哪种异常  检查型异常则不行
    public void infoA(){if(name==null){throw new NullPointerException("name is null");//throw new RuntimeException(".....");//throw new Exception();}}

方法重写:子类对父类中继承过来的方法进行重新定义
约束:  返回值类型  方法名  参数列表不能变
访问权限只能更开放
抛出的异常只能更精确 范围应该更小,不能扩大(指检查型异常)
class BigStudent extends Student{@Overridepublic void info() throws StudentNameIsNullException {}
}
class Student{String name;public void info() throws StudentNameIsNullException,NullPointerException{//name==null是一个特殊情况   不符合业务需求if(name==null){throw new StudentNameIsNullException("Student name is null");}System.out.println("我的名字是"+name);}
}

二、File  文件类

        java中对文件的处理  java.io包

 1、定义File类

File f=new File("D:\\easy.txt");

2、常用方法

(1)判断是否存在该文件  exists()
        boolean bool=f.exists();System.out.println(bool);
(2)创建文件   createNewFile()
        if(!bool){try{bool=f.createNewFile();if(bool){System.out.println("成功创建文件");}}catch (IOException e){e.printStackTrace();}}
(3)创建文件夹
        //创建时路径完整f.mkdir();//创建时路径不需要完整  会自己补全f.mkdirs();
(4)获取是否是文件
        bool=f.isFile();System.out.println(bool);
(5)是否是文件夹
        bool=f.isDirectory();System.out.println(bool);
(6)获取文件的大小
        f=new File("");long len=f.length();System.out.println(len);
(7)文件存在时删除文件  
        if(bool){{//删除文件夹时,文件夹必须是空的文件夹bool=f.delete();System.out.println("成功删除文件"+bool);}

        注:删除文件夹时,文件夹必须是空的文件夹

三、IO  输入输出流

        流动的是数据  数据的形式是二进制

1、分类

根据流动的方向不同     输入流和输出流
根据流动的介质(单位)不同    字符流和字节流字符流只能读取文本 .txt .xml .html .yml .properties字节流可以读取所有的文件类型
根据功能(作用)不同         节点流和工具流  打印流  数据流  对象流
        //字节输入流InputStream is;//字节输出流OutputStream os;//字符输入Reader r;//字符输出Writer w;

2、读取   写出 

(1)读取
    public static void readFile(){FileInputStream fis=null;try{fis=new FileInputStream("D:\\easy.txt");byte[] arr=new byte[12];//读取多少就转换多少int length=0;while((length=fis.read(arr))!=-1){//arr 中就是读到的数据String str=new String(arr,0,length);System.out.print(str);
//                String.valueOf(arr);}}catch (IOException e){e.printStackTrace();}finally {if(fis!=null){try{fis.close();}catch (IOException e){e.printStackTrace();}}}}
(2)写出
    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();}}}}

默认为覆盖式写出,若要改为追加式可在定义输出流时将第二个参数置为true

3、缓冲流

    public static void readFileBuffer(){//文件字节输入流FileInputStream fis=null;//工具流//转换流  字节流转换成字符流InputStreamReader isr=null;//缓冲流BufferedReader br=null;try{fis=new FileInputStream("D:\\easy.txt");isr=new InputStreamReader(fis);br=new BufferedReader(isr);String line=br.readLine();System.out.println(line);}catch (IOException e){e.printStackTrace();}finally {if(fis!=null){try{fis.close();}catch (IOException e){e.printStackTrace();}}}}

        是工具流的一种,当使用BufferedReader读取数据时,它会从底层流中读取一定数量的数据到内部缓冲区中进行暂时的保存,当读入到特定字符(如:\t \r)后一起发出

4、序列化与反序列化

(1)序列化

        将内存对象转换成序列(流),叫做序列化
        这个对象必须是可序列化的 即实现Serializable接口

    public static void wirteObject(){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 {if(fos!=null){try{fos.close();}catch (IOException e){e.printStackTrace();}}if(oos!=null){try{oos.close();}catch (IOException e){e.printStackTrace();}}}}

对应的类:

public class Staff implements Serializable {String name;String sex;int salary;@Overridepublic String toString() {return "Staff{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", salary=" + salary +'}';}
}
(2)反序列化

         将对象序列读入程序, 转换成对象的方式:反序列化
         反序列化会创建新的对象

    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 {if(fis!=null){try{fis.close();}catch (IOException e){e.printStackTrace();}}if(ois!=null){try{ois.close();}catch (IOException e){e.printStackTrace();}}}}
(3)序列化版本控制    transient关键词

        对于序列化对象,它的属性也必须是可序列化的,除非该属性是transient修饰的

serialVersionUID  是一个类的序列化版本号
如果该量没有定义,jdk会自动给与一个版本号,当该类发生变化时
该序列化版本号会发生变化,反序列化就会失败
自定义该版本号,只要该版本号不发生变化,即使类中属性/方法改变
该类的对象依旧可以反序列化
反序列化的对象是一个新的对象
private static final long serialVersionUID=1L;private transient String sex;

 transient修饰属性 作用: 禁止属性的值被序列化

        当一个类的属性中有一个是不可序列化的类型或者不想被序列化时,可以使用transient禁止其序列化

 (4)输出流的flash方法
强制将缓冲区中的数据写出到目的地。
在某些情况下,缓冲区中的数据并不会自动写出到目的地,
而是需要显式地调用 flush 方法来实现。
在关闭输出流之前,通常会调用 flush 方法来确保所有待处理的数据都被写出到目的地。
大流套小流 大流执行了flush(),其嵌套的小流会自动执行flush()

  flush()虽然只对缓冲流有作用,但习惯上,所有的输出流在关闭前都会调用 flush()

    public static void writeStudent(Student stu){FileOutputStream fos=null;ObjectOutputStream oos=null;File file=new File("D:\\student.data");if(!file.exists()){try{file.createNewFile();}catch (IOException e){e.printStackTrace();}}try{fos=new FileOutputStream(file);oos=new ObjectOutputStream(fos);oos.writeObject(stu);oos.flush();//强制将缓冲区中的数据写出到目的地。// 在某些情况下,缓冲区中的数据并不会自动写出到目的地,// 而是需要显式地调用 flush 方法来实现。//在关闭输出流之前,通常会调用 flush 方法来确保所有待处理的数据都被写出到目的地。//大流套小流 大流执行了flush(),其嵌套的小流会自动执行flush()}catch (IOException e){e.printStackTrace();}finally {if(oos!=null){try{oos.close();}catch (IOException e){e.printStackTrace();}}if(fos!=null){try{fos.close();}catch (IOException e){e.printStackTrace();}}}}

 

补充总结:

创建对象的方法1 new2 克隆3 反序列化4 反射

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

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

相关文章

《python程序语言设计》第6章14题 估算派值 类似莱布尼茨函数。但是我看不明白

这个题提供的公式我没看明白,后来在网上找到了莱布尼茨函数 c 0 for i in range(1, 902, 100):a (-1) ** (i 1)b 2 * i - 1c a / bprint(i, round(4 / c, 3))结果 #按题里的信息,但是结果不对,莱布尼茨函数到底怎么算呀。

Docker学习与实战

一、Docker安装 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine配置docker yum源 sudo yum install -y yum-utils配置阿里云docker仓库 sudo y…

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号,它有两个关键参数: 周期(Period):一个完整的PWM信号的时间长度,通常用秒(s)或毫秒(ms)表示。占空比…

前端开发:HTML与CSS

文章目录 前言1.1、CS架构和BS架构1.2、网页构成 HTML1.web开发1.1、最简单的web应用程序1.2、HTTP协议1.2.1 、简介1.2.2、 http协议特性1.3.3、http请求协议与响应协议 2.HTML概述3.HTML标准结构4.标签的语法5.基本标签6.超链接标签6.1、超链接基本使用6.2、锚点 7.img标签8.…

算法:BFS解决 FloodFill 算法

目录 FloodFill 算法 题目一:图像渲染 题目二:岛屿数量 题目三:岛屿的最大面积 题目四:被围绕的区域 FloodFill 算法 在递归搜索回溯中已经说到过 FloodFill 算法了,但是那里是用 dfs 解决的,这里会使…

【Web开发手礼】探索Web开发的魅力(十一)-Vue(1)配置环境、创建导航栏、各页面整体框架

主要讲解了vue的下载、配置环境、项目创建、导航栏、页面整体框架!!! 文章目录 前言 配置环境 终端 安装Nodejs 安装vue/cli 启动vue自带的图形化项目管理界面 基本概念 script部分 template部分 style部分 第三方组件 创建导航栏 总结 前言 …

数据结构——单链表OJ题(上)

目录 一、移除链表元素 1.思路 2.注意 3.解题 二、反转链表 思路1:三指针翻转法 (1)注意 (2)解题 思路2:头插法 (1)注意 (2)解题 三、链表的中间结…

目标检测算法:深入探索与前沿展望

大家好,我是一名测试开发工程师,已经开源一套【自动化测试框架】和【测试管理平台】,欢迎大家联系我,一起【分享测试知识,交流测试技术】 在人工智能的浩瀚星空中,目标检测算法无疑是一颗璀璨的明星&#x…

uniapp的h5,读取本地txt带标签的文件

效果图 使用的回显的标签是u-parse,下面的网址讲了这个标签的相关 https://www.cnblogs.com/huihuihero/p/12978903.html 导入此插件 https://ext.dcloud.net.cn/plugin?id364 使用 uni.request({// 本地文件url: "/static/互联网医院医师端用户协议.txt…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

51.TFT_LCD液晶屏驱动设计与验证(4)

&#xff08;1&#xff09;顶层文件&#xff1a; module tft_colorbar(input clk ,input reset_n ,output hsync ,output vsync ,output [23:0] rgb_tft ,output tft_bl ,output …

LeetCode算法——滑动窗口矩阵篇

1、长度最小的子数组 题目描述&#xff1a; 解法&#xff1a; 设一个 for 循环来改变指向窗口末尾的指针&#xff0c;再不断抛弃当前窗口内的首元素 最终确定满足条件的最小长度 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int …

Python 教程(五):理解条件语句和循环结构

目录 专栏列表前言条件语句if 语句elif 语句else 语句示例 循环结构for 循环while 循环break 和 continue实例演示 循环控制语句range 函数enumerate 函数 模式匹配总结 在前四篇教程中&#xff0c;我们学习了 Python 的基本语法和数据结构。本篇教程&#xff0c;我们将深入探讨…

git sendemail使用

教程参考&#xff1a; git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…

【故障排查】Docker启动Nacos报错:No DataSource set 问题解决

Nacos报错内容 Nacos Server did not start because dumpservice bean construction failure : No DataSource set原因分析 Nacos 配置的是单机模式&#xff0c;使用mysql 进行存储配置文件&#xff0c;Nacos的启动脚本已经配置了MySQL的连接方式&#xff0c;根据错误提示&a…

大话成像公众号文章阅读学习(二)--- 下一代 AI-ISP会更好

系列文章目录 大话成像公众号文章阅读学习&#xff08;一&#xff09;---- 索尼Alpha 9 III 大话成像公众号文章阅读学习&#xff08;二&#xff09;— 下一代 AI-ISP会更好 文章目录 系列文章目录前言一、AI-ISP1.1 定义与工作原理1.2 应用场景 二、展望总结 前言 这篇是 下…

AWS-Lambda的使用

介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…

【Android】安卓四大组件之广播知识总结

文章目录 动态注册使用BroadcastReceiver监听Intent广播注册Broadcast Receiver 静态注册自定义广播标准广播发送广播定义广播接收器注册广播接收器 有序广播修改发送方法定义第二个广播接收器注册广播接收器广播截断 使用本地广播实践-强制下线使用ActivityCollector管理所有活…

微信答题小程序产品研发-UI界面设计

高保真原型虽然已经很接近产品形态了&#xff0c;但毕竟还不能够直接交付给开发。这时就需要UI设计师依据之前的原型设计&#xff0c;进一步细化和实现界面的视觉元素&#xff0c;包括整体视觉风格、颜色、字体、图标、按钮以及交互细节优化等。 UI设计不仅关系到用户的直观感…

Scrapy 爬取旅游景点相关数据(四)

本节内容主要为&#xff1a; &#xff08;1&#xff09;创建数据库 &#xff08;2&#xff09;创建数据库表 &#xff08;3&#xff09;爬取数据进MYSQL库 1 新建数据库 使用MYSQL数据库存储数据&#xff0c;创建一个新的数据库 create database scrapy_demo;2 新建数据表 CR…