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

异常处理

程序的容错机制

异常的基本概念

又称为例外,是特殊的运行错误对象
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 %2d 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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值