7月23日JavaSE学习笔记

news2024/11/27 10:40:48

异常:

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

异常类 Exception 继承自 Throwable 类(可抛出的)

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();//IndexOutOfBoundsException
            list.remove(8);
            int[] arr = new int[2];//ArrayIndexOutOfBoundsException
            arr[8] = 22;
            String strA = "abc";//StringIndexOutOfBoundsException
            strA.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{
    @Override
    public 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{
            //默认覆盖,如果像在原本内容上追加,传入第二个参数为true
            fos = 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)

用途

  • 作为字节流或字符流的包装器,通过内部缓冲区提高读写效率。

主要类

  • 字节缓冲流:BufferedInputStreamBufferedOutputStream
  • 字符缓冲流:BufferedReaderBufferedWriter

特点

  • 减少实际的I/O操作次数,提高性能。
  • 一次性读取或写入大块数据到内存中的缓冲区。

区别与联系

区别

  • 用途:字节流用于二进制数据,字符流用于文本数据,缓冲流用于提高读写效率。
  • 编码:字节流不关心编码,字符流需要考虑字符编码。
  • 性能:缓冲流通过减少I/O操作次数显著提高性能。

联系

  • 缓冲流可以包装在任何类型的字节流或字符流之上。
  • 所有这些流类型的最终目标都是实现数据的输入和输出。
  • 字节流和字符流是基础,缓冲流是优化手段,可以相互结合使用以达到最佳效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++客户端Qt开发——Qt窗口(对话框)

5.对话框 ①对话框介绍 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog…

【NLP自然语言处理】为什么说BERT是bidirectional

首先,来看一下Transformer架构图: 我们知道,Bert设计时主要采用的是Transformer编码器部分,要论述Bert为啥是双向的,我想从编码器和解码器的注意力机制来阐述。 在看这篇博客前,需要对Transformer有一定的…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音?不管是娱乐圈还是现实生活,【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热! 本文将为您推荐8款电脑录音软件,并详细介绍电脑录音的多种方式…

【Windows和Linux校验文件MD5值(详细)】

1、 什么是MD5? 文件的MD5校验是一种常用的文件完整性验证方法。MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中,MD5算法通过计算文件的哈希…

访问所有节点的最短路径

847. 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中,graph[i] 是一个列表,由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的…

【吊打面试官系列-Dubbo面试题】服务调用是阻塞的吗?

大家好,我是锋哥。今天分享关于 【服务调用是阻塞的吗?】面试题,希望对大家有帮助; 服务调用是阻塞的吗? 默认是阻塞的,可以异步调用,没有返回值的可以这么做。 Dubbo 是基于 NIO 的非阻塞实现…

渗透测试:筑牢网络安全的坚固防线

在当今这个互联网高度发达的时代,网络安全已成为维护社会稳定和经济发展的重要基石。随着互联网的普及,网络攻击手段日益复杂多变,各类安全威胁层出不穷。为了有效应对这些挑战,渗透测试作为一种重要的安全测试与评估方法&#xf…

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架,它提供了丰富的界面设计工具和组件。在界面开发中,QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口,包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…

AI绘画入门实践 | Midjourney:使用 --chaos 给图像风格来点惊喜

在 Midjourney 中,--chaos 影响初始图像网格的多样性,指 MJ 每次出的4张图之间的差异性。 默认值为0,值越高,差异性越大。 使用格式:--chaos 0-100的整数值 使用演示 a lot of flowers --chaos 0 --v 6.0a lot of fl…

基于微信小程序+SpringBoot+Vue的垃圾分类系统(带1w+文档)

基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 基于微信小程序SpringBootVue的垃圾分类系统(带1w文档) 本垃圾分类小程序也是紧跟科学技术的发展,运用当今一流的软件技术实现软件系统的开发,让环保方面的信息完全通过管理系统实现科学化&#xf…

3.5 查找和排序算法

大纲 算法基础 常用的表示算法的方法 算法的复杂度 查找 顺序查找、二分查找 哈希查找 真题 排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 排序算法总结 真题

【数据结构】双向带头循环链表(c语言)(附源码)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 1.双向带头循环链表的概念和结构定义 2.双向带头循环链表的实现 2.1 方法声明 2.2 方法实现 2.2.1 创建新节点 2.2.2 初始化 2.2.3 …

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

WebLogic 9.x 10.x中间件监控指标解读

监控易是一款功能强大的IT系统监控软件,能够实时监控包括WebLogic中间件在内的各类应用和业务运行状态。对于WebLogic 9.x和10.x版本的监控,监控易提供了一系列详尽的指标,确保用户能够全面了解和掌握WebLogic集群和应用的性能状况。 在WebLo…

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略完整思路 模型 代码 结果分享(仅供学习)

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略(2024 International Mathematics Molding Contest for Higher Education (IMMCHE)Problem B: Space Migration Program and Strategy) 我们的未来有两种可能性:第一,我们将留…

目标检测自顶向下入门

最近在学习Yolo和OpenCV这些计算机视觉的相关领域,把深度学习啃了个大概,准备着手学习一下Yolov5,趁着这个机会入门一下目标检测这个领域,也算是自顶向下地学习一遍吧。 目标检测 什么是目标检测 物体识别(Object de…

JavaScript(16)——定时器-间歇函数

开启定时器 setInterval(函数,间隔时间) 作用:每隔一段时间调用这个函数,时间单位是毫秒 例如:每一秒打印一个hello setInterval(function () { document.write(hello ) }, 1000) 注:如果是具名函数的话不能加小括号&#xf…

算法板子:使用数组模拟双链表——初始化链表、插入结点、删除结点

插入操作的指针修改顺序&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;const int N 1e5 10;// e[i]代表i结点的值; l[i]代表i结点左边结点的下标; r[i]代表i结点右边结点的下标; idx代表当前可用结点的下标 int e[N], l[N], r[N], idx;// 初…

一刷代码随想录(回溯4)

递增子序列 题意&#xff1a; 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会…

vue3里将table表格中的数据导出为excel

想要实现前端对表格中的数据进行导出&#xff0c;这里推荐使用xlsx这个依赖库实现。 1、安装 pnpm install xlsx 2、使用 import * as XLSX from "xlsx"; 直接在组件里导入XLSX库&#xff0c;然后给表格table通过ref创建响应式数据拿到table实例&#xff0c;将实…