java ioexception异常_12. Java IO: 异常处理

想要查看此教程的目录请点击:Java IO教程目录贴地址

Streams或Readers/Writers在使用过程中需要是可关闭的。这需要调用close()方法。这需要一点儿思考,看下面的代码:

InputStream input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();

while(data != -1) {

//do something with data...

doSomethingWithData(data);

data = input.read();

}

input.close();

这段代码看起来很好。但是如果doSomethingWithData()方法抛出异常会发生什么?对的!如果发生异常InputStream就不会被关闭了!

下面的代码避免了这样的问题:

InputStream input = null;

try{

input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();

while(data != -1) {

//do something with data...

doSomethingWithData(data);

data = input.read();

}

}catch(IOException e){

//do something with e... log, perhaps rethrow etc.

} finally {

if(input != null) input.close();

}

注意一下现在InputStream是怎么样在finally下关闭的。不管在try代码块中发生了什么,finally中的代码都会被执行。所以InputStream总是会被关闭。

但是close()方法如果抛出异常会发生什么?是说stream已经被关闭了?好吧,你可能要用try-catch去catch住这个异常,像下面这样:

} finally {

try{

if(input != null) input.close();

} catch(IOException e){

//do something, or ignore.

}

}

这样嵌套的去处理问题,看起来非常丑陋,尽管解决了问题。这样不优雅的异常处理代码并不够好,他可以在你的代码中重复的传播。如果写代码时候比较匆忙,忘记异常处理该怎么办?

想象一下如果从doSomethingWithData()抛出一个异常,第一个catch捕捉到那个异常,InputStream在finally关闭。但是,如果从input.close()方法抛出一个异常会发生什么?两个异常中的哪一个应该被传播到调用堆栈?

Java 7中Java IO 的异常处理

Java7开始有一个新的异常处理机制叫做“try with resources”,它是一个语法糖。这个异常处理机制特别的地方在于你使用资源时需要在使用后关闭,那么用它可以解决这个问题,例如使用InputStream,OutputStream时等等。想要学习和它更多相关的内容可以去Try With Resources in Java 7

.

.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NYOJ--927--dfs--The partial sum problem

/*Name: NYOJ--927--The partial sum problemAuthor: shen_渊 Date: 15/04/17 19:41Description: DFS,和 NYOJ--1058--dfs--部分和问题 基本一致&#xff0c;递归的i1注意了&#xff0c;其他没什么 */#include<cstring> #include<iostream> using namespace std; …

php 中如何重载父类的方法_PHP中子类重载父类的方法【parent::方法名】

在PHP中不能定义重名的函数&#xff0c;也包括不能再同一个类中定义重名的方法&#xff0c;所以也就没有方法重载。单在子类中可以定义和父类重名的方法&#xff0c;因为父类的方法已经在子类中存在&#xff0c;这样在子类中就可以把从父类中继承过来的方法重写。子类中重载父类…

HTML5新特性-自定义属性(data-set)

设么是data-set 在HTML5中我们可以使用data-前缀设置我们需要的自定义属性&#xff0c;来进行一些数据的存放 使用data-set可以获取这些数据 实例 <div id2 data-food皮皮虾></div> <script type"text/javascript">var len document.getElementBy…

php提交表单处理,PHP表单处理

我们可以在PHP中创建和使用表单。要获取表单数据&#xff0c;需要使用PHP超级元组&#xff1a;$_GET和$_POST。表单请求可以是get或post。 要从get请求中检索数据&#xff0c;需要使用$_GET&#xff0c;而$_POST用于检索post请求中的数据。PHP GET表单GET请求是表单的默认请求。…

git中--soft和--mixed和--hard区别

想cvbnm&#xff0c;。、、、、、

Python爬虫1-----------placekitten 入门

常用的urllib库有三个类&#xff1a;request&#xff0c;parse&#xff0c;error&#xff0c;request主要完成对url的请求&#xff0c;如proxy&#xff0c;opener&#xff0c;urlopen&#xff0c;parse主要完成对html的解析&#xff0c;error负责异常处理。 1 import urllib.re…

php标签调用,phpcms栏目标签调用代码大全

phpcms栏目标签调用代码大全$CATEGORY[$catid][catid] 栏目id$CATEGORY[$catid][module] 栏目所在的模块$CATEGORY[$catid][type] 栏目类型$CATEGORY[$catid][modelid] 栏目所属模型id$CATEGORY[$catid][catname] 栏目名称$CATEGORY[$catid][style] 栏目名称样式$CATEGORY[$cat…

怎样在mac系统里将文件拷贝到移动硬盘教程

一&#xff1a;下载这个mounty软件 地址https://mounty.app/ 下载安装 打开后菜单栏显示一座山&#xff0c;如下 接着就可以移动了

前端开发规范文档(html,css,js)

首先吐槽一句,本来想上传word文档的,可是发现博客不能上传word文档,这就很尴尬了。 首先声明该规范不是本人写的,网上搜前端规范发现这个很详细就先复制下来做笔记,当然不可能啥都按规范来,每个公司的规范都不一样..仅供参考 前端开发规范文档 Html规范 1 代码风格 1.1 缩进 **…

Error:java: 无效的目标发行版: 11解决方案

我们在使用Idea开发中如果遇到你的JDK版本有“无效的目标发行版: 11”冲突时&#xff0c;要修改以下JDK版本

php str cmp,php中整数的strcmp equivalent(intcmp)

所以我们在PHP中得到了这个函数strcmp(string $1,string $2) // returns -1,0, or 1;但是,我们没有一个intcmp();所以我创建了一个:function intcmp($a,$b) {if((int)$a (int)$b)return 0;if((int)$a > (int)$b)return 1;if((int)$a < (int)$b)return -1;}这只是感觉脏。…

php现在编辑pdf,用PHP编辑PDF?

用PHP编辑PDF&#xff1f;有谁知道在PHP中编辑PDF的好方法&#xff1f; 优选地是开源/零许可证成本方法。:)我正在考虑打开PDF文件&#xff0c;替换PDF中的文本然后写出PDF的修改版本&#xff1f;我过去使用FPDF以编程方式创建了PDF文件&#xff0c;但有时发现它有点笨拙。kayb…

java证明ArrayList是线程不安全的

证明ArrayList是线程不安全的 我们开启100个线程.每个线程向List加100个数据,那么当所有线程执行完成之后应该是10000条,然后就对比一下结果,看看是否为10000条. thread.join(); 是让主线程等待所有的子线程执行完,才执行接下来的语句 运行结果为9988,而且每次运行结果还不一…

[CSS] 点击事件触发的动画

源码 https://github.com/YouXianMing/CSS-Animations/tree/master/Event 效果 细节 1) 一个完整的可回溯的动画至少包括了两种状态,以及两种状态的动画设置,还有其关键帧设置. 2) 设置的值其实只有A,B两种状态而已 3) 动画开始的时候,只设置一个状态值,而不设置状态的动画设置…

discuz邮件设置PHP,Discuz!6.0—如何配置发送邮件的参数

邮件发送方式个教程教大家如何配置邮件参数&#xff0c;主要介绍以下两个个方面&#xff1a;邮件发送方式邮件头的分隔符一、邮件发送方式&#xff1a;Discuz!6.0支持如下三种邮件发送方式&#xff1a;1、通过 PHP 函数的 sendmail 发送(推荐此方式)图1介绍&#xff1a;这种方式…

在AndroidStudio中数据存储第三方数据管理Bmob的使用

---恢复内容开始--- 在日常写代码的过程中我们比较痛苦的就是数据库的建立和使用&#xff0c;那么今天来介绍一下一个第三方的数据管理平台Bmonb。 一、我们首先进入Bmob的官网创建一个账号 Bome官网网址&#xff1a;http://www.bmob.cn/ 二、打开Androidstudio新建一个项目然后…

java for循环的这种写法怎么理解:for (; ; ) {},

无限循环的一种写法 for (;;) {//do something.... } for(a1;a2;a3){} a1:表示初始化&#xff0c;可以省略 a2:表示判断条件&#xff0c;可以省略 a3:表示循环后&#xff0c;变量&#xff08;不一定十循环变量&#xff0c;可以将循环体放在里面——很变态&#xff…

day38 19-Spring整合web开发

整合Spring开发环境只需要引入spring-web-3.2.0.RELEASE.jar这个jar包就可以了,因为它已经帮我们做好了. Spring整合web开发,不用每次都加载Spring环境了。 package cn.itcast.service;public class UserService {public void sayHello(){System.out.println("Hello Sprin…

线程的生命周期及五种基本状态介绍

一.线程的生命周期及五种基本状态 关于Java中线程的生命周期&#xff0c;首先看一下下面这张较为经典的图&#xff1a; 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点&#xff0c;Java中的多线程也就基本上掌握了。主要包括&#xff1a; Java线程具有…