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

转载于:https://www.cnblogs.com/Evil-Rebe/p/4869389.html

StringWriter/PrintWriter在Java输出异常信息中的作用相关推荐

  1. java获取异常信息_Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  2. java runtime 异常_Java中RuntimeException和Exception

    在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常. 所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 不 ...

  3. python异常信息中最重要的部分是_Python中获取异常(Exception)信息

    前言 异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try-except-程序结 ...

  4. JAVA常见异常信息(保存)

    一. java基础编程中常见的错误(基本类型) 包装类型参与运算时,要做null值校验,否则可能出现空指针异常. 包装类型比较大小,不能使用compare(i,j)直接比较,因为该方法是用来比较基本类 ...

  5. 用java输出学生信息表代码_使用java导出学生成绩表-excel成绩表

    本文简单研究使用java导出学生成绩表,使用到的导出Excel的技术为Apache poi,相关的技术可以查看我之前的文章.之前导出的Excel的格式为03版的xls,使用的jar为poi-3.10- ...

  6. java堆栈异常_Java中获得异常堆栈使用轨迹的方法是。

    Java中获得异常堆栈使用轨迹的方法是. 答:fillinStack() 中国大学MOOC: 互联网金融品牌建设能增加客户对企业的依赖度,促使客户重复使用某个企业产品或服务,从而产生一定的客户黏性 答 ...

  7. java输出空格_java 中的空格怎么写?

    展开全部 \\ 反斜杠\' 单引号' \" 双引号" \uxxxx 以十六进制指定e69da5e887aa62616964757a686964616f31333365666237U ...

  8. JAVA提取字符串信息中的数字(包括整数,小数)工具类

    提供了两个静态方法,getNumber可以返回数字类型的字符串数组,getIndexNumber可以查询某个位置的字符类型的字符串,支持提供默认值,个人认为这个非常重要,以防一些数据问题带来的异常. ...

  9. Python使用traceback.print_exc()输出异常信息

    import tracebacktry:1/0 except Exception as e:print(e)# traceback.print_exc() print(e)打印结果为:division ...

最新文章

  1. 21张让你代码能力突飞猛进的速查表(神经网络、线性代数、可视化等)
  2. go语言使用redis —— redigo
  3. CentOS 6.5服务器安全加固及性能优化
  4. LiveVideoStack主编观察04 /
  5. java 生产者消费者_基于JAVA的生产者消费者问题
  6. 自己搭建的CISCO实验环境
  7. 进程与线程的区别:最浅显易懂的解释
  8. 控制台应用和空项目有什么区别_在公司做的项目和自己在学校做的有什么区别?...
  9. mybatisplus批量插入原理_【学习】热转印工艺原理、特点及工艺流程
  10. 交通运输部:预计五一假期全国客运量2.65亿人次
  11. I00021 有负数项的数列之和
  12. Ubuntu 12.04 root默认密码? 如何使用root登录?
  13. 微信小程序 生成二维码
  14. 2019春季高考计算机试题,山东省2019春季高考模拟考试信息技术试试卷+答案(10页)-原创力文档...
  15. 计算机exo乐谱,History钢琴简谱-数字双手-EXO
  16. 【SAP Basis】SAP用户权限管理
  17. 基于Vector 的AUTOSAR NvM 模块使用
  18. 如何高效Debug(又名如何高效解决问题)
  19. 一个隐藏android应用图标的方法
  20. 一文读懂MEMS技术4大主要分类及应用领域

热门文章

  1. 搭建 Verilog 仿真环境
  2. 何为消息队列,为何使用消息队列,有什么消息队列插件
  3. 线程间通信及虚假唤醒
  4. Python超越Java语言,跃居世界编程语言第2位了!你却还在犹豫学不学Python?
  5. Netlink实现热拔插监控
  6. 暗物质组成原理当然是不存在计算机,暗物质能组成生命吗?小部分暗物质可能会相互作用...
  7. Java try语句的嵌套
  8. 物联网中的 ARM 漏洞利用
  9. Android短信发送流程之普通短信发送(原)
  10. Distributed Systems笔记-middlewares