StringWriter/PrintWriter在Java输出异常信息中的作用

闲来无事,看看JUnit的源代码。刚刚开始看就发现一段有趣的代码:

public String trace() {
        StringWriter stringWriter = new StringWriter();
        PrintWriter writer = new PrintWriter(stringWriter);
        thrownException().printStackTrace(writer);
        StringBuffer buffer = stringWriter.getBuffer();
        return buffer.toString();
    }

此前我并未接触过StringWriter和PrintWriter。对此感到好奇。其实Java的IO是比较复杂的,因为很多类提供的接口需要的IO参数类型是固定的,而我们掌握的数据或者说需要输入的数据却是很多封装类型的,故此经常需要做封装工作。(个人的小体会而已,我对IO一块没有太多经验)

查阅Java API文档,发现了:

void	printStackTrace() 
          Prints this throwable and its backtrace to the standard error stream.
 void	printStackTrace(PrintStream s) 
          Prints this throwable and its backtrace to the specified print stream.
 void	printStackTrace(PrintWriter s) 
          Prints this throwable and its backtrace to the specified print writer.

从上面的信息可以看出,Throwable(Exception继承的一个基类)的错误输入有三种,printStackTrace()是指将异常本身和异常信息输出到标准的错误流;printStatckTrace(PrintStream s)是指将异常本身和异常信息输出到PrintStream的对象中;第三种则是输出到PrintWriter中。

在普通的情况中,如果我们用IDE的话,错误一般是直接输出到Console中,但是有时候我们需要将异常信息输出到文件中、或者是其他网页中,这时候就需要使用带参数的两个API接口。

此处使用PrintWriter,PrintWriter的构造函数比较多种,我使用StringWriter作为构造参数。

为了证实可行性。写一个小程序跑一下。

import java.io.PrintWriter;
import java.io.StringWriter;


@SuppressWarnings("serial")
public class MyException extends Exception{
     public String getPrintStackTraceAsString(){
    	  StringWriter sw = new StringWriter();
    	  PrintWriter pw = new PrintWriter(sw);
    	  printStackTrace(pw);//将异常信息输入到pw(PrintWriter)中
    	  StringBuffer sb = sw.getBuffer();
    	  return sb.toString();
     }
}

public class TestException {
	public static void main(String[] args) {
		try {
			throw new MyException();
		} catch (MyException e) {
			// 由于实现的方法定义在MyException中,所以catch的参数不可以向上转型为Exception
			System.out.println("I am not an average Exception: "
					+ e.getPrintStackTraceAsString());
//			e.printStackTrace();
		}
	}
}

当使用e.printStackTrace()方法时,得到以下结果:

MyException
at TestException.main(TestException.java:4)


而使用我们定义的方法时:

I am not an average Exception: MyException
at TestException.main(TestException.java:4)


相关代码:https://github.com/louiscai/StringWriterWithPrintWriter

======================正文结束==================



此外:

1)Throwable本身也有getStackTrace()方法。

2)关于PrintWriter和PrintStream的区别,可以参考:http://hi.baidu.com/shdren09/item/8b1d2631e78b7abf623aff3f  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,我们可以使用 Map 来实现异常信息的缓存。具体实现如下: ``` public class ExceptionCache { private static Map<String, String> cacheMap = new ConcurrentHashMap<>(); public static String getStackTrace(Throwable throwable) { String key = throwable.getClass().getName() + ":" + throwable.getMessage(); String stackTrace = cacheMap.get(key); if (stackTrace == null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); throwable.printStackTrace(pw); stackTrace = sw.toString(); cacheMap.put(key, stackTrace); } return stackTrace; } } ``` 在上面的代码,我们定义了一个静态变量 `cacheMap`,用来存储异常信息。在 `getStackTrace` 方法,我们首先根据异常名称和异常信息生成一个唯一的 key,然后从缓存获取这个 key 对应的异常信息。如果缓存没有这个异常信息,则使用 StringWriter 和 PrintWriter异常信息转化为字符串,然后将它存入缓存。最后返回这个异常信息字符串。 使用这个异常信息缓存的方法很简单,只需要在需要获取异常信息的地方调用 `ExceptionCache.getStackTrace()` 方法即可: ``` try { // some code that may throw an exception } catch (Exception e) { String stackTrace = ExceptionCache.getStackTrace(e); // do something with the exception stack trace } ``` 这样,我们就可以在程序方便地缓存和获取异常信息了。注意,在实际应用,我们还需要考虑缓存的清理和过期机制,防止缓存过多占用过多内存或者缓存的异常信息已经过期不再有意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值