throwable.java
来自「gcc3.2.1源代码」· Java 代码 · 共 172 行
JAVA
172 行
// Throwable.java - Superclass for all exceptions./* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License. Please consult the file "LIBGCJ_LICENSE" fordetails. */package java.lang;import java.io.PrintStream;import java.io.PrintWriter;import java.io.Serializable;import java.io.OutputStreamWriter;import java.io.OutputStream;import java.io.FilterOutputStream;import java.io.IOException;/** * @author Tom Tromey <tromey@cygnus.com> * @date October 30, 1998 *//* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Sufficient for compiled code, but methods applicable to * bytecode not implemented. JDK 1.1. *//* A CPlusPlusDemangler sits on top of a PrintWriter. All input is * passed through the "c++filt" program (part of GNU binutils) which * demangles internal symbols to their C++ source form. * * Closing a CPlusPlusDemangler doesn't close the underlying * PrintWriter; it does, however close underlying process and flush * all its buffers, so it's possible to guarantee that after a * CPlusPlusDemangler has been closed no more will ever be written to * the underlying PrintWriter. * * FIXME: This implictly converts data from the input stream, which is * a stream of characters, to a stream of bytes. We need a way of * handling Unicode characters in demangled identifiers. */class CPlusPlusDemangler extends OutputStream{ java.io.OutputStream procOut; java.io.InputStream procIn; java.lang.Process proc; PrintWriter p; /* The number of bytes written to the underlying PrintWriter. This provides a crude but fairly portable way to determine whether or not the attempt to exec c++filt worked. */ public int written = 0; CPlusPlusDemangler (PrintWriter writer) throws IOException { p = writer; proc = Runtime.getRuntime ().exec ("c++filt -s java"); procOut = proc.getOutputStream (); procIn = proc.getInputStream (); } public void write (int b) throws IOException { procOut.write (b); while (procIn.available () != 0) { int c = procIn.read (); if (c == -1) break; else { p.write (c); written++; } } } public void close () throws IOException { procOut.close (); int c; while ((c = procIn.read ()) != -1) { p.write (c); written++; } p.flush (); try { proc.waitFor (); } catch (InterruptedException _) { } } }public class Throwable implements Serializable{ public native Throwable fillInStackTrace (); public String getLocalizedMessage () { return getMessage (); } public String getMessage () { return detailMessage; } public void printStackTrace () { printStackTrace (System.err); } public void printStackTrace (PrintStream ps) { PrintWriter writer = new PrintWriter (ps); printStackTrace (writer); } public void printStackTrace (PrintWriter wr) { try { CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr); PrintWriter writer = new PrintWriter (cPlusPlusFilter); printRawStackTrace (writer); writer.close (); if (cPlusPlusFilter.written == 0) // The demangler has failed... printRawStackTrace (wr); } catch (Exception e1) { printRawStackTrace (wr); } } public Throwable () { detailMessage = null; fillInStackTrace (); } public Throwable (String message) { detailMessage = message; fillInStackTrace (); } public String toString () { return ((detailMessage == null) ? getClass().getName() : getClass().getName() + ": " + getMessage ()); } private native final void printRawStackTrace (PrintWriter wr); // Name of this field comes from serialization spec. private String detailMessage; // Setting this flag to false prevents fillInStackTrace() from running. static boolean trace_enabled = true; private transient byte stackTrace[]; private static final long serialVersionUID = -3042686055658047285L;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?