java学习记录(Day8)

Java学习记录(Day8)

  • 异常

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

异常类   Exception(父类)  继承Throwable

见过的异常   NullPointException(空指针异常)   ArrayIndexoutOfBoundsException(数组下标越界异常)

1.异常的分类:

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

(2)运行时异常:在代码运行阶段,可能会出现的异常,可以没有明文处理,可以通过代码避免异常的发生  继承RunTimeException

当程序中出现异常,就会中断程序,代码不会往下运行

下面例子是通过修改代码来避免空指针异常

下面的例子是通过修改代码来避免数学运算异常

2.处理异常

(1)try...catch...fiinally...

try块尝试捕捉异常  其中是可能会抛出异常的代码,在catch中是编写捕捉异常后要处理的代码,finally不管有没有异常,都会执行的代码块,一般在关闭资源

定义一个文件,所指向的系统文件地址为D盘,然后定义一个节点输入流fis,然后将给fis赋值,让它指向file。完整代码如下:

try 处理多种异常

可以通过多写几个catch代码块来区分异常情况。异常捕捉的顺序,子类异常优先处理  父类异常靠后处理

下面这个例子的异常是同级的,所以可以运行。

在编写Java程序时,通常建议将更具体的异常类型放在前面,而更一般的异常类型放在后面。这确保了异常能够被尽可能具体和有效地处理。如果一个更具体的异常类型被一个更一般的异常类型后面定义,那么更具体的异常永远不会被捕获,因为一旦异常到达更一般的catch块,它就会被处理,而不再继续向后查找。这可能导致更具体的异常处理逻辑被忽略。

catch  合并处理方案  

一个catch块捕捉多种异常,使用   |  声明多种异常

catch块出现异常

如果catch块抛出了异常,没有finally就会中断程序

如果有finally,就会运行finally 并且正常返回,此方法正常运行结束

因为try块中出现异常所以执行catch块,又因为catch块出现异常,所以就去执行finally块,最后输出为3

try不能单独编写,必须有其他语句块

try块中没有检查型异常时,catch块中不能随意捕捉

  1. 声明抛出   throws

自定义异常:

声明一个StudentNameIsNullException异常继承Exception(异常父类),然后在里面声明两个构造方法。

因为它直接继承Exception,所以它是检查型异常。

定义一个Student类,在里面声明两个方法,一个是抛出StudentNameIsNullException类异常,也就是检查型异常,所以也要在方法名的后面加上throws`是用来声明一个方法可能会抛出的异常类型。当抛出异常类型为RuntimeException,也就是运行时异常时,不需要加throws来说明。

总结来说:
 `throw`是用来抛出一个具体的异常实例

 `throws`是用来声明一个方法可能会抛出的异常类型,它不抛出异常,只是告诉调用者需要处理这些异常。throws 声明方法中可能抛出的异常,throws 抛出多种异常。

当子类BigStudent继承Student类时,也可以改写父类的方法,但是有限制。

约束:返回值类型,方法名,参数列表都不能变

      访问权限只能更开放

      抛出的异常只能更精确,范围更小,不能扩大

  • 文件

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

  1. 声明这个文件File

传入字符串当作文件地址

  1. 是否存在该文件.exists()

  1. 创建文件createNewFile()和删除文件delete()

先判断文件是否存在,如不存在就创建文件,当文件夹删除时,要确保文件夹必须是空的,不然删除会失败。

  1. 获取是否是文件

  1. 获取是否是文件夹

  • IO流

IO输入流 |  输出流,流动的是数据(二进制)

1.分类:

(1)根据流动的方向不同   分为输入流和输出流

(2)根据流动的介质(单位)不一样   字符流和字节流  字符流只能读取文本.txt .xml .properties .html .yml

(3)字节流可以读取任意文件

(4)根据功能(作用)不一样    节点流和工具流  打印流   数据流  对象流

  1. 声明示例:

  1. 读取文件内容并打印出来

首先定义一个字节输入流fis,让fis指向系统地址为"D:\\easy.txt"的文件,然后定义一个byte数组用来暂存读取的文件内容,然后输出byte数组中的内容。

  1. 读入文件缓冲流

首先定义一个字节输入流fis,然后声明一个字符流isr,将字节流转换为字符流,最后声明一个缓冲流。首先还是让fis指向系统文件,然后将字节流转换成字符流,然后将字符流转换成缓冲流,最后使用read.line函数来读取一行文本,并输出。

文件缓冲流的意义:文件缓冲流通过在内存中使用缓冲区来减少与磁盘的交互次数,从而显著提高了文件读写操作的性能。这对于处理大数据量的文件尤其重要,可以极大地改善应用程序的响应时间和整体性能。在实际编程中,几乎所有的文件读写操作都应该使用缓冲流,除非有特殊的需求或限制。

  1. 文件写入

首先定义一个字符串,将字符串存入byte数组中,声明一个文件输出流fos,让它指向系统文件,利用write()函数就可以将数组内容写入文件中。要注意在创建fos对象时,是否可追加,若不追加,每执行一次代码就会覆盖之前输入文件的内容。

  1. 序列化
  1. 定义:将内存对象转换成序列(流),叫做序列化,这个对象必须是可序列化的
  2. 示例:

首先要先创建一个可序列化的类,如下所示:

然后声明一个Staff对象,为它各个属性赋值。声明一个对象输出流oos和文件输出流fos,让fos指向系统文件,接下来,oos变量被实例化为一个新的ObjectOutputStream对象,它封装了之前创建的FileOutputStream对象fos。这意味着任何通过oos写入的数据最终会被写入到"D:\easy.txt"文件中。writeObject()方法将对象的状态转换为字节流,并通过oos写入到文件中。

  1. 反序列化
  1. 定义:将对象序列读入程序,转换成对象的方式:反序列化  会创建新的对象
  2. 示例:

声明一个字节输入流fis,和对象输入流ois,让fis变量指向系统文件,接下来,ois变量被实例化为一个新的ObjectInputStream对象,它封装了之前创建的FileInputStream对象fis。这意味着任何从ois读取的数据都是从"D:\easy.txt"文件中读取的。readObject()方法会读取文件中的字节流并将其重构为一个Java对象。返回的Object类型变量obj包含了从文件中读取的对象。

总结:创建对象的方式

  1. new
  2. 克隆
  3. 反序列化
  4. 反射
  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值