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.<init>(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™ 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™ 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}