Java IO异常的处理方式

我们想往一个文件里写东西,初始版本:

import java.io.*;

class  FileWriterDemo{
	public static void main(String[] args) {
		FileWriter fw = new FileWriter("demo.txt");		//创建流,打开(如果不存在,新建)文件
		fw.write("abcdefg");					//写入内容
		fw.close();						/关闭流(关闭之前会flush()流)
	}
}

但是以上三句话都会有异常——

第一句:

比如被写成了FileWriter fw = new FileWriter("ttt:\\demo.txt"),这显然是不对的,因为没有ttt这个盘符!

第二句:

写入内容过于庞大,整个电脑硬盘装不下,会有异常。

第三句:

如果流根本没有创建成功,则谈不上关闭。所以会有异常。

所以我们要进行try...catch...处理:

import java.io.*;

class  FileWriterDemo{
	public static void main(String[] args) {
		try{
			FileWriter fw = new FileWriter("demo.txt");
			fw.write("abcdefg");
			fw.close();
		}
		catch (IOException e){
			System.out.println("catch:"+e.toString());
		}
	}
}

这样处理还是不对!比如第二句异常了,则处理异常,那么fw.close()将不会执行,即资源没有被关闭,所以fw.close()这句话无论有没有异常都要执行,要将其放入try...catch...finally...的finally中:

class  FileWriterDemo{
	public static void main(String[] args) {
		try{
			FileWriter fw = new FileWriter("demo.txt");
			fw.write("abcdefg");
		}
		catch (IOException e){
			System.out.println("catch:"+e.toString());
		}
		finally{
			fw.close();
		}
	}
}

这样会编译报错,会说fw.close()的fw无法被找到,原因是fw是在try里面创建的,和finally属于不同的代码块,所以要将fw声明出去:

class  FileWriterDemo{
	public static void main(String[] args) {
		FileWriter fw = null;					//外面声明
		try{
			fw = new FileWriter("demo.txt");		//里面创建
			fw.write("abcdefg");
		}
		catch (IOException e){
			System.out.println("catch:"+e.toString());
		}
		finally{
			fw.close();
		}
	}
}

终于把fw弄得安分了。这样总可以了吧?不行!

把fw.close()放到finally里面之后,相当于这句话一定会被执行,但是这句话的异常没有被处理啊!因为我们把这句话从处理异常的try里面拿出来了,所以我们要重新try...catch一下:

class  FileWriterDemo{
	public static void main(String[] args) {
		FileWriter fw = null;					//外面声明
		try{
			fw = new FileWriter("demo.txt");		//里面创建
			fw.write("abcdefg");
		}
		catch (IOException e){
			System.out.println("catch:"+e.toString());
		}
		finally{
			try{					//在finally里面处理fw.close()的异常,再try一下
				fw.close();
			}
			catch (IOException e){
				System.out.println(e.toString());
			}
		}
	}
}

终于编译通过了!!!

可是,仍然有不恰当的地方——

比如第一句写成FileWriter fw = new FileWriter("ttt:\\demo.txt"),不仅第一个try块会报异常,第二个try块(fw.close()所在的try块)也会报异常--java.lang.NullPointerException,原因是fw创建不成功,自然谈不上关闭,所以会被捕获异常,因此,在关闭之前判断一下会比较好,即:

if(fw!=null)

fw.close();

即finally块要写成这样:

finally{
	try{
		if(fw!=null)
			fw.close();
	}
	catch (IOException e){
		System.out.println(e.toString());
	}
}

或者是这样:

finally{
	if(fw!=null)		//先判断是否为空
		try{
			fw.close();
		}
		catch (IOException e){
			System.out.println(e.toString());
		}
}

终于OK了:

class  FileWriterDemo{
	public static void main(String[] args) {
		FileWriter fw = null;					//外面声明
		try{
			fw = new FileWriter("demo.txt");		//里面创建
			fw.write("abcdefg");
		}
		catch (IOException e){
			System.out.println("catch:"+e.toString());
		}
		finally{
			try{						//在finally里面处理fw.close()的异常,再try一下
				if(fw!=null)
					fw.close();
			}
			catch (IOException e){
				System.out.println(e.toString());
			}
		}
	}
}
时间: 2024-10-23 08:44:56

Java IO异常的处理方式的相关文章

你真的以为了解java.io吗 呕心沥血 绝对干货 别把我移出首页了

文章结构 1 flush的使用场景 2 一个java字节流,inputstream 和 outputstream的简单例子 3 分别测试了可能抛出java.io.FileNotFoundException,java.io.FileNotFoundException: test (拒绝访问.),java.io.FileNotFoundException: test.txt (系统找不到指定的文件.)的所有场景,你再也不怕java.io异常了 4 测试了flush的使用场景 5 给出了flush的源

Java中异常的两种处理方式

异常处理的两种方式: 声明抛出 throws  声明抛出的位置:是在方法声明的位置上使用throws关键字向上抛出异常. 捕捉 try....catch.. public class ExceptionTest03{     public static void main(String[] args){     //创建文件输入流读取文件     //思考:java编译器是如何知道以下的代码执行过程中可能出现异常,     //java编译器是如何知道这个异常发生的几率比较高呢?    //ja

HBase中此类异常解决记录org.apache.hadoop.ipc.RemoteException(java.io.IOException):

ERROR: Can't get master address from ZooKeeper; znode data == null   一定注意这只是问题的第一层表象,真的问题是: File /hbase/.tmp/hbase.version could only be replicated to 0 nodes instead of minReplica 网上很多都是叫用两种方式解决 stop/start  重启hbase 格式化 hdfs namenode -format,不能随随便便就格

hbase异常:java.io.IOException: Unable to determine ZooKeeper ensemble

项目中用到hbase,有时候可能会报一些异常,比如java.io.IOException: Unable to determine ZooKeeper ensemble 等等,当出现这个问题时,某某说是项目中用到线程池的问题导致的,但查看异常之后,并非跟啥线程池有关系,异常信息如下: java.io.IOException: Unable to determine ZooKeeper ensemble at org.apache.hadoop.hbase.zookeeper.ZKUtil.con

java.io.NotSerializableException:异常

java.io.NotSerializableException:异常,创建的pojo类未实现Serializable接口,启动服务器会报此异常,但是貌似对代码功能没影响,或者说暂时未发现有什么影响. 要解决此异常,可通过实现该接口解决. import java.io.Serializable; public class DeptPojo implements Serializable{ private String deptId; private String deptName; privat

java.io.InvalidClassException 异常解决, 实现Serializable接口的注意事项

解决方案: 在类中显式指定 private static final long serialVersionUID = 42L; 类实现序列化接口, 进行序列化反序列化的时候, 抛出 java.io.InvalidClassException 异常 java.io.InvalidClassException: com.xx.Xxx; local class incompatible: stream classdesc serialVersionUID = -783991920331, local

异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null

nutch 运行时异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null 参考:http://www.tuicool.com/articles/faUB73 此页面采用这个是一个分段传输,而nutch爬虫则默认采用了非分段式处理,导致构造GZIP时出错,从而影响了后面的GZIP解压失败. 是否是分段传输可以在Http headers里面看到,如果是分段传输则有:transfe

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

java io流 运行错误时,保存异常到文件里面 下面这个实例,运行后,输入数字,为正确,如果输入字符串,则报错,保存错误信息 //运行错误时,保存异常到文件里面 //下面这个实例,运行后,输入数字,为正确,如果输入字符串,则报错,保存错误信息 import java.io.*; import java.util.*; public class Index{ public static void main(String[] args) throws Exception{ try{ //创建文件

windows 中使用hbase 异常:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

平时一般是在windows环境下进行开发,在windows 环境下操作hbase可能会出现异常(java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.),以前也遇到过这个问题,今天又有小伙伴遇到这个问题,就顺带记一笔,异常信息如下: 2016-05-23 17:02:13,551 WARN [org.apache.hadoop.util.NativeCodeLoa