日期:2014-05-20  浏览次数:20936 次

IO操作的小问题,菜鸟求助帖
/*
需求:在实际开发过程中,对出现的异常,我们通常是建立一个日志文件来存储异常信息的
  包括异常发生的时间好异常的内容,是编写类似的异常日志信息程序
思路:1 整体的思路就是要将信息输出到一个文件中,这涉及到IO操作
2 日期时间的格式化操作
  3 异常的处理代码
  只要将这三个整合就可以实现需求了  
 
步骤:1 定义异常捕获和处理代码在catch代码块;
2 在catch代码块中加入文件输出流操作,
3 要写入到文件中的内容包括日期时间,当然写入的是定义好的格式
还有异常的具体信息

*/
package exceptionjournal;
import java.io.*;
import java.util.*;
import java.text.*;
class MathException extends Exception
{
String message;
MathException(String message)
{
super(message);
}
}
class ExceptionJournal
{
public static void main(String []args)
{
try
{
int b=div(6,0);
}
catch(MathException me)
{
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年mm月dd日 HH时mm分ss妙");
String time=sdf.format(d);
PrintStream ps=null;
try
{
ps=new PrintStream("exceptioninformation.txt");
ps.println(time);
ps.println(me.toString());
ps.flush();
}
catch(IOException open)
{
throw new RuntimeException("异常日志文件打开异常");
}
finally
{
try
{
if(ps!=null)
ps.close();
}
catch(IOException close)//为什么这里不可以抛出IOException呢?错误提示为
//在相应的 try 语句主体中不能抛出异常错误IOException
//可是如果把IOException换成Exception就可以了,这是为何啊?
{
throw new RuntimeException("异常日志文件关闭异常");
}
}

}
finally
{
System.out.println("over ");
}

}
public static int div(int a,int b) throws MathException
{
if(0==b)
throw new MathException("除数为0了");
return a/b;
}
}问题在catch语句块

------解决方案--------------------
你笔误吗?
//可是如果把IOException换成Exception就可以了,这是为何啊? 

其实想问?
//如果把IOException换成RuntimeException就可以了,这是为何啊?

运行时异常与编译时异常是有很大概率要被问到的,这些属于基本概念。
1.RuntimeException,也就是运行时异常,表示你的代码本身存在BUG,比如你提到的ArrayIndexOutOfBoundsException,数组下标越界,这个属于代码有问题,数组定义的长度不够实际使用,不处理肯定会报错,如果你操作某个模块发现能正常运行,那只是因为代码还没跑到这个错误的地方而已。。控制台一旦报RuntimeException,就必须要处理。。没有例外的。而且,处理RuntimeException,不是try-catch能解决的。。try-catch在这里使用毫无意义。

2.不是RuntimeException,就是编译时异常,异常只有这两种了。比如你在处理文件流时的I/O问题(IOException),就属于编译时异常。这个时候用thr{}catch 来捕获或者 throws即可。
------解决方案--------------------
探讨

引用:

LZ好像弄错了
不信可以试试的,真的,我也不知道为什么啊

------解决方案--------------------
Java code
/**
     * Closes the stream.  This is done by flushing the stream and then closing
     * the underlying output stream.
     *
     * @see        java.io.OutputStream#close()
     */
    public void close() {
    synchronized (this) {
        if (! closing) {
        closing = true;
        try {
            textOut.close();
            out.close();
        }
        catch (IOException x) {
            trouble = true;
        }
        textOut = null;
        charOut = null;
        out = null;
        }
    }
    }