下面演示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. linux的零碎知识

    一  nfs服务器 1  NFS的介绍:是Network File System的简写,是网络文件系统.用于分散式文件系统的协定,由sun公司开发的,在1984年向外公布的. 2  NFS的功能:是通 ...

  2. 2018.09.07 bzoj1911: [Apio2010]特别行动队(斜率优化dp)

    传送门 斜率优化dp经典题. 题目中说的很清楚,设f[i]表示前i个数分配出的最大值. 那么有: f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+ ...

  3. 多网卡下对ServerSocket以TCP协议绑定IP和端口的测试

    一.引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统:WCS系 ...

  4. go指针的一个小坑

    几乎可以肯定的说,go语言中除了闭包在引用外部变量的时候是传引用的,其他的时候都是传值的.如果你说形参可以定义为指针.好吧,那么告诉你这个指针的值其实是按照传值的方式使用的. 下面看个很浅显的例子: ...

  5. cuDNN

    https://developer.nvidia.com/developer-program https://developer.nvidia.com/cudnn cuda和cuDNN的关系 http ...

  6. 添加安全认证的webservice

    添加个Key类继承SoapHeader public class KEY : SoapHeader{    public KEY()    {        //        //TODO: 在此处 ...

  7. C++中的inline声明

    C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(i ...

  8. [ucgui] 仪表盘函数

    /* 仪表盘 */ void DrawArcScale(void) { ; ; int i; ]; GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetPen ...

  9. 【转】Swig Getting Started

    Installation Via NPM: $ npm install swig --save Basic Usage Swig has multiple ways to compile and re ...

  10. BitAdminCore框架应用篇:(三)核心套件querySuite入门介绍

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...