字节流写数据一共有两种方式
-
throws直接抛出异常
-
try...catch进行异常处理,在字节流中因为考虑到需要释放资源,要在此基础上加入finally块进行释放资源
finally:在异常处理时提供finally块来执行所有的清除操作。比如说IO流中的close()方法,释放资源
特点:被finally控制的语句一定会执行,除非JVM退出
标准格式:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有清除操作;
}
代码演示:
/*字节流写数据加异常处理
* */
public class Demo01 {
public static void main(String[] args) {
//try...catch..finally异常处理
//初始化文件对象
FileOutputStream fops =null;
try {
fops = new FileOutputStream(\"E:\\\\abc.txt\");
fops.write(\"123\".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节流异常需要注意的问题:
像上面这种处理情况一般来说不会出现错误,但是如果我们将路径的E盘换成一个根本就不存在的盘之后进行测试的话我们想要看到的情况是在控制台抛出一个异常,提示找不到此路径,但实际上它抛出了两个异常:
1.java.io.FileNotFoundException: M:\\abc.txt (系统找不到指定的路径。)
2.Exception in thread \"main\" java.lang.NullPointerException
at Demo040601.Demo01.main(Demo01.java:21)
第一个异常就是我们所需要的异常提示,但第二个空指针是怎么出现的呢?我们点击这个异常后发现原来它提示是 fops.close()释放资源时出了问题,在代码中查找了一下发现了问题:
我们在创建字节流对象时将它初始化成了null,那么在我们给了一个根本不存在的存储盘后,计算机找不到这个路径下的文件,那么try里面的代码就不能够被执行,那么fops这个对象就是一个null值的状况走到了finally,再调用一个close方法,自然就会报空指针异常
所以,为了解决这个问题和保证程序的健壮性我们需要在finally中进行判断fops是否为空
/*字节流写数据加异常处理
* */
public class Demo01 {
public static void main(String[] args) {
//try...catch..finally异常处理
//初始化文件对象
FileOutputStream fops =null;
try {
fops = new FileOutputStream(\"M:\\\\abc.txt\");
fops.write(\"123\".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
if (fops != null) {//fops为空时,不进行释放资源
try {
fops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
这样,我们就很好地解决了空指针异常问题。
来源:https://www.cnblogs.com/CYan521/p/16107293.html
本站部分图文来源于网络,如有侵权请联系删除。