(Java学习随堂笔记)异常处理,IO流,标准输入输出重定向例子(复制文件)

    科技2022-07-21  132

    异常处理

    程序的容错机制

    异常的基本概念

    又称为例外,是特殊的运行错误对象 java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了: 该运行错误的信息 处理错误的方法 每当java运行过程中发生一个可识别的运行错误(即java的类库中有一个与之相对应的异常类)时,即该错误有一个异常类与之相对应时,系统都会产生一个响应的该异常类的对象,即产生一个异常

    Java异常处理机制的优点

    将错误处理代码从常规代码中分离出来 按错误类型和差别分组 对无法预测的错误的捕获和处理 克服了传统方法的错误信息有限的问题(可以自定义异常类,扩展错误信息) 把错误传播给调用堆栈(让上级的调用者模块处理这个信息)

    错误的分类

    错误Error

    致命性的,程序无法处理 Error类是所有错误类的超类

    异常

    非致命性的,可编制程序捕获和处理 Exception类是所有异常类的超类

    非检查型异常

    不期望程序捕获的异常,在方法中不需要声明,编译器也不进行检查 继承自RuntimeException

    非检查型异常—数组越界异常
    package Helloworld111; import java.io.*; public class Helloworld_11 { public static void main(String[] args) { String asd [] = {"1111","2222","3333"}; for ( int i = 0 ;i < 4; i++){ System.out.println(asd[i]); } } } //输出 1111 2222 3333 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Helloworld111.Helloworld_11.main(Helloworld_11.java:7)

    检查型异常

    其他类型的异常 如果被调用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E(或者E的一个超类),对此编译器进行检查

    检查型异常的处理

    声明抛出异常 不在当前方法内处理异常,可以使用throws子句声明将异常抛出到调用方法中; 如果所有的方法多选择了抛出此异常,最后JVM将捕获他,输出相关的错误信息,并终止程序的运行 捕获异常 使用try{}catch(){}块,捕获到所发生的异常并进行响应的处理

    捕获异常的语法

    说明: try语句: 其后跟随可能产生异常的代码块 catch语句: 其后跟随异常处理语句,通常都要用到两个方法: getMessage()–返回一个字符串,对发生的异常进行描述 printStackTrace()–给出方法的调用序列,一直到异常的产生位置 finally语句 不论try代码段是否产生异常,finally后的程序代码都会被执行,通常在这里释放内存以外的其他资源 注意事项: try块中可能产生不同类型的错误,如果并列有多个catch语句捕获多个异常,则一般的异常类型放在后面,特殊的放在前面 首先捕获子类的异常,后捕获超类的异常

    生成异常对象

    三种方式: 由java虚拟机生成 Java类库中的某些类生成 在自己写的程序中生成和抛出异常对象 抛出异常对象都是通过throw语句实现,异常对象必须是Throwable或其子类的实例:

    throw new ThrowableObject(); AirthmeticException e = new AirthmeticException(); throw e;

    声明自己的异常类

    自定义的所有异常类都必须是Exception的子类 声明语法如下:

    public class MyExceptionName extends SuperclassOfMyException{ public MyExceptionName(){ super("Some string explaining the exception"); } }

    I/O流

    方向: 输出流: 输入流: 分工: 节点流:访问文件进行输入输出操作的 处理流:在节点流的基础上对数据加工处理的 内容: 面向字符的流:专门用于处理字符数据,Reader,Writer; 面向字节的流:用于一般目的,InputStream,OutputStream 顶层抽象超类 Object类

    面向字符的流

    源或目标通常是文本文件 实现内部格式和文本文件中的外部格式之间转换 内部格式:16-bit char类型 外部格式:UTF格式,包括ASCII码以及非ASCII码字符

    面向字符的抽象流类–Reader和Writer

    java.io包中所有字符流的抽象超类 Reader提供了输入字符的API Writer提供了输出字符的API 他们的子类可以分为两大类: 节点流:从数据源读入数据或往目的地写出数据 处理流:对数据执行某种处理 多数程序使用这两个抽象类的一系列子类来读入/写出文本信息 例如FileReader/FileWriter用来读/写文本文件

    面向字节的抽象流类–InputStream和OutputStream

    二进制 是用来处理字节流的抽象基类,程序使用这两个类的子类来读写字节信息 分为两部分: 节点流 处理流

    标准输入输出流对象

    System类的静态成员变量 包括: System.in:InputStream类型的,代表标准输入流,默认状态对应于键盘输入 System.out:PrintStream类型的,代表标准输出流,默认状态对应于显示器输出 System.err:PrintStream类型的,代表标准错误信息输出流,默认状态对应与显示器输出

    按类型输入/输出数据

    printf方法 System.out.printf("%-12s is - long",name,l); System.out.printf(“value = %2.2F”,value); %n是平台无关的换行标志 Scanner Scanner s = new Scanner(System.in);//按照类型读取 int n = s.nextInt(); nextByte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShort()

    标准输入/输出重定向(复制文件)

    import java.io.*; public class Redirecting { public static void main(String[] args) throws IOException{ //构造一个输入流,直接关联到Redirexting.java磁盘文件 BufferedInputStream in = new BufferedInputStream(new FileInputStream("Redirecting,java")); //构造一个输出流,直接关联到test.out磁盘文件 PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream("test.out"))); //重新定向 System.setIn(in);//将标准输入流重新定向为in对象,直接关联到Redirexting.java磁盘文件 System.setOut(out);//将标准输出流重新定向为out对象,直接关联到test.out磁盘文件 System.setErr(out);//将标准错误信息输出流重新定向为out对象,直接关联到test.out磁盘文件 //构造一个有缓冲的输入流,缓冲流能使输入的效率更高,但是本身并不执行读文本文件的操作 //所以要以一个读取文本信息的节点流InputStreamReader作为参数,才能构造缓冲流 //InputStreamReader是面向字节的流和面向字符的流之间的桥梁,System.in是一个原生字节流,如果想像文本一样按行处理,需要经InputStreamReader转换成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s; //BufferedReader是能够识别字符和行的,所以可以使用readline()按行读入 while((s = br.readLine()) != null){ System.out.println(s); } in.close(); out.close(); } }
    Processed: 0.010, SQL: 8