异常

异常的继承体系:

  • java.lang.Throwable(类):异常体系的父类

    • Error(错误)

    • Exception (异常)

      • 分两大类:

        • RuntimeException:它及它的子类都称为运行时期异常
        • 剩下的都是非运行时期异常,也称为编译时期异常(在程序编译过程中报错)

Error:

java.lang.StackOverflowError:栈溢出异常,循环套娃

Exception:

Java.lang.NullPointerException 空指针异常,访问了空常量的数据(对空常量操作/调用)

java.lang.ArrayIndexOutOfBoundsException数组索引越界异常:访问了数组中不存在的索引处元素(访问的索引>=长度)

java.lang.ClassCastException:类型转换异常

java.lang.InvalidClassException:无效类异常

java.lang.NumberFormatExcpetion:数值格式异常:将非数字字符串转换成Integer对象会报该异常

ConcurrentModificationException并发修改异常

java.lang.ArithmeticException数学运算异常

java.net.BindException: Address already in use: Cannot bind:端口号占用了

  • 端口占用:解决方法1.换端口号,2.终止占用该端口的程序

异常对象的方法:

  • public String getMessage():获取异常产生的原因
  • public String toString():返回异常的类型与原因
  • public void printStackTrace():打印异常类型,产生原因与位置
		try {      								 //try监控区域
            System.out.println(a/b);
        }catch (Exception e){     				//catch捕获异常
           System.out.println("exception");
		}finally {      						//处理善后工作
            System.out.println("finally");
        }

final,finally和finalize的区别

  • final:修饰类类不能被继承;修饰方法方法不能被重写;修饰变量,变量为自定义常量,只能被赋值一次
  • finally: 是异常处理语句的一部分,finally括号内的代码无论是否发生异常,都会被执行,除非JVM提前退出
  • finalize:是Object中的方法,被protected修饰,需要子类重写;作用是在gc垃圾回收器回收垃圾时,该方法执行

throw 一个异常对象

  • 异常对象有两种:编译时期异常和运行时期异常

throws 异常的类名,可以跟多个

抛出异常,可以抛JDK提供好的异常类对象,也可以抛自定义对象

  • throw new Exception(); //抛的是编译时期异常(在此处创建了一个异常)

异常的处理:

  •  1.编译时期异常:
    
    • 必须要处理,要么try,要么throws
  •  2.运行时期异常:
    
    • 可以不做任何处理,大多都是数据不合理导致的

try和throw的选择:

1.优先选择用try

2.后续程序继续运行就用try否则用throw

3.自定义的异常:继承exception的异常为编译时异常

​ 继承runtime的异常为运行时异常

IO流:

  • 流的分类

    • 按数据单位不同分为:字节流(8bit),字符流(16bit)
    • 按数据流向不同分为:输入流,输出流
  • 抽象类 字节流 字符流

  • 输入流 InputStream Reader

  • 输出流 OutputStream writer

  • FileInputStream将文件中的数据读入到内存

  • FileOutputStream:将内存中的数据以字节的形式写出到文件中

    • 第二个参数为true,会将数据追加到文件末尾
  • 读取大文件时建议使用缓冲区

  • read(byte[] bys) :将数据读入到字节数组中,并将读到的长度返回

  • write(byte[] bys, int off, int length):从字节数组中读取数据

    • byte.length=1024*8不会占多太多内存,效率相对来说最高,做到和内存和效率的平衡点
  • available()获取读的文件所有的字节个数

  • 字节缓冲区流:Buffered操作的是两个数组

  • BufferedInputStream():创建一个缓冲区

  • BufferedOutputStream():将缓冲区数据写出

  • flush()方法:用来刷新缓冲区的,刷新后可以再次写出

  • close()方法:用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出

  • 字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组

  • 写出回车换行 write("\r\n".getBytes());

  • 加密可以使用异或

  • bos.write(b ^ 111)
    
  • 字符流:可以读文本,不推荐文件;只读取文本或者写出一段文本可以使用

  • FileReader(File file):给定要读的文件

  • FileWriter(File file,boolean append):构建一个文件对象,如果存在则会清空文件数据

  • BufferedReader

    • public String readLine():一次读取一行字符,以字符串形式返回,不读取回车换行符
  • BufferedWriter

    • public void newLine():写入换行符
  • java.io.BufferedInputStream extends InputStream BufferedInputStream:字节缓冲输入流

  • java.io.BufferedOutputStream extends OutputStreamBufferedOutputStream:字节缓冲输出流

  • 字符流 BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。

  • 字符流 BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。

  • java.io.InputStreamReader extends Reader InputStreamReader:使用指定的charset读取字节并将其解码为字符

  • java.io.OutputStreamWriter extends Writer OutputStreamWriter:使用指定的 charset 将要写入流中的字符编码成字节。

    • OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。

    • OutputStreamWriter(OutputStream out, String charsetName)创建使用指定字符集的 OutputStreamWriter。

    • OutputStream out:字节输出流,可以用来写转换之后的字节到文件中

    • String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/utf-8,gbk/GBK...不指定默认使用UTF-8

  • SequenceInputStream:队列流,序列流:字节输入流

    • SequenceInputStream(InputStream s1, InputStream s2):其他输入流的逻辑连接,从第一个直到文件结束达到读取,然后读取第二个
    • SequenceInputStream(Enumeration<?>):输入流的有序集合
  • RandomAccessFile:随机访问流,可以对文件读和写

    • void seek()设置文件指针偏移量,从这个文件的开始,在下一个读或写发生。
    • long length():返回此文件的长度
  • 对象流:

    •  **ObjectOutputStream:可以将对象写入到文件中,文件打开看不懂**
      
    •  将内存中的对象存入到文件中,内存条中的数据在代码执行完毕或者断电情况下都会丢失
      
    •  文件是存在于磁盘(硬盘中),断电后不会丢失
      
    •  将内存条中的数据存入到文件中,使得它长久保存下来,这种操作我们称为持久化,也称为序列化(串行化)
      
    •  **ObjectInputStream:也可以从文件中读取对象**
      
    •  将文件中的对象(内容)读取到内存中
      
    •  将磁盘中文件中的数据读取到内存中,这种操作我们称为反序列化(反串行化)
      
  • 对象流的注意事项:

    • 	1.要要序列化的对象对应的类必须实现Serializable
      
    • 	2.readObject读取到文件末尾不会返回-1,也不会返回null,直接抛异常,使得我们无法像之前那样写while(())
      
    • 	解决方式1: 当需要将多个对象序列化到文件中,我们先将多个文件存入到集合(List)中,然后将集合对象序列化
      
    • 	解决方式2: 使用死循环读,直到报异常,处理异常并结束循环
      
    • 	实现序列化接口后,在类中建议创建一个自定义常量用来记录序列化的版本(用来记录类是否发生了变化)
      
    • 	private static final long serialVersionUID = 值;
      
    • 	序列化的类实现了序列化接口,在序号化和反序列化时,系统会随机生成一个serialVersionUID,并判断该值是否相同,如果相同就正常,如果不相同就报InvalidClassException(无效类异常)
      
    • 	为了避免在序列化和反序列出现以上异常,我们人为主动的给他定义一个serialVersionUID,能够正常反序列化
      
  • writerObject(); //序列化
    readObject(); //反序列化

  • 打印流:PrintStream:字节输出对象

  • ​ PrintWriter:字符输出对象

posted @ 2022-03-07 21:03  ice204  阅读(68)  评论(0)    收藏  举报