闲来无事,看看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)

此外:

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

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

StringWriter/PrintWriter在Java输出异常信息中的作用的更多相关文章

  1. 你真的会阅读Java的异常信息吗?

    给出如下异常信息: java.lang.RuntimeException: level 2 exception at com.msh.demo.exceptionStack.Test.fun2(Tes ...

  2. Java输出错误信息与调试信息

    创建一个类,在该类的main()主方法中,使用System类中的out和err两个成员变量来完成调试与错误信息的输出. public class PrintErrorAndDebug { public ...

  3. Java输出double类型中的最小正数和最大正数

    这是<写给大忙人看的java核心技术>中的一道练习题. 1. 输出最大正数值 System.out.println(Double.MAX_VALUE); 直接输出包装类Double的MAX ...

  4. 解决Eclipse启动时报Initializing Java Tooling异常信息

    1.启动Eclipse报错:An internal error occurred during: "Initializing Java Tooling".java.lang.Nul ...

  5. name属性作用+使用$.post()取代name属性在提交表单信息中的作用

    name的用途 1)主要是用于获取提交表单的某表单域信息, 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input.select.textarea.框架元素(iframe.frame.  ...

  6. 在日志中记录Java异常信息的正确姿势

    遇到的问题 今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息. 在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示: l ...

  7. Java:异常的处理

    异常分两种大的异常类型,运行时异常和受检查异常. 用户既可以使用系统的异常类来处理异常信息,也可以创建系统的异常类的子类来自定义异常,这种方式比较灵活,虚拟机可以报出自己设置的异常信息,清楚明白. 1 ...

  8. JAVA基础——异常详解

    JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...

  9. Java常见异常(Runtime Exception )小结(转)

    原文链接:Java常见异常(Runtime Exception )小结 Java异常体系结构呈树状,其层次结构图如图 1所示:           本文重在Java中异常机制的一些概念.写本文的目的在 ...

随机推荐

  1. Core Animation之多种动画效果

    前面介绍了Core Animation基础知识,还有CALayer的简单使用,最终还是有要动画的滴,这里列出几个动画效果,参考下能加深对Core Animation的认识和理解 1.把图片移到右下角变 ...

  2. MySQL5.5.源码安装

    MySQL5.5.34安装需要用到cmke  ncurses-devel yum install -y ncurses-devel cmake gcc gcc-c++ bison 下载http://m ...

  3. Value '0000-00-00' can not be represented as java.sql.Date

    Value '0000-00-00' can not be represented as java.sql.Date 时间 2014-07-30 09:00:50 ITeye-博客 原文  http: ...

  4. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  5. HTTP SOAP Request

    public string SoapRequest(string url, string message, string type, Encoding encoding) { string resul ...

  6. 2.2 Xpath-helper (chrome插件) 爬虫、网页分析解析辅助工具

    1. Xpath-helper下载 可以直接在chrome浏览器中的扩展程序搜索 Xpath-helper进行添加 也可以直接在http://www.chromein.com/crx_11654.ht ...

  7. POJ 3347 Kadj Squares (线段覆盖)

    题目大意:给你几个正方形的边长,正方一个顶点在x轴上然后边与x轴的夹角为45度,每个正方形都是紧贴的,问从上面看能看的正方形的编号 题目思路:线段覆盖,边长乘上2防止产生小数,求出每个正方形与x轴平行 ...

  8. C#获取键盘和鼠标操作的时间的类

    /// /// 创建结构体用于返回捕获时间 /// [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { /// /// 设置结构体 ...

  9. mybatis----增删改查

    转: select使用 : xml代码: <!-- 查询学生,根据id --> <select id="getStudent" parameterType=&qu ...

  10. java计数器CountDownLatch

    CountDownLatch里面有个属性为state,当为零时触发代码往下执行,代码如下: package threadLock; import java.util.Random; import ja ...