• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package com.google.common.base;
16 
17 import static com.google.common.base.Strings.lenientFormat;
18 
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.errorprone.annotations.CanIgnoreReturnValue;
21 import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
22 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
23 
24 /**
25  * Static convenience methods that help a method or constructor check whether it was invoked
26  * correctly (that is, whether its <i>preconditions</i> were met).
27  *
28  * <p>If the precondition is not met, the {@code Preconditions} method throws an unchecked exception
29  * of a specified type, which helps the method in which the exception was thrown communicate that
30  * its caller has made a mistake. This allows constructs such as
31  *
32  * <pre>{@code
33  * public static double sqrt(double value) {
34  *   if (value < 0) {
35  *     throw new IllegalArgumentException("input is negative: " + value);
36  *   }
37  *   // calculate square root
38  * }
39  * }</pre>
40  *
41  * <p>to be replaced with the more compact
42  *
43  * <pre>{@code
44  * public static double sqrt(double value) {
45  *   checkArgument(value >= 0, "input is negative: %s", value);
46  *   // calculate square root
47  * }
48  * }</pre>
49  *
50  * <p>so that a hypothetical bad caller of this method, such as:
51  *
52  * <pre>{@code
53  *   void exampleBadCaller() {
54  *     double d = sqrt(-1.0);
55  * }
56  * }</pre>
57  *
58  * <p>would be flagged as having called {@code sqrt()} with an illegal argument.
59  *
60  * <h3>Performance</h3>
61  *
62  * <p>Avoid passing message arguments that are expensive to compute; your code will always compute
63  * them, even though they usually won't be needed. If you have such arguments, use the conventional
64  * if/throw idiom instead.
65  *
66  * <p>Depending on your message arguments, memory may be allocated for boxing and varargs array
67  * creation. However, the methods of this class have a large number of overloads that prevent such
68  * allocations in many common cases.
69  *
70  * <p>The message string is not formatted unless the exception will be thrown, so the cost of the
71  * string formatting itself should not be a concern.
72  *
73  * <p>As with any performance concerns, you should consider profiling your code (in a production
74  * environment if possible) before spending a lot of effort on tweaking a particular element.
75  *
76  * <h3>Other types of preconditions</h3>
77  *
78  * <p>Not every type of precondition failure is supported by these methods. Continue to throw
79  * standard JDK exceptions such as {@link java.util.NoSuchElementException} or {@link
80  * UnsupportedOperationException} in the situations they are intended for.
81  *
82  * <h3>Non-preconditions</h3>
83  *
84  * <p>It is of course possible to use the methods of this class to check for invalid conditions
85  * which are <i>not the caller's fault</i>. Doing so is <b>not recommended</b> because it is
86  * misleading to future readers of the code and of stack traces. See <a
87  * href="https://github.com/google/guava/wiki/ConditionalFailuresExplained">Conditional failures
88  * explained</a> in the Guava User Guide for more advice. Notably, {@link Verify} offers assertions
89  * similar to those in this class for non-precondition checks.
90  *
91  * <h3>{@code java.util.Objects.requireNonNull()}</h3>
92  *
93  * <p>Projects which use {@code com.google.common} should generally avoid the use of {@link
94  * java.util.Objects#requireNonNull(Object)}. Instead, use whichever of {@link
95  * #checkNotNull(Object)} or {@link Verify#verifyNotNull(Object)} is appropriate to the situation.
96  * (The same goes for the message-accepting overloads.)
97  *
98  * <h3>Only {@code %s} is supported</h3>
99  *
100  * <p>{@code Preconditions} uses {@link Strings#lenientFormat} to format error message template
101  * strings. This only supports the {@code "%s"} specifier, not the full range of {@link
102  * java.util.Formatter} specifiers. However, note that if the number of arguments does not match the
103  * number of occurrences of {@code "%s"} in the format string, {@code Preconditions} will still
104  * behave as expected, and will still include all argument values in the error message; the message
105  * will simply not be formatted exactly as intended.
106  *
107  * <h3>More information</h3>
108  *
109  * <p>See the Guava User Guide on <a
110  * href="https://github.com/google/guava/wiki/PreconditionsExplained">using {@code
111  * Preconditions}</a>.
112  *
113  * @author Kevin Bourrillion
114  * @since 2.0
115  */
116 @GwtCompatible
117 public final class Preconditions {
Preconditions()118   private Preconditions() {}
119 
120   /**
121    * Ensures the truth of an expression involving one or more parameters to the calling method.
122    *
123    * @param expression a boolean expression
124    * @throws IllegalArgumentException if {@code expression} is false
125    */
checkArgument(boolean expression)126   public static void checkArgument(boolean expression) {
127     if (!expression) {
128       throw new IllegalArgumentException();
129     }
130   }
131 
132   /**
133    * Ensures the truth of an expression involving one or more parameters to the calling method.
134    *
135    * @param expression a boolean expression
136    * @param errorMessage the exception message to use if the check fails; will be converted to a
137    *     string using {@link String#valueOf(Object)}
138    * @throws IllegalArgumentException if {@code expression} is false
139    */
checkArgument(boolean expression, @NullableDecl Object errorMessage)140   public static void checkArgument(boolean expression, @NullableDecl Object errorMessage) {
141     if (!expression) {
142       throw new IllegalArgumentException(String.valueOf(errorMessage));
143     }
144   }
145 
146   /**
147    * Ensures the truth of an expression involving one or more parameters to the calling method.
148    *
149    * @param expression a boolean expression
150    * @param errorMessageTemplate a template for the exception message should the check fail. The
151    *     message is formed by replacing each {@code %s} placeholder in the template with an
152    *     argument. These are matched by position - the first {@code %s} gets {@code
153    *     errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
154    *     square braces. Unmatched placeholders will be left as-is.
155    * @param errorMessageArgs the arguments to be substituted into the message template. Arguments
156    *     are converted to strings using {@link String#valueOf(Object)}.
157    * @throws IllegalArgumentException if {@code expression} is false
158    */
checkArgument( boolean expression, @NullableDecl String errorMessageTemplate, @NullableDecl Object... errorMessageArgs)159   public static void checkArgument(
160       boolean expression,
161       @NullableDecl String errorMessageTemplate,
162       @NullableDecl Object... errorMessageArgs) {
163     if (!expression) {
164       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, errorMessageArgs));
165     }
166   }
167 
168   /**
169    * Ensures the truth of an expression involving one or more parameters to the calling method.
170    *
171    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
172    *
173    * @since 20.0 (varargs overload since 2.0)
174    */
checkArgument(boolean b, @NullableDecl String errorMessageTemplate, char p1)175   public static void checkArgument(boolean b, @NullableDecl String errorMessageTemplate, char p1) {
176     if (!b) {
177       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
178     }
179   }
180 
181   /**
182    * Ensures the truth of an expression involving one or more parameters to the calling method.
183    *
184    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
185    *
186    * @since 20.0 (varargs overload since 2.0)
187    */
checkArgument(boolean b, @NullableDecl String errorMessageTemplate, int p1)188   public static void checkArgument(boolean b, @NullableDecl String errorMessageTemplate, int p1) {
189     if (!b) {
190       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
191     }
192   }
193 
194   /**
195    * Ensures the truth of an expression involving one or more parameters to the calling method.
196    *
197    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
198    *
199    * @since 20.0 (varargs overload since 2.0)
200    */
checkArgument(boolean b, @NullableDecl String errorMessageTemplate, long p1)201   public static void checkArgument(boolean b, @NullableDecl String errorMessageTemplate, long p1) {
202     if (!b) {
203       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
204     }
205   }
206 
207   /**
208    * Ensures the truth of an expression involving one or more parameters to the calling method.
209    *
210    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
211    *
212    * @since 20.0 (varargs overload since 2.0)
213    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1)214   public static void checkArgument(
215       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
216     if (!b) {
217       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
218     }
219   }
220 
221   /**
222    * Ensures the truth of an expression involving one or more parameters to the calling method.
223    *
224    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
225    *
226    * @since 20.0 (varargs overload since 2.0)
227    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, char p1, char p2)228   public static void checkArgument(
229       boolean b, @NullableDecl String errorMessageTemplate, char p1, char p2) {
230     if (!b) {
231       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
232     }
233   }
234 
235   /**
236    * Ensures the truth of an expression involving one or more parameters to the calling method.
237    *
238    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
239    *
240    * @since 20.0 (varargs overload since 2.0)
241    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, char p1, int p2)242   public static void checkArgument(
243       boolean b, @NullableDecl String errorMessageTemplate, char p1, int p2) {
244     if (!b) {
245       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
246     }
247   }
248 
249   /**
250    * Ensures the truth of an expression involving one or more parameters to the calling method.
251    *
252    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
253    *
254    * @since 20.0 (varargs overload since 2.0)
255    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, char p1, long p2)256   public static void checkArgument(
257       boolean b, @NullableDecl String errorMessageTemplate, char p1, long p2) {
258     if (!b) {
259       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
260     }
261   }
262 
263   /**
264    * Ensures the truth of an expression involving one or more parameters to the calling method.
265    *
266    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
267    *
268    * @since 20.0 (varargs overload since 2.0)
269    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2)270   public static void checkArgument(
271       boolean b, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2) {
272     if (!b) {
273       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
274     }
275   }
276 
277   /**
278    * Ensures the truth of an expression involving one or more parameters to the calling method.
279    *
280    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
281    *
282    * @since 20.0 (varargs overload since 2.0)
283    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, int p1, char p2)284   public static void checkArgument(
285       boolean b, @NullableDecl String errorMessageTemplate, int p1, char p2) {
286     if (!b) {
287       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
288     }
289   }
290 
291   /**
292    * Ensures the truth of an expression involving one or more parameters to the calling method.
293    *
294    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
295    *
296    * @since 20.0 (varargs overload since 2.0)
297    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, int p1, int p2)298   public static void checkArgument(
299       boolean b, @NullableDecl String errorMessageTemplate, int p1, int p2) {
300     if (!b) {
301       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
302     }
303   }
304 
305   /**
306    * Ensures the truth of an expression involving one or more parameters to the calling method.
307    *
308    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
309    *
310    * @since 20.0 (varargs overload since 2.0)
311    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, int p1, long p2)312   public static void checkArgument(
313       boolean b, @NullableDecl String errorMessageTemplate, int p1, long p2) {
314     if (!b) {
315       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
316     }
317   }
318 
319   /**
320    * Ensures the truth of an expression involving one or more parameters to the calling method.
321    *
322    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
323    *
324    * @since 20.0 (varargs overload since 2.0)
325    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2)326   public static void checkArgument(
327       boolean b, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2) {
328     if (!b) {
329       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
330     }
331   }
332 
333   /**
334    * Ensures the truth of an expression involving one or more parameters to the calling method.
335    *
336    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
337    *
338    * @since 20.0 (varargs overload since 2.0)
339    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, long p1, char p2)340   public static void checkArgument(
341       boolean b, @NullableDecl String errorMessageTemplate, long p1, char p2) {
342     if (!b) {
343       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
344     }
345   }
346 
347   /**
348    * Ensures the truth of an expression involving one or more parameters to the calling method.
349    *
350    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
351    *
352    * @since 20.0 (varargs overload since 2.0)
353    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, long p1, int p2)354   public static void checkArgument(
355       boolean b, @NullableDecl String errorMessageTemplate, long p1, int p2) {
356     if (!b) {
357       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
358     }
359   }
360 
361   /**
362    * Ensures the truth of an expression involving one or more parameters to the calling method.
363    *
364    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
365    *
366    * @since 20.0 (varargs overload since 2.0)
367    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, long p1, long p2)368   public static void checkArgument(
369       boolean b, @NullableDecl String errorMessageTemplate, long p1, long p2) {
370     if (!b) {
371       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
372     }
373   }
374 
375   /**
376    * Ensures the truth of an expression involving one or more parameters to the calling method.
377    *
378    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
379    *
380    * @since 20.0 (varargs overload since 2.0)
381    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2)382   public static void checkArgument(
383       boolean b, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2) {
384     if (!b) {
385       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
386     }
387   }
388 
389   /**
390    * Ensures the truth of an expression involving one or more parameters to the calling method.
391    *
392    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
393    *
394    * @since 20.0 (varargs overload since 2.0)
395    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2)396   public static void checkArgument(
397       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2) {
398     if (!b) {
399       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
400     }
401   }
402 
403   /**
404    * Ensures the truth of an expression involving one or more parameters to the calling method.
405    *
406    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
407    *
408    * @since 20.0 (varargs overload since 2.0)
409    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2)410   public static void checkArgument(
411       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2) {
412     if (!b) {
413       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
414     }
415   }
416 
417   /**
418    * Ensures the truth of an expression involving one or more parameters to the calling method.
419    *
420    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
421    *
422    * @since 20.0 (varargs overload since 2.0)
423    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2)424   public static void checkArgument(
425       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2) {
426     if (!b) {
427       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
428     }
429   }
430 
431   /**
432    * Ensures the truth of an expression involving one or more parameters to the calling method.
433    *
434    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
435    *
436    * @since 20.0 (varargs overload since 2.0)
437    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2)438   public static void checkArgument(
439       boolean b,
440       @NullableDecl String errorMessageTemplate,
441       @NullableDecl Object p1,
442       @NullableDecl Object p2) {
443     if (!b) {
444       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
445     }
446   }
447 
448   /**
449    * Ensures the truth of an expression involving one or more parameters to the calling method.
450    *
451    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
452    *
453    * @since 20.0 (varargs overload since 2.0)
454    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2, @NullableDecl Object p3)455   public static void checkArgument(
456       boolean b,
457       @NullableDecl String errorMessageTemplate,
458       @NullableDecl Object p1,
459       @NullableDecl Object p2,
460       @NullableDecl Object p3) {
461     if (!b) {
462       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2, p3));
463     }
464   }
465 
466   /**
467    * Ensures the truth of an expression involving one or more parameters to the calling method.
468    *
469    * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
470    *
471    * @since 20.0 (varargs overload since 2.0)
472    */
checkArgument( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2, @NullableDecl Object p3, @NullableDecl Object p4)473   public static void checkArgument(
474       boolean b,
475       @NullableDecl String errorMessageTemplate,
476       @NullableDecl Object p1,
477       @NullableDecl Object p2,
478       @NullableDecl Object p3,
479       @NullableDecl Object p4) {
480     if (!b) {
481       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
482     }
483   }
484 
485   /**
486    * Ensures the truth of an expression involving the state of the calling instance, but not
487    * involving any parameters to the calling method.
488    *
489    * @param expression a boolean expression
490    * @throws IllegalStateException if {@code expression} is false
491    * @see Verify#verify Verify.verify()
492    */
checkState(boolean expression)493   public static void checkState(boolean expression) {
494     if (!expression) {
495       throw new IllegalStateException();
496     }
497   }
498 
499   /**
500    * Ensures the truth of an expression involving the state of the calling instance, but not
501    * involving any parameters to the calling method.
502    *
503    * @param expression a boolean expression
504    * @param errorMessage the exception message to use if the check fails; will be converted to a
505    *     string using {@link String#valueOf(Object)}
506    * @throws IllegalStateException if {@code expression} is false
507    * @see Verify#verify Verify.verify()
508    */
checkState(boolean expression, @NullableDecl Object errorMessage)509   public static void checkState(boolean expression, @NullableDecl Object errorMessage) {
510     if (!expression) {
511       throw new IllegalStateException(String.valueOf(errorMessage));
512     }
513   }
514 
515   /**
516    * Ensures the truth of an expression involving the state of the calling instance, but not
517    * involving any parameters to the calling method.
518    *
519    * @param expression a boolean expression
520    * @param errorMessageTemplate a template for the exception message should the check fail. The
521    *     message is formed by replacing each {@code %s} placeholder in the template with an
522    *     argument. These are matched by position - the first {@code %s} gets {@code
523    *     errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
524    *     square braces. Unmatched placeholders will be left as-is.
525    * @param errorMessageArgs the arguments to be substituted into the message template. Arguments
526    *     are converted to strings using {@link String#valueOf(Object)}.
527    * @throws IllegalStateException if {@code expression} is false
528    * @see Verify#verify Verify.verify()
529    */
checkState( boolean expression, @NullableDecl String errorMessageTemplate, @NullableDecl Object... errorMessageArgs)530   public static void checkState(
531       boolean expression,
532       @NullableDecl String errorMessageTemplate,
533       @NullableDecl Object... errorMessageArgs) {
534     if (!expression) {
535       throw new IllegalStateException(lenientFormat(errorMessageTemplate, errorMessageArgs));
536     }
537   }
538 
539   /**
540    * Ensures the truth of an expression involving the state of the calling instance, but not
541    * involving any parameters to the calling method.
542    *
543    * <p>See {@link #checkState(boolean, String, Object...)} for details.
544    *
545    * @since 20.0 (varargs overload since 2.0)
546    */
checkState(boolean b, @NullableDecl String errorMessageTemplate, char p1)547   public static void checkState(boolean b, @NullableDecl String errorMessageTemplate, char p1) {
548     if (!b) {
549       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
550     }
551   }
552 
553   /**
554    * Ensures the truth of an expression involving the state of the calling instance, but not
555    * involving any parameters to the calling method.
556    *
557    * <p>See {@link #checkState(boolean, String, Object...)} for details.
558    *
559    * @since 20.0 (varargs overload since 2.0)
560    */
checkState(boolean b, @NullableDecl String errorMessageTemplate, int p1)561   public static void checkState(boolean b, @NullableDecl String errorMessageTemplate, int p1) {
562     if (!b) {
563       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
564     }
565   }
566 
567   /**
568    * Ensures the truth of an expression involving the state of the calling instance, but not
569    * involving any parameters to the calling method.
570    *
571    * <p>See {@link #checkState(boolean, String, Object...)} for details.
572    *
573    * @since 20.0 (varargs overload since 2.0)
574    */
checkState(boolean b, @NullableDecl String errorMessageTemplate, long p1)575   public static void checkState(boolean b, @NullableDecl String errorMessageTemplate, long p1) {
576     if (!b) {
577       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
578     }
579   }
580 
581   /**
582    * Ensures the truth of an expression involving the state of the calling instance, but not
583    * involving any parameters to the calling method.
584    *
585    * <p>See {@link #checkState(boolean, String, Object...)} for details.
586    *
587    * @since 20.0 (varargs overload since 2.0)
588    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1)589   public static void checkState(
590       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
591     if (!b) {
592       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
593     }
594   }
595 
596   /**
597    * Ensures the truth of an expression involving the state of the calling instance, but not
598    * involving any parameters to the calling method.
599    *
600    * <p>See {@link #checkState(boolean, String, Object...)} for details.
601    *
602    * @since 20.0 (varargs overload since 2.0)
603    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, char p1, char p2)604   public static void checkState(
605       boolean b, @NullableDecl String errorMessageTemplate, char p1, char p2) {
606     if (!b) {
607       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
608     }
609   }
610 
611   /**
612    * Ensures the truth of an expression involving the state of the calling instance, but not
613    * involving any parameters to the calling method.
614    *
615    * <p>See {@link #checkState(boolean, String, Object...)} for details.
616    *
617    * @since 20.0 (varargs overload since 2.0)
618    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, char p1, int p2)619   public static void checkState(
620       boolean b, @NullableDecl String errorMessageTemplate, char p1, int p2) {
621     if (!b) {
622       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
623     }
624   }
625 
626   /**
627    * Ensures the truth of an expression involving the state of the calling instance, but not
628    * involving any parameters to the calling method.
629    *
630    * <p>See {@link #checkState(boolean, String, Object...)} for details.
631    *
632    * @since 20.0 (varargs overload since 2.0)
633    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, char p1, long p2)634   public static void checkState(
635       boolean b, @NullableDecl String errorMessageTemplate, char p1, long p2) {
636     if (!b) {
637       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
638     }
639   }
640 
641   /**
642    * Ensures the truth of an expression involving the state of the calling instance, but not
643    * involving any parameters to the calling method.
644    *
645    * <p>See {@link #checkState(boolean, String, Object...)} for details.
646    *
647    * @since 20.0 (varargs overload since 2.0)
648    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2)649   public static void checkState(
650       boolean b, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2) {
651     if (!b) {
652       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
653     }
654   }
655 
656   /**
657    * Ensures the truth of an expression involving the state of the calling instance, but not
658    * involving any parameters to the calling method.
659    *
660    * <p>See {@link #checkState(boolean, String, Object...)} for details.
661    *
662    * @since 20.0 (varargs overload since 2.0)
663    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, int p1, char p2)664   public static void checkState(
665       boolean b, @NullableDecl String errorMessageTemplate, int p1, char p2) {
666     if (!b) {
667       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
668     }
669   }
670 
671   /**
672    * Ensures the truth of an expression involving the state of the calling instance, but not
673    * involving any parameters to the calling method.
674    *
675    * <p>See {@link #checkState(boolean, String, Object...)} for details.
676    *
677    * @since 20.0 (varargs overload since 2.0)
678    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, int p1, int p2)679   public static void checkState(
680       boolean b, @NullableDecl String errorMessageTemplate, int p1, int p2) {
681     if (!b) {
682       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
683     }
684   }
685 
686   /**
687    * Ensures the truth of an expression involving the state of the calling instance, but not
688    * involving any parameters to the calling method.
689    *
690    * <p>See {@link #checkState(boolean, String, Object...)} for details.
691    *
692    * @since 20.0 (varargs overload since 2.0)
693    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, int p1, long p2)694   public static void checkState(
695       boolean b, @NullableDecl String errorMessageTemplate, int p1, long p2) {
696     if (!b) {
697       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
698     }
699   }
700 
701   /**
702    * Ensures the truth of an expression involving the state of the calling instance, but not
703    * involving any parameters to the calling method.
704    *
705    * <p>See {@link #checkState(boolean, String, Object...)} for details.
706    *
707    * @since 20.0 (varargs overload since 2.0)
708    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2)709   public static void checkState(
710       boolean b, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2) {
711     if (!b) {
712       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
713     }
714   }
715 
716   /**
717    * Ensures the truth of an expression involving the state of the calling instance, but not
718    * involving any parameters to the calling method.
719    *
720    * <p>See {@link #checkState(boolean, String, Object...)} for details.
721    *
722    * @since 20.0 (varargs overload since 2.0)
723    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, long p1, char p2)724   public static void checkState(
725       boolean b, @NullableDecl String errorMessageTemplate, long p1, char p2) {
726     if (!b) {
727       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
728     }
729   }
730 
731   /**
732    * Ensures the truth of an expression involving the state of the calling instance, but not
733    * involving any parameters to the calling method.
734    *
735    * <p>See {@link #checkState(boolean, String, Object...)} for details.
736    *
737    * @since 20.0 (varargs overload since 2.0)
738    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, long p1, int p2)739   public static void checkState(
740       boolean b, @NullableDecl String errorMessageTemplate, long p1, int p2) {
741     if (!b) {
742       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
743     }
744   }
745 
746   /**
747    * Ensures the truth of an expression involving the state of the calling instance, but not
748    * involving any parameters to the calling method.
749    *
750    * <p>See {@link #checkState(boolean, String, Object...)} for details.
751    *
752    * @since 20.0 (varargs overload since 2.0)
753    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, long p1, long p2)754   public static void checkState(
755       boolean b, @NullableDecl String errorMessageTemplate, long p1, long p2) {
756     if (!b) {
757       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
758     }
759   }
760 
761   /**
762    * Ensures the truth of an expression involving the state of the calling instance, but not
763    * involving any parameters to the calling method.
764    *
765    * <p>See {@link #checkState(boolean, String, Object...)} for details.
766    *
767    * @since 20.0 (varargs overload since 2.0)
768    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2)769   public static void checkState(
770       boolean b, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2) {
771     if (!b) {
772       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
773     }
774   }
775 
776   /**
777    * Ensures the truth of an expression involving the state of the calling instance, but not
778    * involving any parameters to the calling method.
779    *
780    * <p>See {@link #checkState(boolean, String, Object...)} for details.
781    *
782    * @since 20.0 (varargs overload since 2.0)
783    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2)784   public static void checkState(
785       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2) {
786     if (!b) {
787       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
788     }
789   }
790 
791   /**
792    * Ensures the truth of an expression involving the state of the calling instance, but not
793    * involving any parameters to the calling method.
794    *
795    * <p>See {@link #checkState(boolean, String, Object...)} for details.
796    *
797    * @since 20.0 (varargs overload since 2.0)
798    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2)799   public static void checkState(
800       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2) {
801     if (!b) {
802       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
803     }
804   }
805 
806   /**
807    * Ensures the truth of an expression involving the state of the calling instance, but not
808    * involving any parameters to the calling method.
809    *
810    * <p>See {@link #checkState(boolean, String, Object...)} for details.
811    *
812    * @since 20.0 (varargs overload since 2.0)
813    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2)814   public static void checkState(
815       boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2) {
816     if (!b) {
817       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
818     }
819   }
820 
821   /**
822    * Ensures the truth of an expression involving the state of the calling instance, but not
823    * involving any parameters to the calling method.
824    *
825    * <p>See {@link #checkState(boolean, String, Object...)} for details.
826    *
827    * @since 20.0 (varargs overload since 2.0)
828    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2)829   public static void checkState(
830       boolean b,
831       @NullableDecl String errorMessageTemplate,
832       @NullableDecl Object p1,
833       @NullableDecl Object p2) {
834     if (!b) {
835       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
836     }
837   }
838 
839   /**
840    * Ensures the truth of an expression involving the state of the calling instance, but not
841    * involving any parameters to the calling method.
842    *
843    * <p>See {@link #checkState(boolean, String, Object...)} for details.
844    *
845    * @since 20.0 (varargs overload since 2.0)
846    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2, @NullableDecl Object p3)847   public static void checkState(
848       boolean b,
849       @NullableDecl String errorMessageTemplate,
850       @NullableDecl Object p1,
851       @NullableDecl Object p2,
852       @NullableDecl Object p3) {
853     if (!b) {
854       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2, p3));
855     }
856   }
857 
858   /**
859    * Ensures the truth of an expression involving the state of the calling instance, but not
860    * involving any parameters to the calling method.
861    *
862    * <p>See {@link #checkState(boolean, String, Object...)} for details.
863    *
864    * @since 20.0 (varargs overload since 2.0)
865    */
checkState( boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2, @NullableDecl Object p3, @NullableDecl Object p4)866   public static void checkState(
867       boolean b,
868       @NullableDecl String errorMessageTemplate,
869       @NullableDecl Object p1,
870       @NullableDecl Object p2,
871       @NullableDecl Object p3,
872       @NullableDecl Object p4) {
873     if (!b) {
874       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
875     }
876   }
877 
878   /**
879    * Ensures that an object reference passed as a parameter to the calling method is not null.
880    *
881    * @param reference an object reference
882    * @return the non-null reference that was validated
883    * @throws NullPointerException if {@code reference} is null
884    * @see Verify#verifyNotNull Verify.verifyNotNull()
885    */
886   @CanIgnoreReturnValue
887   @NonNullDecl
checkNotNull(@onNullDecl T reference)888   public static <T extends Object> T checkNotNull(@NonNullDecl T reference) {
889     if (reference == null) {
890       throw new NullPointerException();
891     }
892     return reference;
893   }
894 
895   /**
896    * Ensures that an object reference passed as a parameter to the calling method is not null.
897    *
898    * @param reference an object reference
899    * @param errorMessage the exception message to use if the check fails; will be converted to a
900    *     string using {@link String#valueOf(Object)}
901    * @return the non-null reference that was validated
902    * @throws NullPointerException if {@code reference} is null
903    * @see Verify#verifyNotNull Verify.verifyNotNull()
904    */
905   @CanIgnoreReturnValue
906   @NonNullDecl
checkNotNull( @onNullDecl T reference, @NullableDecl Object errorMessage)907   public static <T extends Object> T checkNotNull(
908       @NonNullDecl T reference, @NullableDecl Object errorMessage) {
909     if (reference == null) {
910       throw new NullPointerException(String.valueOf(errorMessage));
911     }
912     return reference;
913   }
914 
915   /**
916    * Ensures that an object reference passed as a parameter to the calling method is not null.
917    *
918    * @param reference an object reference
919    * @param errorMessageTemplate a template for the exception message should the check fail. The
920    *     message is formed by replacing each {@code %s} placeholder in the template with an
921    *     argument. These are matched by position - the first {@code %s} gets {@code
922    *     errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
923    *     square braces. Unmatched placeholders will be left as-is.
924    * @param errorMessageArgs the arguments to be substituted into the message template. Arguments
925    *     are converted to strings using {@link String#valueOf(Object)}.
926    * @return the non-null reference that was validated
927    * @throws NullPointerException if {@code reference} is null
928    * @see Verify#verifyNotNull Verify.verifyNotNull()
929    */
930   @CanIgnoreReturnValue
931   @NonNullDecl
checkNotNull( @onNullDecl T reference, @NullableDecl String errorMessageTemplate, @NullableDecl Object... errorMessageArgs)932   public static <T extends Object> T checkNotNull(
933       @NonNullDecl T reference,
934       @NullableDecl String errorMessageTemplate,
935       @NullableDecl Object... errorMessageArgs) {
936     if (reference == null) {
937       throw new NullPointerException(lenientFormat(errorMessageTemplate, errorMessageArgs));
938     }
939     return reference;
940   }
941 
942   /**
943    * Ensures that an object reference passed as a parameter to the calling method is not null.
944    *
945    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
946    *
947    * @since 20.0 (varargs overload since 2.0)
948    */
949   @CanIgnoreReturnValue
950   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1)951   public static <T extends Object> T checkNotNull(
952       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1) {
953     if (obj == null) {
954       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
955     }
956     return obj;
957   }
958 
959   /**
960    * Ensures that an object reference passed as a parameter to the calling method is not null.
961    *
962    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
963    *
964    * @since 20.0 (varargs overload since 2.0)
965    */
966   @CanIgnoreReturnValue
967   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1)968   public static <T extends Object> T checkNotNull(
969       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1) {
970     if (obj == null) {
971       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
972     }
973     return obj;
974   }
975 
976   /**
977    * Ensures that an object reference passed as a parameter to the calling method is not null.
978    *
979    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
980    *
981    * @since 20.0 (varargs overload since 2.0)
982    */
983   @CanIgnoreReturnValue
984   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1)985   public static <T extends Object> T checkNotNull(
986       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1) {
987     if (obj == null) {
988       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
989     }
990     return obj;
991   }
992 
993   /**
994    * Ensures that an object reference passed as a parameter to the calling method is not null.
995    *
996    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
997    *
998    * @since 20.0 (varargs overload since 2.0)
999    */
1000   @CanIgnoreReturnValue
1001   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1)1002   public static <T extends Object> T checkNotNull(
1003       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
1004     if (obj == null) {
1005       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
1006     }
1007     return obj;
1008   }
1009 
1010   /**
1011    * Ensures that an object reference passed as a parameter to the calling method is not null.
1012    *
1013    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1014    *
1015    * @since 20.0 (varargs overload since 2.0)
1016    */
1017   @CanIgnoreReturnValue
1018   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, char p2)1019   public static <T extends Object> T checkNotNull(
1020       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, char p2) {
1021     if (obj == null) {
1022       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1023     }
1024     return obj;
1025   }
1026 
1027   /**
1028    * Ensures that an object reference passed as a parameter to the calling method is not null.
1029    *
1030    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1031    *
1032    * @since 20.0 (varargs overload since 2.0)
1033    */
1034   @CanIgnoreReturnValue
1035   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, int p2)1036   public static <T extends Object> T checkNotNull(
1037       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, int p2) {
1038     if (obj == null) {
1039       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1040     }
1041     return obj;
1042   }
1043 
1044   /**
1045    * Ensures that an object reference passed as a parameter to the calling method is not null.
1046    *
1047    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1048    *
1049    * @since 20.0 (varargs overload since 2.0)
1050    */
1051   @CanIgnoreReturnValue
1052   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, long p2)1053   public static <T extends Object> T checkNotNull(
1054       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, long p2) {
1055     if (obj == null) {
1056       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1057     }
1058     return obj;
1059   }
1060 
1061   /**
1062    * Ensures that an object reference passed as a parameter to the calling method is not null.
1063    *
1064    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1065    *
1066    * @since 20.0 (varargs overload since 2.0)
1067    */
1068   @CanIgnoreReturnValue
1069   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2)1070   public static <T extends Object> T checkNotNull(
1071       @NonNullDecl T obj,
1072       @NullableDecl String errorMessageTemplate,
1073       char p1,
1074       @NullableDecl Object p2) {
1075     if (obj == null) {
1076       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1077     }
1078     return obj;
1079   }
1080 
1081   /**
1082    * Ensures that an object reference passed as a parameter to the calling method is not null.
1083    *
1084    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1085    *
1086    * @since 20.0 (varargs overload since 2.0)
1087    */
1088   @CanIgnoreReturnValue
1089   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, char p2)1090   public static <T extends Object> T checkNotNull(
1091       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, char p2) {
1092     if (obj == null) {
1093       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1094     }
1095     return obj;
1096   }
1097 
1098   /**
1099    * Ensures that an object reference passed as a parameter to the calling method is not null.
1100    *
1101    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1102    *
1103    * @since 20.0 (varargs overload since 2.0)
1104    */
1105   @CanIgnoreReturnValue
1106   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, int p2)1107   public static <T extends Object> T checkNotNull(
1108       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, int p2) {
1109     if (obj == null) {
1110       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1111     }
1112     return obj;
1113   }
1114 
1115   /**
1116    * Ensures that an object reference passed as a parameter to the calling method is not null.
1117    *
1118    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1119    *
1120    * @since 20.0 (varargs overload since 2.0)
1121    */
1122   @CanIgnoreReturnValue
1123   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, long p2)1124   public static <T extends Object> T checkNotNull(
1125       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, long p2) {
1126     if (obj == null) {
1127       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1128     }
1129     return obj;
1130   }
1131 
1132   /**
1133    * Ensures that an object reference passed as a parameter to the calling method is not null.
1134    *
1135    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1136    *
1137    * @since 20.0 (varargs overload since 2.0)
1138    */
1139   @CanIgnoreReturnValue
1140   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2)1141   public static <T extends Object> T checkNotNull(
1142       @NonNullDecl T obj,
1143       @NullableDecl String errorMessageTemplate,
1144       int p1,
1145       @NullableDecl Object p2) {
1146     if (obj == null) {
1147       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1148     }
1149     return obj;
1150   }
1151 
1152   /**
1153    * Ensures that an object reference passed as a parameter to the calling method is not null.
1154    *
1155    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1156    *
1157    * @since 20.0 (varargs overload since 2.0)
1158    */
1159   @CanIgnoreReturnValue
1160   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, char p2)1161   public static <T extends Object> T checkNotNull(
1162       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, char p2) {
1163     if (obj == null) {
1164       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1165     }
1166     return obj;
1167   }
1168 
1169   /**
1170    * Ensures that an object reference passed as a parameter to the calling method is not null.
1171    *
1172    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1173    *
1174    * @since 20.0 (varargs overload since 2.0)
1175    */
1176   @CanIgnoreReturnValue
1177   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, int p2)1178   public static <T extends Object> T checkNotNull(
1179       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, int p2) {
1180     if (obj == null) {
1181       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1182     }
1183     return obj;
1184   }
1185 
1186   /**
1187    * Ensures that an object reference passed as a parameter to the calling method is not null.
1188    *
1189    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1190    *
1191    * @since 20.0 (varargs overload since 2.0)
1192    */
1193   @CanIgnoreReturnValue
1194   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, long p2)1195   public static <T extends Object> T checkNotNull(
1196       @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, long p2) {
1197     if (obj == null) {
1198       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1199     }
1200     return obj;
1201   }
1202 
1203   /**
1204    * Ensures that an object reference passed as a parameter to the calling method is not null.
1205    *
1206    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1207    *
1208    * @since 20.0 (varargs overload since 2.0)
1209    */
1210   @CanIgnoreReturnValue
1211   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2)1212   public static <T extends Object> T checkNotNull(
1213       @NonNullDecl T obj,
1214       @NullableDecl String errorMessageTemplate,
1215       long p1,
1216       @NullableDecl Object p2) {
1217     if (obj == null) {
1218       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1219     }
1220     return obj;
1221   }
1222 
1223   /**
1224    * Ensures that an object reference passed as a parameter to the calling method is not null.
1225    *
1226    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1227    *
1228    * @since 20.0 (varargs overload since 2.0)
1229    */
1230   @CanIgnoreReturnValue
1231   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2)1232   public static <T extends Object> T checkNotNull(
1233       @NonNullDecl T obj,
1234       @NullableDecl String errorMessageTemplate,
1235       @NullableDecl Object p1,
1236       char p2) {
1237     if (obj == null) {
1238       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1239     }
1240     return obj;
1241   }
1242 
1243   /**
1244    * Ensures that an object reference passed as a parameter to the calling method is not null.
1245    *
1246    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1247    *
1248    * @since 20.0 (varargs overload since 2.0)
1249    */
1250   @CanIgnoreReturnValue
1251   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2)1252   public static <T extends Object> T checkNotNull(
1253       @NonNullDecl T obj,
1254       @NullableDecl String errorMessageTemplate,
1255       @NullableDecl Object p1,
1256       int p2) {
1257     if (obj == null) {
1258       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1259     }
1260     return obj;
1261   }
1262 
1263   /**
1264    * Ensures that an object reference passed as a parameter to the calling method is not null.
1265    *
1266    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1267    *
1268    * @since 20.0 (varargs overload since 2.0)
1269    */
1270   @CanIgnoreReturnValue
1271   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2)1272   public static <T extends Object> T checkNotNull(
1273       @NonNullDecl T obj,
1274       @NullableDecl String errorMessageTemplate,
1275       @NullableDecl Object p1,
1276       long p2) {
1277     if (obj == null) {
1278       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1279     }
1280     return obj;
1281   }
1282 
1283   /**
1284    * Ensures that an object reference passed as a parameter to the calling method is not null.
1285    *
1286    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1287    *
1288    * @since 20.0 (varargs overload since 2.0)
1289    */
1290   @CanIgnoreReturnValue
1291   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2)1292   public static <T extends Object> T checkNotNull(
1293       @NonNullDecl T obj,
1294       @NullableDecl String errorMessageTemplate,
1295       @NullableDecl Object p1,
1296       @NullableDecl Object p2) {
1297     if (obj == null) {
1298       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
1299     }
1300     return obj;
1301   }
1302 
1303   /**
1304    * Ensures that an object reference passed as a parameter to the calling method is not null.
1305    *
1306    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1307    *
1308    * @since 20.0 (varargs overload since 2.0)
1309    */
1310   @CanIgnoreReturnValue
1311   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2, @NullableDecl Object p3)1312   public static <T extends Object> T checkNotNull(
1313       @NonNullDecl T obj,
1314       @NullableDecl String errorMessageTemplate,
1315       @NullableDecl Object p1,
1316       @NullableDecl Object p2,
1317       @NullableDecl Object p3) {
1318     if (obj == null) {
1319       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2, p3));
1320     }
1321     return obj;
1322   }
1323 
1324   /**
1325    * Ensures that an object reference passed as a parameter to the calling method is not null.
1326    *
1327    * <p>See {@link #checkNotNull(Object, String, Object...)} for details.
1328    *
1329    * @since 20.0 (varargs overload since 2.0)
1330    */
1331   @CanIgnoreReturnValue
1332   @NonNullDecl
checkNotNull( @onNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, @NullableDecl Object p2, @NullableDecl Object p3, @NullableDecl Object p4)1333   public static <T extends Object> T checkNotNull(
1334       @NonNullDecl T obj,
1335       @NullableDecl String errorMessageTemplate,
1336       @NullableDecl Object p1,
1337       @NullableDecl Object p2,
1338       @NullableDecl Object p3,
1339       @NullableDecl Object p4) {
1340     if (obj == null) {
1341       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
1342     }
1343     return obj;
1344   }
1345 
1346   /*
1347    * All recent hotspots (as of 2009) *really* like to have the natural code
1348    *
1349    * if (guardExpression) {
1350    *    throw new BadException(messageExpression);
1351    * }
1352    *
1353    * refactored so that messageExpression is moved to a separate String-returning method.
1354    *
1355    * if (guardExpression) {
1356    *    throw new BadException(badMsg(...));
1357    * }
1358    *
1359    * The alternative natural refactorings into void or Exception-returning methods are much slower.
1360    * This is a big deal - we're talking factors of 2-8 in microbenchmarks, not just 10-20%. (This is
1361    * a hotspot optimizer bug, which should be fixed, but that's a separate, big project).
1362    *
1363    * The coding pattern above is heavily used in java.util, e.g. in ArrayList. There is a
1364    * RangeCheckMicroBenchmark in the JDK that was used to test this.
1365    *
1366    * But the methods in this class want to throw different exceptions, depending on the args, so it
1367    * appears that this pattern is not directly applicable. But we can use the ridiculous, devious
1368    * trick of throwing an exception in the middle of the construction of another exception. Hotspot
1369    * is fine with that.
1370    */
1371 
1372   /**
1373    * Ensures that {@code index} specifies a valid <i>element</i> in an array, list or string of size
1374    * {@code size}. An element index may range from zero, inclusive, to {@code size}, exclusive.
1375    *
1376    * @param index a user-supplied index identifying an element of an array, list or string
1377    * @param size the size of that array, list or string
1378    * @return the value of {@code index}
1379    * @throws IndexOutOfBoundsException if {@code index} is negative or is not less than {@code size}
1380    * @throws IllegalArgumentException if {@code size} is negative
1381    */
1382   @CanIgnoreReturnValue
checkElementIndex(int index, int size)1383   public static int checkElementIndex(int index, int size) {
1384     return checkElementIndex(index, size, "index");
1385   }
1386 
1387   /**
1388    * Ensures that {@code index} specifies a valid <i>element</i> in an array, list or string of size
1389    * {@code size}. An element index may range from zero, inclusive, to {@code size}, exclusive.
1390    *
1391    * @param index a user-supplied index identifying an element of an array, list or string
1392    * @param size the size of that array, list or string
1393    * @param desc the text to use to describe this index in an error message
1394    * @return the value of {@code index}
1395    * @throws IndexOutOfBoundsException if {@code index} is negative or is not less than {@code size}
1396    * @throws IllegalArgumentException if {@code size} is negative
1397    */
1398   @CanIgnoreReturnValue
checkElementIndex(int index, int size, @NullableDecl String desc)1399   public static int checkElementIndex(int index, int size, @NullableDecl String desc) {
1400     // Carefully optimized for execution by hotspot (explanatory comment above)
1401     if (index < 0 || index >= size) {
1402       throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
1403     }
1404     return index;
1405   }
1406 
badElementIndex(int index, int size, @NullableDecl String desc)1407   private static String badElementIndex(int index, int size, @NullableDecl String desc) {
1408     if (index < 0) {
1409       return lenientFormat("%s (%s) must not be negative", desc, index);
1410     } else if (size < 0) {
1411       throw new IllegalArgumentException("negative size: " + size);
1412     } else { // index >= size
1413       return lenientFormat("%s (%s) must be less than size (%s)", desc, index, size);
1414     }
1415   }
1416 
1417   /**
1418    * Ensures that {@code index} specifies a valid <i>position</i> in an array, list or string of
1419    * size {@code size}. A position index may range from zero to {@code size}, inclusive.
1420    *
1421    * @param index a user-supplied index identifying a position in an array, list or string
1422    * @param size the size of that array, list or string
1423    * @return the value of {@code index}
1424    * @throws IndexOutOfBoundsException if {@code index} is negative or is greater than {@code size}
1425    * @throws IllegalArgumentException if {@code size} is negative
1426    */
1427   @CanIgnoreReturnValue
checkPositionIndex(int index, int size)1428   public static int checkPositionIndex(int index, int size) {
1429     return checkPositionIndex(index, size, "index");
1430   }
1431 
1432   /**
1433    * Ensures that {@code index} specifies a valid <i>position</i> in an array, list or string of
1434    * size {@code size}. A position index may range from zero to {@code size}, inclusive.
1435    *
1436    * @param index a user-supplied index identifying a position in an array, list or string
1437    * @param size the size of that array, list or string
1438    * @param desc the text to use to describe this index in an error message
1439    * @return the value of {@code index}
1440    * @throws IndexOutOfBoundsException if {@code index} is negative or is greater than {@code size}
1441    * @throws IllegalArgumentException if {@code size} is negative
1442    */
1443   @CanIgnoreReturnValue
checkPositionIndex(int index, int size, @NullableDecl String desc)1444   public static int checkPositionIndex(int index, int size, @NullableDecl String desc) {
1445     // Carefully optimized for execution by hotspot (explanatory comment above)
1446     if (index < 0 || index > size) {
1447       throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc));
1448     }
1449     return index;
1450   }
1451 
badPositionIndex(int index, int size, @NullableDecl String desc)1452   private static String badPositionIndex(int index, int size, @NullableDecl String desc) {
1453     if (index < 0) {
1454       return lenientFormat("%s (%s) must not be negative", desc, index);
1455     } else if (size < 0) {
1456       throw new IllegalArgumentException("negative size: " + size);
1457     } else { // index > size
1458       return lenientFormat("%s (%s) must not be greater than size (%s)", desc, index, size);
1459     }
1460   }
1461 
1462   /**
1463    * Ensures that {@code start} and {@code end} specify a valid <i>positions</i> in an array, list
1464    * or string of size {@code size}, and are in order. A position index may range from zero to
1465    * {@code size}, inclusive.
1466    *
1467    * @param start a user-supplied index identifying a starting position in an array, list or string
1468    * @param end a user-supplied index identifying a ending position in an array, list or string
1469    * @param size the size of that array, list or string
1470    * @throws IndexOutOfBoundsException if either index is negative or is greater than {@code size},
1471    *     or if {@code end} is less than {@code start}
1472    * @throws IllegalArgumentException if {@code size} is negative
1473    */
checkPositionIndexes(int start, int end, int size)1474   public static void checkPositionIndexes(int start, int end, int size) {
1475     // Carefully optimized for execution by hotspot (explanatory comment above)
1476     if (start < 0 || end < start || end > size) {
1477       throw new IndexOutOfBoundsException(badPositionIndexes(start, end, size));
1478     }
1479   }
1480 
badPositionIndexes(int start, int end, int size)1481   private static String badPositionIndexes(int start, int end, int size) {
1482     if (start < 0 || start > size) {
1483       return badPositionIndex(start, size, "start index");
1484     }
1485     if (end < 0 || end > size) {
1486       return badPositionIndex(end, size, "end index");
1487     }
1488     // end < start
1489     return lenientFormat("end index (%s) must not be less than start index (%s)", end, start);
1490   }
1491 }
1492