public static Throwable throwable(@NotNull ValueIn valueIn, boolean appendCurrentStack) { Class type = valueIn.typePrefix(); String preMessage = null; Throwable throwable = ObjectUtils.newInstance((Class<Throwable>) type); final String finalPreMessage = preMessage; final Throwable finalThrowable = throwable; final List<StackTraceElement> stes = new ArrayList<>(); valueIn.marshallable( m -> { final String message = merge(finalPreMessage, m.read(() -> "message").text()); if (message != null) { try { DETAILED_MESSAGE.set(finalThrowable, message); } catch (IllegalAccessException e) { throw Jvm.rethrow(e); } } m.read(() -> "stackTrace") .sequence( stes, (stes0, stackTrace) -> { while (stackTrace.hasNextSequenceItem()) { stackTrace.marshallable( r -> { final String declaringClass = r.read(() -> "class").text(); final String methodName = r.read(() -> "method").text(); final String fileName = r.read(() -> "file").text(); final int lineNumber = r.read(() -> "line").int32(); stes0.add( new StackTraceElement( declaringClass, methodName, fileName, lineNumber)); }); } }); }); if (appendCurrentStack) { stes.add(new StackTraceElement("~ remote", "tcp ~", "", 0)); StackTraceElement[] stes2 = Thread.currentThread().getStackTrace(); int first = 6; int last = Jvm.trimLast(first, stes2); //noinspection ManualArrayToCollectionCopy for (int i = first; i <= last; i++) stes.add(stes2[i]); } try { //noinspection ToArrayCallWithZeroLengthArrayArgument STACK_TRACE.set(finalThrowable, stes.toArray(NO_STE)); } catch (IllegalAccessException e) { throw Jvm.rethrow(e); } return throwable; }