下面演示java中处理I/O操作时的异常的正确方式,总结自书籍,书名忘啦~

先看一种不正确的方式

方式一:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test3 {
public static void main(String[] args) {
FileInputStream fis = null;
byte[] buffer = new byte[1024];
int temp = 0; //打开文件
try {
fis = new FileInputStream("e:/test_file/a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} //访问文件
try {
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
}
} catch (IOException e) {
e.printStackTrace();
} //关闭文件
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} }
}

注意到前面的代码在读取文件的try代码块完成后关闭了文件流,虽然这种方法在某些情况下有用,但是Java提供了一种在通常情况下更好的方法。即,在finally代码块中调用close()。在这种方法中,访问文件的所有方法都包含在一个try代码块中,finally代码块用来关闭文件这样,无论try代码块如何终止,文件都会被关闭。使用前面的示例,下面的方式二演示了如何重新编码读取文件的try代码块

方式二:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test4 {
public static void main(String[] args) {
FileInputStream fis = null;
byte[] buffer = new byte[1024];
int temp = 0; //打开文件
try {
fis = new FileInputStream("e:/test_file/a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} //访问文件
try {
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

这种方法的优点之一是,如果访问文件的代码由于某种与I/O无关的异常而终止,finally代码块仍然会关闭文件。虽然在这个例子中这不是一个问题,因为在发生未预料到的异常时程序简单地结束了,但是在大型的程序中却可能造成很多麻烦。使用finally可以避免这些麻烦

有时,将程序中打开文件和访问文件的部分放到一个try代码块,然后使用一个finally代码块关闭文件,这样更加简单。例如,下面是另一种编写方式

方式三(推荐方式):

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test4 {
public static void main(String[] args) {
FileInputStream fis = null; //先初始化为null
byte[] buffer = new byte[1024];
int temp = 0; try {
//打开文件
fis = new FileInputStream("e:/test_file/a.txt"); //访问文件
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件
try {
if(null != fis) { //非空判断
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

在这种方法中,注意fis被初始化为null。然后,在finally代码块中,只有fis不为null时才关闭文件。可以这么做的原因是,只有文件被成功打开,fis才不为null。因为,如果在打开文件的过程中出现异常,就不应调用close()方法,否则会报NullPointerException。推荐使用这种方式!

前面示例中的try/catch序列还可以更加精简。因为FileNotFoundException是IOException的一个子类,所以不需要单独捕获。例如,这个catch语句可以用来捕获两个异常,从而不必单独捕获FileNotFoundException。这种情况下,将显示描述错误的标准异常信息。

方式四:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test4 {
public static void main(String[] args) {
FileInputStream fis = null;
byte[] buffer = new byte[1024];
int temp = 0; try {
//打开文件
fis = new FileInputStream("e:/test_file/a.txt"); //访问文件
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
} } catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件
try {
if(null != fis) { //非空判断
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

在这种方法中,任何错误,包括打开文件时发生错误,都会被一个catch语句处理。这种方法十分简洁。但要注意,如果想单独处理打开文件时发生的错误(例如,用户错误地键入了文件名),这种方法就不合适了。

最后放一张图

J01-Java IO流总结一 《异常捕获》的更多相关文章

  1. java io流 运行错误时,保存异常到文件里面

    java io流 运行错误时,保存异常到文件里面 下面这个实例,运行后,输入数字,为正确,如果输入字符串,则报错,保存错误信息 //运行错误时,保存异常到文件里面 //下面这个实例,运行后,输入数字, ...

  2. 【Java基础】Java IO流的总结

    Java IO流分为输入流和输出流,而输入流和输出流中又分字符流和字节流.顾名思义,输入流则是输入到程序中计算,输出流是把程序的结果输出到文件或者设备.而字符流输入输出以字符为单位,字节流则是以字节为 ...

  3. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  4. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  5. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  6. Java IO流学习总结八:Commons IO 2.5-IOUtils

    Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...

  7. Java IO流学习总结一:输入输出流

    Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...

  8. Java IO流详尽解析(转)

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. java IO流 总结

    [-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input  Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...

  10. 学习笔记-java IO流总结 转载

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

随机推荐

  1. Devexpress VCL Build v2013 vol 13.2.5 发布

    支持xe6 了,但是承诺的功能在哪里? What's New in 13.2.5 (VCL Product Line)   New Major Features in 13.2 What's New ...

  2. 2018.08.04 spoj TTM to the moon(主席树)

    spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...

  3. js数组合并(一个数组添加到另一个数组里面)方法

    js定义两个数组. var arrA=[1,2,3]; var arrB=[4,5,6]; 要实现[1,2,3,4,5,6],如果直接arrA.push(arrB); 则arrB只会作为了arrA的一 ...

  4. 命令行生成war包

    1.找到自己的代码位置 2.进入cmd界面 3.进入对应的目录 4.执行命令 5.就会开始自动打包 6.在文件夹下生成对应的war包

  5. linux上安装tomcat

    这里采用离线解压tar.gz的方式安装 下载: wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.33/bin/apache-tomc ...

  6. Python 运行 Python hello.py 出错,提示: File "<stdin>" , line 1

    写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...

  7. 关于iOS的自动弹出键盘问题

    -(void)viewWillAppear:(BOOL)animated {     [super viewWillAppear:animated];     [self.textField beco ...

  8. 类之间关系理解:组合>聚合>关联>依赖;实现,继承

    类之间关系理解:组合>聚合>关联>依赖:实现,继承 1. 从类之间的关系来看,不外乎以下几种 组合>聚合>关联>依赖:实现,继承 且可以分为以下两类: (1)实现, ...

  9. sqlserver错误2,error 40

    打开配置管理器:开始-> sqlserver2014->配置工具->配置管理器 选择sqlserver服务,并将右侧箭头的指向右击设为启动就OK了

  10. BitAdminCore框架更新日志20180523

    20180523更新内容 本次更新两个内容,一是增加视频处理功能,二是增加定时服务功能. 视频处理 定时服务 BitAdminCore框架,用最少的代码,实现最多的功能 本次新暂未发布,后续有空发布 ...