001/**
002 * Copyright (c) 2025-2026, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.gnu.org/licenses/lgpl-3.0.txt
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package dev.tinyflow.core.chain.repository;
017
018import java.io.PrintStream;
019import java.io.PrintWriter;
020import java.lang.ref.PhantomReference;
021import java.lang.ref.WeakReference;
022import java.util.HashMap;
023
024public class ChainLockTimeoutException extends RuntimeException{
025    /**
026     * Constructs a new runtime exception with {@code null} as its
027     * detail message.  The cause is not initialized, and may subsequently be
028     * initialized by a call to {@link #initCause}.
029     */
030    public ChainLockTimeoutException() {
031        super();
032    }
033
034    /**
035     * Constructs a new runtime exception with the specified detail message.
036     * The cause is not initialized, and may subsequently be initialized by a
037     * call to {@link #initCause}.
038     *
039     * @param message the detail message. The detail message is saved for
040     *                later retrieval by the {@link #getMessage()} method.
041     */
042    public ChainLockTimeoutException(String message) {
043        super(message);
044    }
045
046    /**
047     * Constructs a new runtime exception with the specified detail message and
048     * cause.  <p>Note that the detail message associated with
049     * {@code cause} is <i>not</i> automatically incorporated in
050     * this runtime exception's detail message.
051     *
052     * @param message the detail message (which is saved for later retrieval
053     *                by the {@link #getMessage()} method).
054     * @param cause   the cause (which is saved for later retrieval by the
055     *                {@link #getCause()} method).  (A <tt>null</tt> value is
056     *                permitted, and indicates that the cause is nonexistent or
057     *                unknown.)
058     * @since 1.4
059     */
060    public ChainLockTimeoutException(String message, Throwable cause) {
061        super(message, cause);
062    }
063
064    /**
065     * Constructs a new runtime exception with the specified cause and a
066     * detail message of <tt>(cause==null ? null : cause.toString())</tt>
067     * (which typically contains the class and detail message of
068     * <tt>cause</tt>).  This constructor is useful for runtime exceptions
069     * that are little more than wrappers for other throwables.
070     *
071     * @param cause the cause (which is saved for later retrieval by the
072     *              {@link #getCause()} method).  (A <tt>null</tt> value is
073     *              permitted, and indicates that the cause is nonexistent or
074     *              unknown.)
075     * @since 1.4
076     */
077    public ChainLockTimeoutException(Throwable cause) {
078        super(cause);
079    }
080
081    /**
082     * Constructs a new runtime exception with the specified detail
083     * message, cause, suppression enabled or disabled, and writable
084     * stack trace enabled or disabled.
085     *
086     * @param message            the detail message.
087     * @param cause              the cause.  (A {@code null} value is permitted,
088     *                           and indicates that the cause is nonexistent or unknown.)
089     * @param enableSuppression  whether or not suppression is enabled
090     *                           or disabled
091     * @param writableStackTrace whether or not the stack trace should
092     *                           be writable
093     * @since 1.7
094     */
095    protected ChainLockTimeoutException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
096        super(message, cause, enableSuppression, writableStackTrace);
097    }
098
099    /**
100     * Returns the detail message string of this throwable.
101     *
102     * @return the detail message string of this {@code Throwable} instance
103     * (which may be {@code null}).
104     */
105    @Override
106    public String getMessage() {
107        return super.getMessage();
108    }
109
110    /**
111     * Creates a localized description of this throwable.
112     * Subclasses may override this method in order to produce a
113     * locale-specific message.  For subclasses that do not override this
114     * method, the default implementation returns the same result as
115     * {@code getMessage()}.
116     *
117     * @return The localized description of this throwable.
118     * @since JDK1.1
119     */
120    @Override
121    public String getLocalizedMessage() {
122        return super.getLocalizedMessage();
123    }
124
125    /**
126     * Returns the cause of this throwable or {@code null} if the
127     * cause is nonexistent or unknown.  (The cause is the throwable that
128     * caused this throwable to get thrown.)
129     *
130     * <p>This implementation returns the cause that was supplied via one of
131     * the constructors requiring a {@code Throwable}, or that was set after
132     * creation with the {@link #initCause(Throwable)} method.  While it is
133     * typically unnecessary to override this method, a subclass can override
134     * it to return a cause set by some other means.  This is appropriate for
135     * a "legacy chained throwable" that predates the addition of chained
136     * exceptions to {@code Throwable}.  Note that it is <i>not</i>
137     * necessary to override any of the {@code PrintStackTrace} methods,
138     * all of which invoke the {@code getCause} method to determine the
139     * cause of a throwable.
140     *
141     * @return the cause of this throwable or {@code null} if the
142     * cause is nonexistent or unknown.
143     * @since 1.4
144     */
145    @Override
146    public synchronized Throwable getCause() {
147        return super.getCause();
148    }
149
150    /**
151     * Initializes the <i>cause</i> of this throwable to the specified value.
152     * (The cause is the throwable that caused this throwable to get thrown.)
153     *
154     * <p>This method can be called at most once.  It is generally called from
155     * within the constructor, or immediately after creating the
156     * throwable.  If this throwable was created
157     * with {@link #Throwable(Throwable)} or
158     * {@link #Throwable(String, Throwable)}, this method cannot be called
159     * even once.
160     *
161     * <p>An example of using this method on a legacy throwable type
162     * without other support for setting the cause is:
163     *
164     * <pre>
165     * try {
166     *     lowLevelOp();
167     * } catch (LowLevelException le) {
168     *     throw (HighLevelException)
169     *           new HighLevelException().initCause(le); // Legacy constructor
170     * }
171     * </pre>
172     *
173     * @param cause the cause (which is saved for later retrieval by the
174     *              {@link #getCause()} method).  (A {@code null} value is
175     *              permitted, and indicates that the cause is nonexistent or
176     *              unknown.)
177     * @return a reference to this {@code Throwable} instance.
178     * @throws IllegalArgumentException if {@code cause} is this
179     *                                  throwable.  (A throwable cannot be its own cause.)
180     * @throws IllegalStateException    if this throwable was
181     *                                  created with {@link #Throwable(Throwable)} or
182     *                                  {@link #Throwable(String, Throwable)}, or this method has already
183     *                                  been called on this throwable.
184     * @since 1.4
185     */
186    @Override
187    public synchronized Throwable initCause(Throwable cause) {
188        return super.initCause(cause);
189    }
190
191    /**
192     * Returns a short description of this throwable.
193     * The result is the concatenation of:
194     * <ul>
195     * <li> the {@linkplain Class#getName() name} of the class of this object
196     * <li> ": " (a colon and a space)
197     * <li> the result of invoking this object's {@link #getLocalizedMessage}
198     *      method
199     * </ul>
200     * If {@code getLocalizedMessage} returns {@code null}, then just
201     * the class name is returned.
202     *
203     * @return a string representation of this throwable.
204     */
205    @Override
206    public String toString() {
207        return super.toString();
208    }
209
210    /**
211     * Prints this throwable and its backtrace to the
212     * standard error stream. This method prints a stack trace for this
213     * {@code Throwable} object on the error output stream that is
214     * the value of the field {@code System.err}. The first line of
215     * output contains the result of the {@link #toString()} method for
216     * this object.  Remaining lines represent data previously recorded by
217     * the method {@link #fillInStackTrace()}. The format of this
218     * information depends on the implementation, but the following
219     * example may be regarded as typical:
220     * <blockquote><pre>
221     * java.lang.NullPointerException
222     *         at MyClass.mash(MyClass.java:9)
223     *         at MyClass.crunch(MyClass.java:6)
224     *         at MyClass.main(MyClass.java:3)
225     * </pre></blockquote>
226     * This example was produced by running the program:
227     * <pre>
228     * class MyClass {
229     *     public static void main(String[] args) {
230     *         crunch(null);
231     *     }
232     *     static void crunch(int[] a) {
233     *         mash(a);
234     *     }
235     *     static void mash(int[] b) {
236     *         System.out.println(b[0]);
237     *     }
238     * }
239     * </pre>
240     * The backtrace for a throwable with an initialized, non-null cause
241     * should generally include the backtrace for the cause.  The format
242     * of this information depends on the implementation, but the following
243     * example may be regarded as typical:
244     * <pre>
245     * HighLevelException: MidLevelException: LowLevelException
246     *         at Junk.a(Junk.java:13)
247     *         at Junk.main(Junk.java:4)
248     * Caused by: MidLevelException: LowLevelException
249     *         at Junk.c(Junk.java:23)
250     *         at Junk.b(Junk.java:17)
251     *         at Junk.a(Junk.java:11)
252     *         ... 1 more
253     * Caused by: LowLevelException
254     *         at Junk.e(Junk.java:30)
255     *         at Junk.d(Junk.java:27)
256     *         at Junk.c(Junk.java:21)
257     *         ... 3 more
258     * </pre>
259     * Note the presence of lines containing the characters {@code "..."}.
260     * These lines indicate that the remainder of the stack trace for this
261     * exception matches the indicated number of frames from the bottom of the
262     * stack trace of the exception that was caused by this exception (the
263     * "enclosing" exception).  This shorthand can greatly reduce the length
264     * of the output in the common case where a wrapped exception is thrown
265     * from same method as the "causative exception" is caught.  The above
266     * example was produced by running the program:
267     * <pre>
268     * public class Junk {
269     *     public static void main(String args[]) {
270     *         try {
271     *             a();
272     *         } catch(HighLevelException e) {
273     *             e.printStackTrace();
274     *         }
275     *     }
276     *     static void a() throws HighLevelException {
277     *         try {
278     *             b();
279     *         } catch(MidLevelException e) {
280     *             throw new HighLevelException(e);
281     *         }
282     *     }
283     *     static void b() throws MidLevelException {
284     *         c();
285     *     }
286     *     static void c() throws MidLevelException {
287     *         try {
288     *             d();
289     *         } catch(LowLevelException e) {
290     *             throw new MidLevelException(e);
291     *         }
292     *     }
293     *     static void d() throws LowLevelException {
294     *        e();
295     *     }
296     *     static void e() throws LowLevelException {
297     *         throw new LowLevelException();
298     *     }
299     * }
300     *
301     * class HighLevelException extends Exception {
302     *     HighLevelException(Throwable cause) { super(cause); }
303     * }
304     *
305     * class MidLevelException extends Exception {
306     *     MidLevelException(Throwable cause)  { super(cause); }
307     * }
308     *
309     * class LowLevelException extends Exception {
310     * }
311     * </pre>
312     * As of release 7, the platform supports the notion of
313     * <i>suppressed exceptions</i> (in conjunction with the {@code
314     * try}-with-resources statement). Any exceptions that were
315     * suppressed in order to deliver an exception are printed out
316     * beneath the stack trace.  The format of this information
317     * depends on the implementation, but the following example may be
318     * regarded as typical:
319     *
320     * <pre>
321     * Exception in thread "main" java.lang.Exception: Something happened
322     *  at Foo.bar(Foo.java:10)
323     *  at Foo.main(Foo.java:5)
324     *  Suppressed: Resource$CloseFailException: Resource ID = 0
325     *          at Resource.close(Resource.java:26)
326     *          at Foo.bar(Foo.java:9)
327     *          ... 1 more
328     * </pre>
329     * Note that the "... n more" notation is used on suppressed exceptions
330     * just at it is used on causes. Unlike causes, suppressed exceptions are
331     * indented beyond their "containing exceptions."
332     *
333     * <p>An exception can have both a cause and one or more suppressed
334     * exceptions:
335     * <pre>
336     * Exception in thread "main" java.lang.Exception: Main block
337     *  at Foo3.main(Foo3.java:7)
338     *  Suppressed: Resource$CloseFailException: Resource ID = 2
339     *          at Resource.close(Resource.java:26)
340     *          at Foo3.main(Foo3.java:5)
341     *  Suppressed: Resource$CloseFailException: Resource ID = 1
342     *          at Resource.close(Resource.java:26)
343     *          at Foo3.main(Foo3.java:5)
344     * Caused by: java.lang.Exception: I did it
345     *  at Foo3.main(Foo3.java:8)
346     * </pre>
347     * Likewise, a suppressed exception can have a cause:
348     * <pre>
349     * Exception in thread "main" java.lang.Exception: Main block
350     *  at Foo4.main(Foo4.java:6)
351     *  Suppressed: Resource2$CloseFailException: Resource ID = 1
352     *          at Resource2.close(Resource2.java:20)
353     *          at Foo4.main(Foo4.java:5)
354     *  Caused by: java.lang.Exception: Rats, you caught me
355     *          at Resource2$CloseFailException.&lt;init&gt;(Resource2.java:45)
356     *          ... 2 more
357     * </pre>
358     */
359    @Override
360    public void printStackTrace() {
361        super.printStackTrace();
362    }
363
364    /**
365     * Prints this throwable and its backtrace to the specified print stream.
366     *
367     * @param s {@code PrintStream} to use for output
368     */
369    @Override
370    public void printStackTrace(PrintStream s) {
371        super.printStackTrace(s);
372    }
373
374    /**
375     * Prints this throwable and its backtrace to the specified
376     * print writer.
377     *
378     * @param s {@code PrintWriter} to use for output
379     * @since JDK1.1
380     */
381    @Override
382    public void printStackTrace(PrintWriter s) {
383        super.printStackTrace(s);
384    }
385
386    /**
387     * Fills in the execution stack trace. This method records within this
388     * {@code Throwable} object information about the current state of
389     * the stack frames for the current thread.
390     *
391     * <p>If the stack trace of this {@code Throwable} {@linkplain
392     * Throwable#Throwable(String, Throwable, boolean, boolean) is not
393     * writable}, calling this method has no effect.
394     *
395     * @return a reference to this {@code Throwable} instance.
396     * @see Throwable#printStackTrace()
397     */
398    @Override
399    public synchronized Throwable fillInStackTrace() {
400        return super.fillInStackTrace();
401    }
402
403    /**
404     * Provides programmatic access to the stack trace information printed by
405     * {@link #printStackTrace()}.  Returns an array of stack trace elements,
406     * each representing one stack frame.  The zeroth element of the array
407     * (assuming the array's length is non-zero) represents the top of the
408     * stack, which is the last method invocation in the sequence.  Typically,
409     * this is the point at which this throwable was created and thrown.
410     * The last element of the array (assuming the array's length is non-zero)
411     * represents the bottom of the stack, which is the first method invocation
412     * in the sequence.
413     *
414     * <p>Some virtual machines may, under some circumstances, omit one
415     * or more stack frames from the stack trace.  In the extreme case,
416     * a virtual machine that has no stack trace information concerning
417     * this throwable is permitted to return a zero-length array from this
418     * method.  Generally speaking, the array returned by this method will
419     * contain one element for every frame that would be printed by
420     * {@code printStackTrace}.  Writes to the returned array do not
421     * affect future calls to this method.
422     *
423     * @return an array of stack trace elements representing the stack trace
424     * pertaining to this throwable.
425     * @since 1.4
426     */
427    @Override
428    public StackTraceElement[] getStackTrace() {
429        return super.getStackTrace();
430    }
431
432    /**
433     * Sets the stack trace elements that will be returned by
434     * {@link #getStackTrace()} and printed by {@link #printStackTrace()}
435     * and related methods.
436     * <p>
437     * This method, which is designed for use by RPC frameworks and other
438     * advanced systems, allows the client to override the default
439     * stack trace that is either generated by {@link #fillInStackTrace()}
440     * when a throwable is constructed or deserialized when a throwable is
441     * read from a serialization stream.
442     *
443     * <p>If the stack trace of this {@code Throwable} {@linkplain
444     * Throwable#Throwable(String, Throwable, boolean, boolean) is not
445     * writable}, calling this method has no effect other than
446     * validating its argument.
447     *
448     * @param stackTrace the stack trace elements to be associated with
449     *                   this {@code Throwable}.  The specified array is copied by this
450     *                   call; changes in the specified array after the method invocation
451     *                   returns will have no affect on this {@code Throwable}'s stack
452     *                   trace.
453     * @throws NullPointerException if {@code stackTrace} is
454     *                              {@code null} or if any of the elements of
455     *                              {@code stackTrace} are {@code null}
456     * @since 1.4
457     */
458    @Override
459    public void setStackTrace(StackTraceElement[] stackTrace) {
460        super.setStackTrace(stackTrace);
461    }
462
463    /**
464     * Returns a hash code value for the object. This method is
465     * supported for the benefit of hash tables such as those provided by
466     * {@link HashMap}.
467     * <p>
468     * The general contract of {@code hashCode} is:
469     * <ul>
470     * <li>Whenever it is invoked on the same object more than once during
471     *     an execution of a Java application, the {@code hashCode} method
472     *     must consistently return the same integer, provided no information
473     *     used in {@code equals} comparisons on the object is modified.
474     *     This integer need not remain consistent from one execution of an
475     *     application to another execution of the same application.
476     * <li>If two objects are equal according to the {@code equals(Object)}
477     *     method, then calling the {@code hashCode} method on each of
478     *     the two objects must produce the same integer result.
479     * <li>It is <em>not</em> required that if two objects are unequal
480     *     according to the {@link Object#equals(Object)}
481     *     method, then calling the {@code hashCode} method on each of the
482     *     two objects must produce distinct integer results.  However, the
483     *     programmer should be aware that producing distinct integer results
484     *     for unequal objects may improve the performance of hash tables.
485     * </ul>
486     * <p>
487     * As much as is reasonably practical, the hashCode method defined by
488     * class {@code Object} does return distinct integers for distinct
489     * objects. (This is typically implemented by converting the internal
490     * address of the object into an integer, but this implementation
491     * technique is not required by the
492     * Java&trade; programming language.)
493     *
494     * @return a hash code value for this object.
495     * @see Object#equals(Object)
496     * @see System#identityHashCode
497     */
498    @Override
499    public int hashCode() {
500        return super.hashCode();
501    }
502
503    /**
504     * Indicates whether some other object is "equal to" this one.
505     * <p>
506     * The {@code equals} method implements an equivalence relation
507     * on non-null object references:
508     * <ul>
509     * <li>It is <i>reflexive</i>: for any non-null reference value
510     *     {@code x}, {@code x.equals(x)} should return
511     *     {@code true}.
512     * <li>It is <i>symmetric</i>: for any non-null reference values
513     *     {@code x} and {@code y}, {@code x.equals(y)}
514     *     should return {@code true} if and only if
515     *     {@code y.equals(x)} returns {@code true}.
516     * <li>It is <i>transitive</i>: for any non-null reference values
517     *     {@code x}, {@code y}, and {@code z}, if
518     *     {@code x.equals(y)} returns {@code true} and
519     *     {@code y.equals(z)} returns {@code true}, then
520     *     {@code x.equals(z)} should return {@code true}.
521     * <li>It is <i>consistent</i>: for any non-null reference values
522     *     {@code x} and {@code y}, multiple invocations of
523     *     {@code x.equals(y)} consistently return {@code true}
524     *     or consistently return {@code false}, provided no
525     *     information used in {@code equals} comparisons on the
526     *     objects is modified.
527     * <li>For any non-null reference value {@code x},
528     *     {@code x.equals(null)} should return {@code false}.
529     * </ul>
530     * <p>
531     * The {@code equals} method for class {@code Object} implements
532     * the most discriminating possible equivalence relation on objects;
533     * that is, for any non-null reference values {@code x} and
534     * {@code y}, this method returns {@code true} if and only
535     * if {@code x} and {@code y} refer to the same object
536     * ({@code x == y} has the value {@code true}).
537     * <p>
538     * Note that it is generally necessary to override the {@code hashCode}
539     * method whenever this method is overridden, so as to maintain the
540     * general contract for the {@code hashCode} method, which states
541     * that equal objects must have equal hash codes.
542     *
543     * @param obj the reference object with which to compare.
544     * @return {@code true} if this object is the same as the obj
545     * argument; {@code false} otherwise.
546     * @see #hashCode()
547     * @see HashMap
548     */
549    @Override
550    public boolean equals(Object obj) {
551        return super.equals(obj);
552    }
553
554    /**
555     * Creates and returns a copy of this object.  The precise meaning
556     * of "copy" may depend on the class of the object. The general
557     * intent is that, for any object {@code x}, the expression:
558     * <blockquote>
559     * <pre>
560     * x.clone() != x</pre></blockquote>
561     * will be true, and that the expression:
562     * <blockquote>
563     * <pre>
564     * x.clone().getClass() == x.getClass()</pre></blockquote>
565     * will be {@code true}, but these are not absolute requirements.
566     * While it is typically the case that:
567     * <blockquote>
568     * <pre>
569     * x.clone().equals(x)</pre></blockquote>
570     * will be {@code true}, this is not an absolute requirement.
571     * <p>
572     * By convention, the returned object should be obtained by calling
573     * {@code super.clone}.  If a class and all of its superclasses (except
574     * {@code Object}) obey this convention, it will be the case that
575     * {@code x.clone().getClass() == x.getClass()}.
576     * <p>
577     * By convention, the object returned by this method should be independent
578     * of this object (which is being cloned).  To achieve this independence,
579     * it may be necessary to modify one or more fields of the object returned
580     * by {@code super.clone} before returning it.  Typically, this means
581     * copying any mutable objects that comprise the internal "deep structure"
582     * of the object being cloned and replacing the references to these
583     * objects with references to the copies.  If a class contains only
584     * primitive fields or references to immutable objects, then it is usually
585     * the case that no fields in the object returned by {@code super.clone}
586     * need to be modified.
587     * <p>
588     * The method {@code clone} for class {@code Object} performs a
589     * specific cloning operation. First, if the class of this object does
590     * not implement the interface {@code Cloneable}, then a
591     * {@code CloneNotSupportedException} is thrown. Note that all arrays
592     * are considered to implement the interface {@code Cloneable} and that
593     * the return type of the {@code clone} method of an array type {@code T[]}
594     * is {@code T[]} where T is any reference or primitive type.
595     * Otherwise, this method creates a new instance of the class of this
596     * object and initializes all its fields with exactly the contents of
597     * the corresponding fields of this object, as if by assignment; the
598     * contents of the fields are not themselves cloned. Thus, this method
599     * performs a "shallow copy" of this object, not a "deep copy" operation.
600     * <p>
601     * The class {@code Object} does not itself implement the interface
602     * {@code Cloneable}, so calling the {@code clone} method on an object
603     * whose class is {@code Object} will result in throwing an
604     * exception at run time.
605     *
606     * @return a clone of this instance.
607     * @throws CloneNotSupportedException if the object's class does not
608     *                                    support the {@code Cloneable} interface. Subclasses
609     *                                    that override the {@code clone} method can also
610     *                                    throw this exception to indicate that an instance cannot
611     *                                    be cloned.
612     * @see Cloneable
613     */
614    @Override
615    protected Object clone() throws CloneNotSupportedException {
616        return super.clone();
617    }
618
619    /**
620     * Called by the garbage collector on an object when garbage collection
621     * determines that there are no more references to the object.
622     * A subclass overrides the {@code finalize} method to dispose of
623     * system resources or to perform other cleanup.
624     * <p>
625     * The general contract of {@code finalize} is that it is invoked
626     * if and when the Java&trade; virtual
627     * machine has determined that there is no longer any
628     * means by which this object can be accessed by any thread that has
629     * not yet died, except as a result of an action taken by the
630     * finalization of some other object or class which is ready to be
631     * finalized. The {@code finalize} method may take any action, including
632     * making this object available again to other threads; the usual purpose
633     * of {@code finalize}, however, is to perform cleanup actions before
634     * the object is irrevocably discarded. For example, the finalize method
635     * for an object that represents an input/output connection might perform
636     * explicit I/O transactions to break the connection before the object is
637     * permanently discarded.
638     * <p>
639     * The {@code finalize} method of class {@code Object} performs no
640     * special action; it simply returns normally. Subclasses of
641     * {@code Object} may override this definition.
642     * <p>
643     * The Java programming language does not guarantee which thread will
644     * invoke the {@code finalize} method for any given object. It is
645     * guaranteed, however, that the thread that invokes finalize will not
646     * be holding any user-visible synchronization locks when finalize is
647     * invoked. If an uncaught exception is thrown by the finalize method,
648     * the exception is ignored and finalization of that object terminates.
649     * <p>
650     * After the {@code finalize} method has been invoked for an object, no
651     * further action is taken until the Java virtual machine has again
652     * determined that there is no longer any means by which this object can
653     * be accessed by any thread that has not yet died, including possible
654     * actions by other objects or classes which are ready to be finalized,
655     * at which point the object may be discarded.
656     * <p>
657     * The {@code finalize} method is never invoked more than once by a Java
658     * virtual machine for any given object.
659     * <p>
660     * Any exception thrown by the {@code finalize} method causes
661     * the finalization of this object to be halted, but is otherwise
662     * ignored.
663     *
664     * @throws Throwable the {@code Exception} raised by this method
665     * @jls 12.6 Finalization of Class Instances
666     * @see WeakReference
667     * @see PhantomReference
668     */
669    @Override
670    protected void finalize() throws Throwable {
671        super.finalize();
672    }
673}