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)
此外:
1)Throwable本身也有getStackTrace()方法。
2)关于PrintWriter和PrintStream的区别,可以参考:http://hi.baidu.com/shdren09/item/8b1d2631e78b7abf623aff3f
StringWriter/PrintWriter在Java输出异常信息中的作用的更多相关文章
- 你真的会阅读Java的异常信息吗?
		给出如下异常信息: java.lang.RuntimeException: level 2 exception at com.msh.demo.exceptionStack.Test.fun2(Tes ... 
- Java输出错误信息与调试信息
		创建一个类,在该类的main()主方法中,使用System类中的out和err两个成员变量来完成调试与错误信息的输出. public class PrintErrorAndDebug { public ... 
- Java输出double类型中的最小正数和最大正数
		这是<写给大忙人看的java核心技术>中的一道练习题. 1. 输出最大正数值 System.out.println(Double.MAX_VALUE); 直接输出包装类Double的MAX ... 
- 解决Eclipse启动时报Initializing Java Tooling异常信息
		1.启动Eclipse报错:An internal error occurred during: "Initializing Java Tooling".java.lang.Nul ... 
- name属性作用+使用$.post()取代name属性在提交表单信息中的作用
		name的用途 1)主要是用于获取提交表单的某表单域信息, 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input.select.textarea.框架元素(iframe.frame. ... 
- 在日志中记录Java异常信息的正确姿势
		遇到的问题 今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息. 在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),如下所示: l ... 
- Java:异常的处理
		异常分两种大的异常类型,运行时异常和受检查异常. 用户既可以使用系统的异常类来处理异常信息,也可以创建系统的异常类的子类来自定义异常,这种方式比较灵活,虚拟机可以报出自己设置的异常信息,清楚明白. 1 ... 
- JAVA基础——异常详解
		JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ... 
- Java常见异常(Runtime Exception )小结(转)
		原文链接:Java常见异常(Runtime Exception )小结 Java异常体系结构呈树状,其层次结构图如图 1所示: 本文重在Java中异常机制的一些概念.写本文的目的在 ... 
随机推荐
- EnumPrinters用法
			看API描述,不怎么理解,还是在网上找到用法,记载一下: 1: DWORD dwNeeded = 0, dwNum = 0; 2: EnumPrinters(PRINTER_ENUM_LOCAL, N ... 
- Lua手册中的string.len 不解
			Lua手册中的string.len (s) 接收一个字符串,返回其长度. 空串 "" 的长度为 0 . 内嵌零也统计在内,因此 "a\000bc\000" 的长 ... 
- Openjudge-计算概论(A)-与7无关的数
			描述: 一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和. 输入输入为一行,正整数n( ... 
- 2015 Multi-University Training Contest 9
			1001 Expression 式子不好推啊.见官方题解. 式子知道就方便了.处理好组合数和阶乘. 按区间长度从小到大递推完就好. # include <iostream> # inclu ... 
- ***1133. Fibonacci Sequence(斐波那契数列,二分,数论)
			1133. Fibonacci Sequence Time limit: 1.0 secondMemory limit: 64 MB is an infinite sequence of intege ... 
- Quartz 2D中的基本图形绘制
			在iOS中绘图一般分为以下几个步骤: 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 在UIKit中默认已经为我们准备好了一个图形上下文 ... 
- jenkins 中集成JNI的坑
			有包名1.生成class> javac myjni\HelloJNI.java2.生成.h文件> javah -d include myini.HelloJNI3.生成.dll文件> ... 
- HDU 3416  Marriage Match IV
			最短路+最大流 #include<cstdio> #include<cstring> #include<string> #include<cmath> ... 
- Robotium第一天:搭建环境测试微信
			因为要在命令行下运行一些android的工具,所以配置一些环境变量会比较方便: 遇到问题: java -jar re-sign.jar 出现提示android路径没有配置好: 需要配置如下: 配置AN ... 
- Javascript调用 ActiveXObject导出excel文档。
			function makeDataBook(){ var xls = new ActiveXObject ("Excel.Application"); xls.visible = ... 
