A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-3-2 22:07  /  5236 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄玉昆 于 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一下才对啊。求解

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个

查看全部评分

13 个回复

倒序浏览
楼主,你第一个try  与catch 抛出的是Exception 异常,后面再try 、catch的时候跑IOException 当然不会抛出异常了
举个例子:抓动物的时候,你前面织了一张超级大的网,在这张大网后面你又弄了一个小网在那候着
试想前面的大网都把动物一个不留的抓完了,后面的小网有什么用呢?
这个异常抛出与我的例子有些相似,你好好理解下
回复 使用道具 举报
官方文档: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:31
楼主,你第一个try  与catch 抛出的是Exception 异常,后面再try 、catch的时候跑IOException 当然不会抛出 ...

我写错了一个地方,第一个catch我抛的是IO异常。
回复 使用道具 举报
李易烜 发表于 2013-3-2 22:53
官方文档:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/PrintStream.html#close()
------------ ...

我写错了一个地方,第一个catch我抛的是IO异常。
回复 使用道具 举报
没有明白你什么意思?
回复 使用道具 举报
  1. try {
  2.        <font color="#ff0000"> ps = new PrintStream("systeminfo.txt");</font>
  3. } catch (<font color="#ff0000">FileNotFoundException e</font>) {
  4.       //这个只会报这个异常吧!                              
  5. }
复制代码
回复 使用道具 举报
因为Properties类的list方法抛出ClassCastException异常,而ClassCastException不是IOException的子类异常
回复 使用道具 举报
自问自答啊   为什么不能再次抛出IO异常呢  求解
回复 使用道具 举报
  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语句后边再加代码一样。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 很给力

查看全部评分

回复 使用道具 举报
朱玉玺 发表于 2013-3-2 23:57
这PrintStream的close方法的源代码,里边没有抛出异常,因为它已经对textOut(它是个BufferWriter)close的IO ...

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

可能你说的是一方面,但是主要的原因是PrintStream,在API文档中有说:PrintStream 永远不会抛出 IOException。所以无需加上这个处理异常的操作
回复 使用道具 举报
李易烜 发表于 2013-3-2 23:04

其实主要原因是PrintStream不需要抛异常的原因。
回复 使用道具 举报
查了下API,支持8楼的说法,list()抛的异常.ClassCastException
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马