Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Eric Sosman Newsgroups: comp.lang.java.programmer Subject: Re: Avoid creating a stacktrace prior to JDK 1.7 Date: Sat, 01 Oct 2011 16:24:46 -0400 Organization: A noiseless patient Spider Lines: 53 Message-ID: References: <4424828.699.1317485416810.JavaMail.geo-discussion-forums@prng5> <1058576.2212.1317496868028.JavaMail.geo-discussion-forums@prfh23> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sat, 1 Oct 2011 20:25:20 +0000 (UTC) Injection-Info: mx04.eternal-september.org; posting-host="f8igmItKsWs6nM5YanFxAA"; logging-data="7958"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19G4ZY8I+mLlzdjvlMYU8dK" User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 In-Reply-To: Cancel-Lock: sha1:iPIlinK360p00TEnnzp50UtUF7Y= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:8464 On 10/1/2011 4:04 PM, Jan Burse wrote: > Lew schrieb: >> - Rules were made to be broken. > > Yes, a well known common place. > > Now back to the original question of my > post, I was giving the ClassNotFoundException > only as a motivation, can I suppress the > fetching of the backtrace in a Java > Exception object prior to JDK 1.7? Quoth the Java SE 6 Javadoc: "A throwable [sic] contains a snapshot of the execution stack of its thread at the time it was created." That is, the Javadoc promises that a Throwable carries a stack trace. A Throwable with no stack trace breaches the promise, and since that promise was still in force as of 1.6 I deduce that there's no such thing as a stackless Throwable in that version, or that it's a bug if there is. However, it's the trace of the stack that *creates* the Throwable, not necessarily that of the stack that *throws* it. So you could create a Throwable once and throw it as many times from as many different contexts as you like: class MasochismInAction { private static OriginUnknownException mystery = new OriginUnknownException("Ha-ha, can't find me!"); public void foolMeOnce() throws OriginUnknownException { if (iFeelLikeIt) { throw mystery; } } public void foolMeTwice() throws OriginUnknownException { if (Math.random() < 0.3) { throw mystery; } } ... } ... and there you have it: Exceptions without (most of) the expense of filling a stack trace. Also, it must be noted, Exceptions with less ability to help in debugging than almost any others. ("Almost" because I've heard somewhere that the JVM creates a few Throwables like VirtualMachineError in advance, because by the time they're needed the JVM can no longer trust itself to fill them in properly.) Personally, I think "Don't Do That" is sage advice here. -- Eric Sosman esosman@ieee-dot-org.invalid