java学习笔记之IO异常的处理方式

IO异常的处理方式

import java.io.*;
class FileWriterDemo2
{
	public static void main(String[] args)
	 {
		try
		{
			FileWriter fw=new FileWriter("demo.txt"); //调用了Windows资源。
			/*
			凡是能和设备上的数据发生数据关系,能去处理的,都会发生IO异常。无论读、写或是创建。
			*/
			fw.write("abcdefg");
			 //如果分几句写几个try-catch的话,就没有意义了。所以将几句放在一起。
		}
		catch (IOException e)
		{
			System.out.println(e.toString());
		}
		/*关流是一定要执行的,所以可以放在finally中。*/
		finally
		{
			fw.close();
		}
	}
}

写到这里,运行一下:
发现提示fw.close();找不到符号。
原因是:
现在总共有三个代码块,在try代码块中创建的对象,在finally中访问不到。

那可不可以将创建对象的语句写在try之前呢?
这是不可以的,因为当“new FileWriter(“demo.txt”)”出现,就会出现问题。因为它是抛异常。
应该:
在外边建立引用,在try内进行初始化
即:

		import java.io.*;
		class FileWriterDemo2
		{
			public static void main(String[] args)
			{
				FileWriter fw=null;
				try
				{
					fw=new FileWriter("demo.txt"); 
					fw.write("abcdefg");
				}
				catch (IOException e)
				{
					System.out.println(e.toString());
				}
				finally
				{
					fw.close();
				}
			}
		}

这样,fw变量就作用于整个函数。

写到这里,再运行一下:
发现还是这一句"fw.close();"出现异常。

原因是:
原本三句话都发生了异常,而现在仅处理了两句,
所以,"fw.close();"需要单独try一下。
即:

		import java.io.*;
		class FileWriterDemo2
		{
			public static void main(String[] args)
			{
				FileWriter fw=null;
				try
				{
					fw=new FileWriter("demo.txt"); 
					fw.write("abcdefg");
				}
				catch (IOException e)
				{
					System.out.println(e.toString());
				}
				finally
				{
					try
					{
						fw.close();
					}
					catch (IOException e)
					{
						System.out.println(e.toString());
					}
				}
			}
		}

此时,编译正确!

那如果“fw=new FileWriter(“demo.txt”); ”变为k盘下某个路径(不存在k盘)
他会报告两次异常
原因是:
1. 指定路径不存在
2. 此时,对象是否创建成功呢?
当然没有成功,因为初始化时抛出了异常,代表初始化失败,对象不存在。所以fw为空。
而到了finally中,fw为空,不能调用close
所以应该:

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

此时就只有找不到路径这一个异常了。需要使用者去解决一下。

以上就是一个标准的IO异常处理程序。

注意:finally中,一定要对关闭的流对象进行不等于空的判断

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值