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

Java中获取控制台输出的数据 最近由于学习spring boot日志存储到本地的时候,突然想到如果运行报错的话,抛出的异常只显示在控制台上,怎么样获取这个抛出的异常信息就无从下手,搜索几番后才明白,特意写下这个笔记记录一下。......... 阅读详情

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

数学建模国赛B题保姆级攻略:从选题到代码实现的完整流程(2024最新版) 本文提供2024年数学建模国赛B题的保姆级实战攻略,涵盖从赛题解构、模型构建到算法实现与论文撰写的完整流程。文章详细解析了如何快速抓住问题核心、建立数学模型、进行算法求解与结果可视化,并分享了高效团队协作与专业论文写作的关键技巧,助力参赛者系统性地完成从选题到代码实现的全过程。 阅读详情

相关推荐

CanMV K230实战:用MicroPython玩转AI视觉识别(附完整代码)

本文详细介绍了如何使用MicroPython在CanMV K230开发板上实现AI视觉识别,包括环境搭建、摄像头配置、模型部署及优化技巧。通过实战案例(如智能门禁和工业分拣机器人),展示如何快速开发低门槛的嵌入式AI应用,特别适合初学者和嵌入式开发者。

x8y9z0的博客 1143

PrintWriter,StringWriter以及两者配合使用取出异常堆栈信息放入字符串中

PrintWriter是一种过滤流,也叫处理流,也就是能对字节流和字符流进行处理,该类可用来创建一个文件并向文本文件写入数据,可以理解为java中的文件输出(一个非常实用的输出流),java中的文件输入则是java.io.File。 StringWriter类是一种字符输出流可用于将数据(以字符为单位)写入字符串缓冲区,它继承了抽象类Writer 在程序开发中,有时我们不仅需要将异常堆栈信息打印在控制台里或是log里,可能还需要将它存在String中,再送到合适的地方,如错误页面,数据库等。 要取异常

qq_42968105的博客 843

CATIA CAA开发环境搭建避坑指南:从授权服务到VS配置全流程

本文提供了一份详尽的CATIA CAA开发环境搭建避坑指南,涵盖从授权服务(DSLS)安装、Visual Studio版本匹配与集成配置,到编译调试全流程。重点解析了授权服务无法连接、模块加载失败等典型问题的解决方案,强调版本严格对应与纯英文环境是成功搭建的关键。

redis7keeper的博客 572

异常信息捕获并输出

业务异常需要发送文件告警,但每次定位问题都要去翻日志很麻烦,但捕获到异常具体原因和类详细错误行就方便许多了~ 封装方法: public static String getErrorInfoFromException(Exception e) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.pr

luxiangyan1923的博客 785

从按键开机到I2C隔离:手把手拆解一个智能硬件项目里的MOS管实战配置

本文详细解析了智能硬件项目中MOS管的实战配置,从按键开机电路到I2C总线隔离,全面覆盖电源管理和信号隔离的关键技术。通过PMOS+NMOS组合方案实现可靠的开机功能,并采用双NMOS方案优化I2C通信隔离,提升系统稳定性和信号质量。

weixin_28691741的博客 326

ESP32驱动MLX90640红外热成像传感器:从报错到成功运行的完整避坑指南

本文是一份详细的ESP32驱动MLX90640红外热成像传感器的实战指南。针对开发中常见的I2C通信失败、数据全零及‘坏点过多’等报错,文章提供了从环境搭建、驱动库选择与改造到实战代码解析的完整解决方案,并分享了数据滤波、热图生成及多任务优化等高级技巧,帮助开发者高效避坑,实现稳定运行。

weixin_29191669的博客 95

java printwriter 文件_关于java:如何将PrintWriter转换为String或写入文件?

我正在使用JSP生成动态页面,我想将此动态生成的完整页面保存为文件存档。在JSP中,所有内容都写入PrintWriter out = response.getWriter();在页面的末尾,在向客户端发送响应之前,我想要保存此页面,无论是在文件中还是在缓冲区中作为字符串,以便以后处理。如何保存Printwriter内容或转换为String?请检查以下问题的答案。stackoverflow.com...

weixin_34327800的博客 1092

26、电子测量与旋转编码器控制技术解析

本文深入解析了电子测量中的电感测量技术与旋转编码器的控制方法。介绍了LC电路振荡原理、滤波器类型及其应用,并通过代码实现了基于脉冲宽度的电感值计算。对比了陶瓷电容与电解电容在高频测量中的性能差异。在旋转编码器部分,详细阐述了其工作原理,提出了抖动问题和检测遗漏的解决方案,包括中断检测法和基于4位状态映射的高精度控制方法。文章还探讨了相关技术在电力系统、通信设备、工业自动化和智能家居中的应用,并展望了高精度、智能化、小型化和无线化的发展趋势,为电子系统设计提供了实用指导和技术参考。

elastic6hunter的博客 97

java stringwriter类_我什么时候应该使用Java的StringWriter?

它是一个专门的Writer,它将字符写入StringBuffer,然后我们使用类似toString()的方法来获取字符串结果.当使用StringWriter时,您希望写入字符串,但API需要Writer或Stream.它是一个妥协的,你只有在必须时才使用StringWriter,因为StringBuffer / StringBuilder写字符更加自然和容易,这应该是你的首选.以下是使用Strin...

weixin_39571938的博客 333

基于 Qt C++ 的战术通信终端

logMessage(QString("新客户端连接来自: %1:%2").arg(incomingTcpSocket->peerAddress().toString()).arg(incomingTcpSocket->peerPort()));logMessage(QString("服务器已启动,在 [%1]:%2 监听IPv6连接...").arg(ui->lineEditAddress->text()).arg(port));

寒寒豆豆软件公司的博客 77

如何使用 Conda 安装 Qiskit(详细教程)

本文介绍了使用conda安装Qiskit量子计算工具包的完整流程。首先创建Python 3.10的conda虚拟环境(qiskit_env),然后安装Qiskit核心包及可视化组件(注意Mac用户的安装命令差异)。接着注册IPython内核并测试环境,通过量子电路创建与可视化演示验证安装成功。该教程为量子计算开发提供了简洁的环境配置指南,适合研究者和开发者快速搭建Qiskit开发环境。

猿小白的博客 565

java获取完整异常信息内容

java获取完整异常信息

M的博客 2126

Plant Simulation 双深位立库开发系列教程-货架参数化

为了方便用户进行货架参数化,我们需要在交互界面上进行参数调整,右键打开RackLane,打开Dialog,在Rack_tab的tab下创建相应的对象,并创建NumberOfRightRack和NumberOfLeftRack作为数据连接对象。通过Rack._3D.VisibleGraphicGroups := ["default"]来切换需要显示的Rack,当不需要显示则可以Rack._3D.VisibleGraphicGroups := [""]即可。首先,加载默认的HBW库到模型中,确保结构树当中有。

santayana的专栏 1257

java.io包中StringWriter类和PrintWriter类作用

在Java中,StringWriter和PrintWriter是两个用于不同输出需求的类。StringWriter将输出捕获到内存中的一个字符串,而PrintWriter则可以将输出发送到文件、控制台或其他输出流。

chen2017sheng的博客 751

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

StringWriter/PrintWriter

from:http://kanshinu.blogdriver.com/kanshinu/ 异常跟踪在Java中,利用try..catch(..finally)语句可以捕获和处理异常,非常方便。catch块的常见异常处理方式是输出异常,例如把异常输出到日志文件。Exception类有一个printStackTrace()方法,它能够从发生异常的方法中输出堆栈信息,默认输出位置是System.e

小樓東風的专栏 4080

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

StringWriter/PrintWriter在Java异常中的作用

在Java中,利用try..catch(..finally)语句可以捕获和处理异常,非常方便。catch块的常见异常处理方式是输出异常,例如把异常输出到日志文件。 Exception类有一个printStackTrace()方法,它能够从发生异常的方法中输出堆栈信息,默认输出位置是System.err。但是,有时候我们要把堆栈信息输出到System.err之外的其他地方,例如在出现异常时把堆栈信...

田坎上 2285

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 获取异常信息

原文:http://blog.youkuaiyun.com/long95wang/article/details/8089489下面的三个方法都是获取异常的详细信息,或许的异常详细信息以字符串的形式返回,保持栈堆载的风格   方法一: public static String getExceptionAllinformation(Exception ex){         String sOut = "";

NFA_YY的博客 3077

Java打印栈内的异常信息,可用于向前端输出

以下方法用于打印栈内的异常信息,keyo

孟飞阳的专栏 678

java stringwriter,java-StringBuilder与StringWriter和PrintWri进行字符串汇编

我最近遇到了一个我以前从未见过的习惯用法:StringWriter和PrintWriter进行的字符串汇编。 我的意思是,我知道如何使用它们,但是我一直使用StringBuilder。 有一个具体的理由偏爱一个? 对我来说,StringBuilder方法似乎更自然,但这只是样式吗?我在这里查看了几个问题(包括最接近的一个问题:StringWriter或StringBuilder),但没有一个问题的...

weixin_42651748的博客 322

OutputStreamWriter Writer PrintWriter

OutputStreamWriter是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。(即用字符流的方式写字节流) 例如: InputStreamReader isr = new InputStreamReader (new FileInputStream (FileDescriptor.in));    OutputStreamWriter osw =

WITNESS 2537

stringwriter java,我什么时候应该使用Java的StringWriter?

What is a Java StringWriter, and when should I use it?I have read the documentation and looked here, but I do not understand when I should use it.解决方案It is a specialized Writer that writes characters...

weixin_33212575的博客 184

Java字符输出流Writer

字符输出流Writer 本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括: 字符输出流基类:Writer 字节流转字符流:OutputStreamWriter//往字节输出流中写字符 字符文件写入相关:FileWriter//往文件中写字符 字符数组转字符流:CharArrayWriter...

狸花猫的专栏 411

java throwable用法_如何将异常Throwable转换为String字符串进行转换或打印输出printWriter...

对于异常Throwable内容需要过滤或解析转换后再输出,相应大家用的最多的应该是e.printStackTrace将异常内容直接打印出来,其实还有void java.lang.Throwable.printStackTrace(PrintWriter s)可以将堆异常输出到PrintWriter,用法如下packagecom.xwood.demo.main;@b@@b@importjava....

weixin_39933484的博客 1721
上一篇: Java自定义注解小结
下一篇: 小玩Spring3.X的SpEL表达式
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值