zoukankan      html  css  js  c++  java
  • JDK Throwable

    Throwable

    1. 使用大量数组和List常量: private static final StackTraceElement[] UNASSIGNED_STACK = new StackTraceElement[0];

    2. 使用静态内部类

    3. 拥有自身类的成员对象: cause, suppressedExceptions 

    public class Throwable implements Serializable {
    
        // Array & List常量
        private static final StackTraceElement[] UNASSIGNED_STACK = new StackTraceElement[0];
        private StackTraceElement[] stackTrace = UNASSIGNED_STACK;
    
        private static final Throwable[] EMPTY_THROWABLE_ARRAY = new Throwable[0];
    
        private static final List<Throwable> SUPPRESSED_SENTINEL = Collections
                .unmodifiableList(new ArrayList<Throwable>(0));
        private List<Throwable> suppressedExceptions = SUPPRESSED_SENTINEL;
        
        private Throwable cause = this;
    
        // 静态内部内
        private static class SentinelHolder {
    
            public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL = new StackTraceElement("", "", null, Integer.MIN_VALUE);
            // 输出时当stackTrace为空时,即赋予该值
            public static final StackTraceElement[] STACK_TRACE_SENTINEL = new StackTraceElement[] { STACK_TRACE_ELEMENT_SENTINEL };
        }
    
        public final synchronized void addSuppressed(Throwable exception) {
            if (exception == this)
                throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, exception);
    
            if (exception == null)
                throw new NullPointerException(NULL_CAUSE_MESSAGE);
    
            if (suppressedExceptions == null)  
                return;
    
            if (suppressedExceptions == SUPPRESSED_SENTINEL) // suppressedExceptions等于初始值,即创建list
                suppressedExceptions = new ArrayList<>(1);
    
            suppressedExceptions.add(exception);
        }
    
        public void printStackTrace(PrintWriter s) {
            printStackTrace(new WrappedPrintWriter(s));      // 使用静态内部类
        }
    
        private void printStackTrace(PrintStreamOrWriter s) {
            Set<Throwable> dejaVu = Collections.newSetFromMap(new IdentityHashMap<Throwable, Boolean>());
            dejaVu.add(this);
    
            synchronized (s.lock()) {
                // Print our stack trace
                s.println(this);
                StackTraceElement[] trace = getOurStackTrace();
                for (StackTraceElement traceElement : trace)
                    s.println("	at " + traceElement);
    
                for (Throwable se : getSuppressed())
                    se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "	", dejaVu);
    
                Throwable ourCause = getCause();
                if (ourCause != null)
                    ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
            }
        }
    
        private abstract static class PrintStreamOrWriter {
            abstract Object lock();
    
            abstract void println(Object o);
        }
    
        private static class WrappedPrintStream extends PrintStreamOrWriter {
            private final PrintStream printStream;
    
            WrappedPrintStream(PrintStream printStream) {
                this.printStream = printStream;
            }
    
            Object lock() {
                return printStream;
            }
    
            void println(Object o) {
                printStream.println(o);
            }
        }
    
        private synchronized StackTraceElement[] getOurStackTrace() {
            if (stackTrace == UNASSIGNED_STACK || (stackTrace == null && backtrace != null){
                int depth = getStackTraceDepth();
                stackTrace = new StackTraceElement[depth];
                for (int i = 0; i < depth; i++)
                    stackTrace[i] = getStackTraceElement(i);
            } else if (stackTrace == null) {
                return UNASSIGNED_STACK;
            }
            return stackTrace;
        }
    
        private void printEnclosedStackTrace(PrintStreamOrWriter s,
                StackTraceElement[] enclosingTrace, String caption, String prefix, Set<Throwable> dejaVu) {
            assert Thread.holdsLock(s.lock());
            if (dejaVu.contains(this)) {
                s.println("	[CIRCULAR REFERENCE:" + this + "]");
            } else {
                dejaVu.add(this);
                // Compute number of frames in common between this and enclosing
                StackTraceElement[] trace = getOurStackTrace();
                int m = trace.length - 1;
                int n = enclosingTrace.length - 1;
                while (m >= 0 && n >= 0 && trace[m].equals(enclosingTrace[n])) {
                    m--;
                    n--;
                }
                int framesInCommon = trace.length - 1 - m;
    
                // Print our stack trace
                s.println(prefix + caption + this);
                for (int i = 0; i <= m; i++)
                    s.println(prefix + "	at " + trace[i]);
                if (framesInCommon != 0)
                    s.println(prefix + "	... " + framesInCommon + " more");
    
                // Print suppressed exceptions, if any
                for (Throwable se : getSuppressed())
                    se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, prefix + "	", dejaVu);
    
                // Print cause, if any
                Throwable ourCause = getCause();
                if (ourCause != null)
                    ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, prefix, dejaVu);
            }
        }
        
        public final synchronized Throwable[] getSuppressed() {
            if (suppressedExceptions == SUPPRESSED_SENTINEL ||
                suppressedExceptions == null)
                return EMPTY_THROWABLE_ARRAY;
            else
                return suppressedExceptions.toArray(EMPTY_THROWABLE_ARRAY);
        }
        
         public synchronized Throwable getCause() {
             return (cause==this ? null : cause);
         }
    
    }
  • 相关阅读:
    leetcode--Remove Duplicates from Sorted Array
    leetcode--Valid Parentheses
    leetcode--Longest Substring Without Repeating Characters
    leetcode--Combination Sum
    leetcode--Valid Sudoku
    java 4对象群体的组织
    java 3 接口与多态&输入输出流
    java 3类的继承
    java 2类与对象[学堂在线]
    计算机网络{网页开发与服务配置}
  • 原文地址:https://www.cnblogs.com/anxiao/p/6593919.html
Copyright © 2011-2022 走看看