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/LocalRepository/tree/master/ExceptionMess

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

此外:

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

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

时间: 2024-10-17 00:24:01

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

输出异常信息

Writer out = new StringWriter(); PrintWriter s = new PrintWriter(out); // 创建不带自动行刷新的新 PrintWriter. exception.printStackTrace(s); //将异常信息放入out中 msg = out.toString(); exceoption的printStackTrace(PrintWriter p) 从Throwable 继承来(public class Exception exten

Java输出控制台信息到文件中

import java.io.File; import java.io.IOException; import java.io.FileOutputStream; import java.io.PrintStream; public class B { public static void main(String[] args)throws IOException { File f=new File("e://out.txt"); FileOutputStream fileOutput

Java:异常的处理

异常分两种大的异常类型,运行时异常和受检查异常. 用户既可以使用系统的异常类来处理异常信息,也可以创建系统的异常类的子类来自定义异常,这种方式比较灵活,虚拟机可以报出自己设置的异常信息,清楚明白. 1.运行时异常 运行时异常的特点时java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即时没有有try---catch语句捕获它,也没有使用throws语句抛出它,还是会编译通过. 2.受检查异常 除了运行异常外,其他异常都属于受检查异常,这种异常的特点是要么用try...catch捕获处

java之异常的捕获及处理

在java中程序的错误主要是语法错误和语义错误(也就是逻辑错误). java中异常处理语句的格式: try{ //有可能出现异常的语句 }catch(异常类 异常对象){ //编写异常的处理语句 }catch(异常类 异常对象){ //编写异常的处理语句 }finally{ 一定会运行的代码: } 在java的异常结构中,有两个最常用的类,分别是Exception和Error,都是Throwable的子类. Exception:一般表示的是程序中出现的问题,可以直接使用try....catch处

web.xml配置错误页面,及输出错误信息

1.需要在web.xml中配置相关信息 [html] view plain copy print? <!-- 默认的错误处理页面 --> <error-page> <error-code>403</error-code> <location>/403.html</location> </error-page> <error-page> <error-code>404</error-code&g

JAVA基础——异常详解

阅读目录 一.异常简介 二.try-catch-finally语句 三.throw和throws关键字 四.java中的异常链 五.结束语 JAVA异常与异常处理详解 回到顶部 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都继承于Throwable类.Throwable主要包括两个大类,一个是Error类,另一个是Exception类: 2.其

java异常信息日志输出

当程序运行异常时,e.printStackTrace()会打印出异常.但是很多时候我们希望将这些异常输出到日志中,以便日后可以随时查看到,可以通过这些异常快速的找到程序发生异常的代码. 那么有办法可以将异常的详细信息输出到文件吗?答案是肯定的. 程序: public static String getTrace(Throwable t) { StringWriter stringWriter= new StringWriter(); PrintWriter writer= new PrintWr

JAVA之IO技术-将java程序的异常信息保存在文件中

package ioTest.io2; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.Properties; /* * 将应用程序的异常信息输出到指定的log文件中 */ public class ExceptionToFile { public static void main(String[] args) throws FileNotFoundException { int

关于jsp页面中:The superclass &quot;javax.servlet.http.HttpServlet&quot; was not found on the Java Build Path异常信息解决

1.异常信息截图 2.异常发生的原因: 在java的构建环境中没有找到父类:javax.servlet.http.HttpServlet这个类.我们得知这个类所需要的jar包为servlet.jar.我们将该jar包加入到java构建路径中即可.因为该jar包在tomcat下.所以我们只需要将tomcat总体加入到java运行环境中即可 具体步骤如下: 原文地址:https://www.cnblogs.com/aeon/p/9744632.html