Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java printStackTrace()和toString()之间的差异_Java - Fatal编程技术网

Java printStackTrace()和toString()之间的差异

Java printStackTrace()和toString()之间的差异,java,Java,我很好奇printStackTrace()和toString()之间有什么区别。 乍一看,他们似乎做了完全相同的事情 代码: 不,这是一个重要的区别!使用toString,您只有异常类型和错误消息。使用printStackTrace()可以获得异常的整个stacktrace,这对调试非常有帮助 System.out.println(toString())的示例: printStackTrace()的示例: 为了生成整个stacktrace的字符串,我通常使用以下方法: public static

我很好奇printStackTrace()和toString()之间有什么区别。 乍一看,他们似乎做了完全相同的事情

代码:


不,这是一个重要的区别!使用toString,您只有异常类型和错误消息。使用printStackTrace()可以获得异常的整个stacktrace,这对调试非常有帮助

System.out.println(toString())的示例:

printStackTrace()的示例:

为了生成整个stacktrace的字符串,我通常使用以下方法:

public static String exceptionStacktraceToString(Exception e)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos);
    e.printStackTrace(ps);
    ps.close();
    return baos.toString();
}

还要注意的是,只需调用
toString()
即可返回一个字符串,并且不会打印任何内容。

不,这有很大的区别。如果您只调用
toString
,它将不会打印任何内容-它将只返回一个字符串。just
e.toString()的catch块是无用的。(正如Martijn指出的,还有堆栈跟踪的问题。)

但就个人而言,我不会使用这两种方法——我会使用一个日志库(log4j、java.util.logging等),它将可丢弃的
本身作为一个参数,并对其进行有效的格式化——包括堆栈跟踪,可能会被截断以避免重复
给出引发异常时异常类的名称,
printStackTrace()
给出应用程序中引发异常时方法执行的条目层次结构

对于代码

    try 
    {
        List<String>  n =new ArrayList<String>();
        String i = n.get(3); 
    }catch (Exception e) {
        e.printStackTrace();
    }
   }

e.toString()
不会像Jon在回答中写的那样打印任何内容。

要将StackTrace转换为字符串,我使用的较短实现是:

public static String exceptionStacktraceToString(Exception e)
{
    return Arrays.toString(e.getStackTrace());
}

我认为您希望获得可丢弃的.printStackTrace()
的输出,就像我正在寻找的一样。我检查了Java源代码,并将
字符串
放在一起,而不是写入
打印流
。它比@MartijnCourteaux解决方案更全面,但我觉得有点像黑客

至于您的答案,您实际上可以看到
Throwable.toString()
只是
Throwable.printStackTrace()
的一部分:


这是我作为
字符串使用的完整堆栈跟踪

public static @NotNull String toString(@NotNull Throwable e) {
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}

有一个名为MgntUtils(由我编写)的开源java库,它提供了几种方法,允许您将stacktrace提取为字符串,还可以选择基于参数包前缀进行过滤。有关方法,请参见javadoc
该库位于,并且

是否有任何方法将stacktrace存储为字符串?+1用于
toString()
返回的特定示例。这个方法也很有用,尽管我更喜欢@RenaudBlue的单行版本。嗯,它们之间有模糊的联系,但它们根本不起作用。我想你是想把
toString()
的结果打印到
系统。呃
…?仅供参考:刚刚发现在Android上你可以直接使用。而且更有用的是,而不是直接打印。但作为一根弦,请注意!如果您的项目使用Apache commons lang,这也可以通过
org.Apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
来实现,这将很好地格式化它。请注意,此输出将不同于
printStackTrace()
,因为
printStackTrace()
递归地包含其原因的stacktrace,而
getStackTrace()
不包含。
    try 
    {
        List<String>  n =new ArrayList<String>();
        String i = n.get(3); 
    }catch (Exception e) {
        e.printStackTrace();
    }
   }
java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at com.o2.business.util.Trial.test(CommonUtilsTest.java:866)
public static String exceptionStacktraceToString(Exception e)
{
    return Arrays.toString(e.getStackTrace());
}
public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}
public static @NotNull String toString(@NotNull Throwable e) {
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}