黑马程序员技术交流社区

标题: 为什么会出现不让我抛IO异常的情况 [打印本页]

作者: 黄玉昆    时间: 2013-3-2 22:07
标题: 为什么会出现不让我抛IO异常的情况
本帖最后由 黄玉昆 于 2013-3-3 07:38 编辑

为什么会出现不让我抛IO异常的情况,提示:在相应的 try 语句主体中不能抛出异常错误IOException
  1. import java.util.*;
  2. import java.io.*;

  3. class SystemInfo
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 PrintStream ps = null;
  8.                 try
  9.                 {
  10.                         //获取系统信息:
  11.                         Properties pop = System.getProperties();
  12.                         //创建输出流对象,将输出流中数据存入指定文件中
  13.                         ps = new PrintStream("systeminfo.txt");
  14.                         //将属性列表输出到指定的输出流
  15.                         pop.list(ps);
  16.                 }
  17.                 catch (IOException e)
  18.                 {
  19.                         throw new RuntimeException("获取系统信息失败。");
  20.                 }
  21.                 //关闭输出流对象
  22.                 finally
  23.                 {
  24.                         if(ps!=null)
  25.                         {
  26.                                 try
  27.                                 {
  28.                                         ps.close();
  29.                                 }
  30.                                 catch (IOException e)//这里的问题,需要注释掉finally才行。
  31.                                 {
  32.                                         throw new RuntimeException("输出流关闭失败。");
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. }
复制代码
编译时,提示错误,在最后一个catch上,不能抛IOException,这是怎么个情况,我命名使用输出浏了,需要关闭才对啊,而且这里用到IO了,应该要try一下才对啊。求解

作者: cyh8807    时间: 2013-3-2 22:31
楼主,你第一个try  与catch 抛出的是Exception 异常,后面再try 、catch的时候跑IOException 当然不会抛出异常了
举个例子:抓动物的时候,你前面织了一张超级大的网,在这张大网后面你又弄了一个小网在那候着
试想前面的大网都把动物一个不留的抓完了,后面的小网有什么用呢?
这个异常抛出与我的例子有些相似,你好好理解下
作者: 李易烜    时间: 2013-3-2 22:53
官方文档:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/PrintStream.html#close()
----------------------------------
public void close()
Close the stream. This is done by flushing the stream and then closing the underlying output stream.
关闭流。通过刷新流然后关闭底层输出流,完成此操作。(根本就没有需要抛出的异常嘛!)

Overrides:
close in class FilterOutputStream
See Also:
OutputStream.close()
作者: 黄玉昆    时间: 2013-3-2 22:59
赵彦辉 发表于 2013-3-2 22:31
楼主,你第一个try  与catch 抛出的是Exception 异常,后面再try 、catch的时候跑IOException 当然不会抛出 ...

我写错了一个地方,第一个catch我抛的是IO异常。
作者: 黄玉昆    时间: 2013-3-2 22:59
李易烜 发表于 2013-3-2 22:53
官方文档:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/PrintStream.html#close()
------------ ...

我写错了一个地方,第一个catch我抛的是IO异常。
作者: 李易烜    时间: 2013-3-2 23:01
没有明白你什么意思?

作者: 李易烜    时间: 2013-3-2 23:04
  1. try {
  2.        <font color="#ff0000"> ps = new PrintStream("systeminfo.txt");</font>
  3. } catch (<font color="#ff0000">FileNotFoundException e</font>) {
  4.       //这个只会报这个异常吧!                              
  5. }
复制代码

作者: 高贵杰    时间: 2013-3-2 23:18
因为Properties类的list方法抛出ClassCastException异常,而ClassCastException不是IOException的子类异常
作者: 克零岚    时间: 2013-3-2 23:36
自问自答啊   为什么不能再次抛出IO异常呢  求解
作者: 朱玉玺    时间: 2013-3-2 23:57
  1. public void close() {
  2.     synchronized (this) {
  3.         if (! closing) {
  4.             closing = true;
  5.             try {
  6.                 textOut.close();
  7.                 out.close();
  8.             }
  9.             catch (IOException x) {
  10.                 trouble = true;
  11.             }
  12.             textOut = null;
  13.             charOut = null;
  14.             out = null;
  15.         }
  16.     }
  17. }
复制代码
这PrintStream的close方法的源代码,里边没有抛出异常,因为它已经对textOut(它是个BufferWriter)close的IOException进行了处理。对于这个永远不会发生的异常,java认为你在说废话,你这是无效的异常。就跟return语句后边再加代码一样。
作者: 黄玉昆    时间: 2013-3-3 07:34
朱玉玺 发表于 2013-3-2 23:57
这PrintStream的close方法的源代码,里边没有抛出异常,因为它已经对textOut(它是个BufferWriter)close的IO ...

玉玺兄说的有道理啊,我也看了关于PrintStream下的说明了:PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。
嘿嘿,原因就在这。
作者: 黄玉昆    时间: 2013-3-3 07:36
高贵杰 发表于 2013-3-2 23:18
因为Properties类的list方法抛出ClassCastException异常,而ClassCastException不是IOException的子类异常 ...

可能你说的是一方面,但是主要的原因是PrintStream,在API文档中有说:PrintStream 永远不会抛出 IOException。所以无需加上这个处理异常的操作
作者: 黄玉昆    时间: 2013-3-3 07:38
李易烜 发表于 2013-3-2 23:04

其实主要原因是PrintStream不需要抛异常的原因。
作者: 孙晋学    时间: 2013-3-3 22:42
查了下API,支持8楼的说法,list()抛的异常.ClassCastException




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2