Java基础之异常、io流

1.异常

  • 必要性:把各种不同类型的异常情况进行分类,用异常类来表示异常处理情况,异常流程的代码和正常代码分离,可以灵活处理异常。
  • 处理异常的两种方法:
    1.在当前方法中通过try···catch语句捕获并处理异常
    2.在方法的声明处通过throws语句声明抛出异常
  • Java异常处理机制:
    • finally语句:任何情况下都必须执行的代码,确保占用的资源被释放。
    • 语法规则:
      1.try代码块不能脱离catch代码块或finally代码块二单独存在。finally代码块必须在catch代码块后面。
      2.在try代码块中定义的变量作用域为try代码块,在catch和finally中不能访问该变量。
      3.当try代码块后面有多个catch代码块时,会把异常对象和catch代码块声明的类型匹配。
    • 异常流程的运行过程:
      1.finally语句不被执行的惟一情况是先执行了用于终止程序的System.exit()方法。零表示正常终止,非零数字表示异常终止。
      2.return方法用于退出本方法,在执行try或catch代码块中的return语句时,如果有finally代码块,会先执行finally代码块。
      3.最好不要在finally代码块中用return语句。

1.1 Java异常类

  • Throwable类常用方法:
    getMassage():返回String类型的异常信息
    printStackTrace():打印跟踪方法调用栈而获得的详细异常信息。
  • 两个直接子类:
    Error类:仅靠程序本无法恢复的严重错误
    Exception类:表示程序本身可以处理的异常
  • 常见的异常:
    java.lang.NullPointerException(空指针异常)
    java.lang.ClassNotFoundException( 指定的类不存在)
    java.lang.NumberFormatException(字符串转换为数字异常)
    java.lang.IndexOutOfBoundsException(数组下标越界异常)
    java.lang.EOFException(文件已结束异常)
    java.lang.ArrayStoreException(数组存储异常)
    java.lang.ClassCastException(数据类型转换异常)
    java.lang.ArithmeticException(数学运算异常)
    java.lang.IllegalAccessException(没有访问权限)
    java.lang.NoSuchMethodException(方法不存在异常)
    java.lang.NoSuchFiledException(文件不存在异常)
    java.lang.InstantiationException(实例化异常)
    java.lang.NoClassDefFoundException(未找到类定义错误)
    java.lang.CloneNotSupportedException(不支持克隆异常)
    java.lang.InterruptedException(被中止异常)
    java.lang.IllegalArgumentException(方法的参数错误)
    java.lang.InstantiationException(实例化异常)
    java.lang.OutOfMemoryException(内存不足错误)
    java.lang.FileNotFoundException(文件未找到异常)
    SecturityException:违背安全原则异常
    SQLException:操作数据库异常
    IOException:输入输出异常
    SocketException:通信异常

1.2区分运行时异常和受检查异常

  • 受检查异常表示程序可以处理的异常,这些异常是可以修复的。
  • 运行时异常表示无法让程序回复运行的异常。

1.3异常处理原则

  • 异常只能用于非正常情况
  • 为一场提供说明文档
  • 尽可能地避免异常,尤其是运行时异常
  • 保持异常的原子性
  • 避免过于庞大的try代码块
  • 在catch语句中指定具体的异常类型
  • 不要在catch代码块中忽略被捕获的异常

2.io流

2.1分类:

按数据流的方向的不同可以分为输入流和输出流
按处理数据单位不同可以分为字节流和字符流
按功能不同可以分为节点流和处理流

2.2所有流类型都分别继承四种抽象流类型

类型字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

2.3节点流和处理流

节点流:可以从一个特定的数据源读取数据
处理流:连接在已存在的流(节点流或处理流)之上,处理数据

2.4 基本方法:

InputStream:
int read()读取一个字节并以整数形式返回,末尾返回-1
int read(byte[] buffer)读取一些列字节存储到一个数组buffer,返回读取的字节数,末尾返回-1
int read(byte[] buffer ,int offset, int length)从offset的位置开始读取length个字节,返回读取的字节数,末尾返回-1
void close()关闭流释放资源
OutputStream:
int write()
int write(byte[] buffer)
int write(byte[] buffer ,int off,int len)
void close()
void flush()将输出流中缓冲的数据全部写出到目的地。先于close()方法执行
Writer:
void write(String string)实际上是调用某个函数toCharArray()转换成字符数组
其他的准换成字符数组,其余类似
Reader和Writer类似

2.5代码实例

①FileInputSream

import java.io.*;
public class TestFileInputStream {
    public static void main(String[] args){
        int b = 0;
        FileInputStream in = null;
        try {
            //路径:/或者两个\\
            in = new FileInputStream("E:\\文学\\demo1\\src\\TestFileInputStream.java");
        } catch (FileNotFoundException e) {
            System.out.println("找不到指定文件");
            System.exit(-1);
        }
        long num = 0;
        try {
            while((b=in.read())!=-1){//相当于文件还没有读到结尾
                System.out.print((char)b);
                num++;//读了多少个字节
            }
            in.close();
            System.out.println();
            System.out.println("共读取了"+num+"个字节");
        } catch (IOException e) {
            System.out.println("文件读取错误");
            System.exit(-1);
            }
        }
}

②缓冲流(处理流)
bufferedReader里面很好用的方法:readLine()一行一行的读取数据

import java.io.*;
public class TestFileInputStream {
    public static void main(String[] args){
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter("E:/文学/demo1/src/data.txt"));
            BufferedReader br = new BufferedReader(new FileReader("E:/文学/demo1/src/data.txt"));
            String s = null;
            for(int i=1;i<=100;i++){
                s = String.valueOf(Math.random());
                bw.write(s);
                bw.newLine();//换行
            }
            bw.flush();//写出,小桶清空(也就是刚写入的东西又重新全部写出,清空缓存)
            while((s=br.readLine())!=null){
                System.out.println(s);
            }
            bw.close();
            br.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}

③print流
有自动的flush功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值