View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3;
18  
19  import java.util.Collection;
20  import java.util.Map;
21  import java.util.Objects;
22  import java.util.concurrent.atomic.AtomicInteger;
23  import java.util.function.Supplier;
24  import java.util.regex.Pattern;
25  
26  /**
27   * This class assists in validating arguments. The validation methods are
28   * based along the following principles:
29   * <ul>
30   *   <li>An invalid {@code null} argument causes a {@link NullPointerException}.</li>
31   *   <li>A non-{@code null} argument causes an {@link IllegalArgumentException}.</li>
32   *   <li>An invalid index into an array/collection/map/string causes an {@link IndexOutOfBoundsException}.</li>
33   * </ul>
34   *
35   * <p>All exceptions messages are
36   * <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax">format strings</a>
37   * as defined by the Java platform. For example:
38   *
39   * <pre>
40   * Validate.isTrue(i &gt; 0, "The value must be greater than zero: %d", i);
41   * Validate.notNull(surname, "The surname must not be %s", null);
42   * </pre>
43   *
44   * <p>#ThreadSafe#</p>
45   *
46   * @see String#format(String, Object...)
47   * @since 2.0
48   */
49  public class Validate {
50  
51      private static final String DEFAULT_NOT_NAN_EX_MESSAGE =
52          "The validated value is not a number";
53      private static final String DEFAULT_FINITE_EX_MESSAGE =
54          "The value is invalid: %f";
55      private static final String DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE =
56          "The value %s is not in the specified exclusive range of %s to %s";
57      private static final String DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE =
58          "The value %s is not in the specified inclusive range of %s to %s";
59      private static final String DEFAULT_MATCHES_PATTERN_EX = "The string %s does not match the pattern %s";
60      private static final String DEFAULT_IS_NULL_EX_MESSAGE = "The validated object is null";
61      private static final String DEFAULT_IS_TRUE_EX_MESSAGE = "The validated expression is false";
62      private static final String DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE =
63          "The validated array contains null element at index: %d";
64      private static final String DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE =
65          "The validated collection contains null element at index: %d";
66      private static final String DEFAULT_NOT_BLANK_EX_MESSAGE = "The validated character sequence is blank";
67      private static final String DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE = "The validated array is empty";
68      private static final String DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE =
69          "The validated character sequence is empty";
70      private static final String DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE = "The validated collection is empty";
71      private static final String DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE = "The validated map is empty";
72      private static final String DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE = "The validated array index is invalid: %d";
73      private static final String DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE =
74          "The validated character sequence index is invalid: %d";
75      private static final String DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE =
76          "The validated collection index is invalid: %d";
77      private static final String DEFAULT_VALID_STATE_EX_MESSAGE = "The validated state is false";
78      private static final String DEFAULT_IS_ASSIGNABLE_EX_MESSAGE = "Cannot assign a %s to a %s";
79      private static final String DEFAULT_IS_INSTANCE_OF_EX_MESSAGE = "Expected type: %s, actual: %s";
80  
81      /**
82       * Validate that the specified primitive value falls between the two
83       * exclusive values specified; otherwise, throws an exception.
84       *
85       * <pre>Validate.exclusiveBetween(0.1, 2.1, 1.1);</pre>
86       *
87       * @param start the exclusive start value.
88       * @param end   the exclusive end value.
89       * @param value the value to validate.
90       * @throws IllegalArgumentException if the value falls out of the boundaries.
91       * @since 3.3
92       */
93      @SuppressWarnings("boxing")
94      public static void exclusiveBetween(final double start, final double end, final double value) {
95          // TODO when breaking BC, consider returning value
96          if (value <= start || value >= end) {
97              throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
98          }
99      }
100 
101     /**
102      * Validate that the specified primitive value falls between the two
103      * exclusive values specified; otherwise, throws an exception with the
104      * specified message.
105      *
106      * <pre>Validate.exclusiveBetween(0.1, 2.1, 1.1, "Not in range");</pre>
107      *
108      * @param start the exclusive start value.
109      * @param end   the exclusive end value.
110      * @param value the value to validate.
111      * @param message the exception message if invalid, not null.
112      * @throws IllegalArgumentException if the value falls outside the boundaries.
113      * @since 3.3
114      */
115     public static void exclusiveBetween(final double start, final double end, final double value, final String message) {
116         // TODO when breaking BC, consider returning value
117         if (value <= start || value >= end) {
118             throw new IllegalArgumentException(message);
119         }
120     }
121 
122     /**
123      * Validate that the specified primitive value falls between the two
124      * exclusive values specified; otherwise, throws an exception.
125      *
126      * <pre>Validate.exclusiveBetween(0, 2, 1);</pre>
127      *
128      * @param start the exclusive start value.
129      * @param end   the exclusive end value.
130      * @param value the value to validate.
131      * @throws IllegalArgumentException if the value falls out of the boundaries.
132      * @since 3.3
133      */
134     @SuppressWarnings("boxing")
135     public static void exclusiveBetween(final long start, final long end, final long value) {
136         // TODO when breaking BC, consider returning value
137         if (value <= start || value >= end) {
138             throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
139         }
140     }
141 
142     /**
143      * Validate that the specified primitive value falls between the two
144      * exclusive values specified; otherwise, throws an exception with the
145      * specified message.
146      *
147      * <pre>Validate.exclusiveBetween(0, 2, 1, "Not in range");</pre>
148      *
149      * @param start the exclusive start value.
150      * @param end   the exclusive end value.
151      * @param value the value to validate.
152      * @param message the exception message if invalid, not null.
153      * @throws IllegalArgumentException if the value falls outside the boundaries.
154      * @since 3.3
155      */
156     public static void exclusiveBetween(final long start, final long end, final long value, final String message) {
157         // TODO when breaking BC, consider returning value
158         if (value <= start || value >= end) {
159             throw new IllegalArgumentException(message);
160         }
161     }
162 
163     /**
164      * Validate that the specified argument object fall between the two
165      * exclusive values specified; otherwise, throws an exception.
166      *
167      * <pre>Validate.exclusiveBetween(0, 2, 1);</pre>
168      *
169      * @param <T> the type of the argument object.
170      * @param start  the exclusive start value, not null.
171      * @param end  the exclusive end value, not null.
172      * @param value  the object to validate, not null.
173      * @throws IllegalArgumentException if the value falls outside the boundaries.
174      * @see #exclusiveBetween(Object, Object, Comparable, String, Object...)
175      * @since 3.0
176      */
177     public static <T> void exclusiveBetween(final T start, final T end, final Comparable<T> value) {
178         // TODO when breaking BC, consider returning value
179         if (value.compareTo(start) <= 0 || value.compareTo(end) >= 0) {
180             throw new IllegalArgumentException(String.format(DEFAULT_EXCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
181         }
182     }
183 
184     /**
185      * Validate that the specified argument object fall between the two
186      * exclusive values specified; otherwise, throws an exception with the
187      * specified message.
188      *
189      * <pre>Validate.exclusiveBetween(0, 2, 1, "Not in boundaries");</pre>
190      *
191      * @param <T> the type of the argument object.
192      * @param start  the exclusive start value, not null.
193      * @param end  the exclusive end value, not null.
194      * @param value  the object to validate, not null.
195      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
196      * @param values  the optional values for the formatted exception message, null array not recommended.
197      * @throws IllegalArgumentException if the value falls outside the boundaries.
198      * @see #exclusiveBetween(Object, Object, Comparable)
199      * @since 3.0
200      */
201     public static <T> void exclusiveBetween(final T start, final T end, final Comparable<T> value, final String message, final Object... values) {
202         // TODO when breaking BC, consider returning value
203         if (value.compareTo(start) <= 0 || value.compareTo(end) >= 0) {
204             throw new IllegalArgumentException(getMessage(message, values));
205         }
206     }
207 
208     /**
209      * Validates that the specified argument is not infinite or Not-a-Number (NaN);
210      * otherwise throwing an exception.
211      *
212      * <pre>Validate.finite(myDouble);</pre>
213      *
214      * <p>The message of the exception is &quot;The value is invalid: %f&quot;.</p>
215      *
216      * @param value  the value to validate.
217      * @throws IllegalArgumentException if the value is infinite or Not-a-Number (NaN).
218      * @see #finite(double, String, Object...)
219      * @since 3.5
220      */
221     public static void finite(final double value) {
222         finite(value, DEFAULT_FINITE_EX_MESSAGE, value);
223     }
224 
225     /**
226      * Validates that the specified argument is not infinite or Not-a-Number (NaN);
227      * otherwise throwing an exception with the specified message.
228      *
229      * <pre>Validate.finite(myDouble, "The argument must contain a numeric value");</pre>
230      *
231      * @param value the value to validate.
232      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
233      * @param values  the optional values for the formatted exception message.
234      * @throws IllegalArgumentException if the value is infinite or Not-a-Number (NaN).
235      * @see #finite(double)
236      * @since 3.5
237      */
238     public static void finite(final double value, final String message, final Object... values) {
239         if (Double.isNaN(value) || Double.isInfinite(value)) {
240             throw new IllegalArgumentException(getMessage(message, values));
241         }
242     }
243 
244     /**
245      * Gets the message using {@link String#format(String, Object...) String.format(message, values)} if the values are not empty, otherwise return the message
246      * unformatted. This method exists to allow validation methods declaring a String message and varargs parameters to be used without any message parameters
247      * when the message contains special characters, e.g. {@code Validate.isTrue(false, "%Failed%")}.
248      *
249      * @param message the {@link String#format(String, Object...)} exception message if invalid, not null.
250      * @param values  the optional values for the formatted message.
251      * @return formatted message using {@link String#format(String, Object...) String.format(message, values)} if the values are not empty, otherwise return the
252      *         unformatted message.
253      */
254     private static String getMessage(final String message, final Object... values) {
255         return ArrayUtils.isEmpty(values) ? message : String.format(message, values);
256     }
257 
258     /**
259      * Validate that the specified primitive value falls between the two
260      * inclusive values specified; otherwise, throws an exception.
261      *
262      * <pre>Validate.inclusiveBetween(0.1, 2.1, 1.1);</pre>
263      *
264      * @param start the inclusive start value.
265      * @param end   the inclusive end value.
266      * @param value the value to validate.
267      * @throws IllegalArgumentException if the value falls outside the boundaries (inclusive).
268      * @since 3.3
269      */
270     @SuppressWarnings("boxing")
271     public static void inclusiveBetween(final double start, final double end, final double value) {
272         // TODO when breaking BC, consider returning value
273         if (value < start || value > end) {
274             throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
275         }
276     }
277 
278     /**
279      * Validate that the specified primitive value falls between the two
280      * inclusive values specified; otherwise, throws an exception with the
281      * specified message.
282      *
283      * <pre>Validate.inclusiveBetween(0.1, 2.1, 1.1, "Not in range");</pre>
284      *
285      * @param start the inclusive start value.
286      * @param end   the inclusive end value.
287      * @param value the value to validate.
288      * @param message the exception message if invalid, not null.
289      * @throws IllegalArgumentException if the value falls outside the boundaries.
290      * @since 3.3
291      */
292     public static void inclusiveBetween(final double start, final double end, final double value, final String message) {
293         // TODO when breaking BC, consider returning value
294         if (value < start || value > end) {
295             throw new IllegalArgumentException(message);
296         }
297     }
298 
299     /**
300      * Validate that the specified primitive value falls between the two
301      * inclusive values specified; otherwise, throws an exception.
302      *
303      * <pre>Validate.inclusiveBetween(0, 2, 1);</pre>
304      *
305      * @param start the inclusive start value.
306      * @param end   the inclusive end value.
307      * @param value the value to validate.
308      * @throws IllegalArgumentException if the value falls outside the boundaries (inclusive).
309      * @since 3.3
310      */
311     @SuppressWarnings("boxing")
312     public static void inclusiveBetween(final long start, final long end, final long value) {
313         // TODO when breaking BC, consider returning value
314         if (value < start || value > end) {
315             throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
316         }
317     }
318 
319     /**
320      * Validate that the specified primitive value falls between the two
321      * inclusive values specified; otherwise, throws an exception with the
322      * specified message.
323      *
324      * <pre>Validate.inclusiveBetween(0, 2, 1, "Not in range");</pre>
325      *
326      * @param start the inclusive start value.
327      * @param end   the inclusive end value.
328      * @param value the value to validate.
329      * @param message the exception message if invalid, not null.
330      * @throws IllegalArgumentException if the value falls outside the boundaries.
331      * @since 3.3
332      */
333     public static void inclusiveBetween(final long start, final long end, final long value, final String message) {
334         // TODO when breaking BC, consider returning value
335         if (value < start || value > end) {
336             throw new IllegalArgumentException(message);
337         }
338     }
339 
340     /**
341      * Validate that the specified argument object fall between the two
342      * inclusive values specified; otherwise, throws an exception.
343      *
344      * <pre>Validate.inclusiveBetween(0, 2, 1);</pre>
345      *
346      * @param <T> the type of the argument object.
347      * @param start  the inclusive start value, not null.
348      * @param end  the inclusive end value, not null.
349      * @param value  the object to validate, not null.
350      * @throws IllegalArgumentException if the value falls outside the boundaries.
351      * @see #inclusiveBetween(Object, Object, Comparable, String, Object...)
352      * @since 3.0
353      */
354     public static <T> void inclusiveBetween(final T start, final T end, final Comparable<T> value) {
355         // TODO when breaking BC, consider returning value
356         if (value.compareTo(start) < 0 || value.compareTo(end) > 0) {
357             throw new IllegalArgumentException(String.format(DEFAULT_INCLUSIVE_BETWEEN_EX_MESSAGE, value, start, end));
358         }
359     }
360 
361     /**
362      * Validate that the specified argument object fall between the two
363      * inclusive values specified; otherwise, throws an exception with the
364      * specified message.
365      *
366      * <pre>Validate.inclusiveBetween(0, 2, 1, "Not in boundaries");</pre>
367      *
368      * @param <T> the type of the argument object.
369      * @param start  the inclusive start value, not null.
370      * @param end  the inclusive end value, not null.
371      * @param value  the object to validate, not null.
372      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
373      * @param values  the optional values for the formatted exception message, null array not recommended.
374      * @throws IllegalArgumentException if the value falls outside the boundaries.
375      * @see #inclusiveBetween(Object, Object, Comparable)
376      * @since 3.0
377      */
378     public static <T> void inclusiveBetween(final T start, final T end, final Comparable<T> value, final String message, final Object... values) {
379         // TODO when breaking BC, consider returning value
380         if (value.compareTo(start) < 0 || value.compareTo(end) > 0) {
381             throw new IllegalArgumentException(getMessage(message, values));
382         }
383     }
384 
385     /**
386      * Validates that the argument can be converted to the specified class, if not, throws an exception.
387      *
388      * <p>This method is useful when validating that there will be no casting errors.</p>
389      *
390      * <pre>Validate.isAssignableFrom(SuperClass.class, object.getClass());</pre>
391      *
392      * <p>The message format of the exception is &quot;Cannot assign {type} to {superType}&quot;</p>
393      *
394      * @param superType  the class must be validated against, not null.
395      * @param type  the class to check, not null.
396      * @throws IllegalArgumentException if type argument is not assignable to the specified superType.
397      * @see #isAssignableFrom(Class, Class, String, Object...)
398      * @since 3.0
399      */
400     public static void isAssignableFrom(final Class<?> superType, final Class<?> type) {
401         // TODO when breaking BC, consider returning type
402         if (type == null || superType == null || !superType.isAssignableFrom(type)) {
403             throw new IllegalArgumentException(
404                 String.format(DEFAULT_IS_ASSIGNABLE_EX_MESSAGE, ClassUtils.getName(type, "null type"), ClassUtils.getName(superType, "null type")));
405         }
406     }
407 
408     /**
409      * Validates that the argument can be converted to the specified class, if not throws an exception.
410      *
411      * <p>This method is useful when validating if there will be no casting errors.</p>
412      *
413      * <pre>Validate.isAssignableFrom(SuperClass.class, object.getClass());</pre>
414      *
415      * <p>The message of the exception is &quot;The validated object cannot be converted to the&quot;
416      * followed by the name of the class and &quot;class&quot;</p>
417      *
418      * @param superType  the class must be validated against, not null.
419      * @param type  the class to check, not null.
420      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
421      * @param values  the optional values for the formatted exception message, null array not recommended.
422      * @throws IllegalArgumentException if argument cannot be converted to the specified class.
423      * @see #isAssignableFrom(Class, Class)
424      */
425     public static void isAssignableFrom(final Class<?> superType, final Class<?> type, final String message, final Object... values) {
426         // TODO when breaking BC, consider returning type
427         if (!superType.isAssignableFrom(type)) {
428             throw new IllegalArgumentException(getMessage(message, values));
429         }
430     }
431 
432     /**
433      * Validates that the argument is an instance of the specified class, if not throws an exception.
434      *
435      * <p>This method is useful when validating according to an arbitrary class</p>
436      *
437      * <pre>Validate.isInstanceOf(OkClass.class, object);</pre>
438      *
439      * <p>The message of the exception is &quot;Expected type: {type}, actual: {obj_type}&quot;</p>
440      *
441      * @param type  the class the object must be validated against, not null.
442      * @param obj  the object to check, null throws an exception.
443      * @throws IllegalArgumentException if argument is not of specified class.
444      * @see #isInstanceOf(Class, Object, String, Object...)
445      * @since 3.0
446      */
447     public static void isInstanceOf(final Class<?> type, final Object obj) {
448         // TODO when breaking BC, consider returning obj
449         if (!type.isInstance(obj)) {
450             throw new IllegalArgumentException(String.format(DEFAULT_IS_INSTANCE_OF_EX_MESSAGE, type.getName(), ClassUtils.getName(obj, "null")));
451         }
452     }
453 
454     /**
455      * Validate that the argument is an instance of the specified class; otherwise
456      * throwing an exception with the specified message. This method is useful when
457      * validating according to an arbitrary class
458      *
459      * <pre>Validate.isInstanceOf(OkClass.class, object, "Wrong class, object is of class %s",
460      *   object.getClass().getName());</pre>
461      *
462      * @param type  the class the object must be validated against, not null.
463      * @param obj  the object to check, null throws an exception.
464      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
465      * @param values  the optional values for the formatted exception message, null array not recommended.
466      * @throws IllegalArgumentException if argument is not of specified class.
467      * @see #isInstanceOf(Class, Object)
468      * @since 3.0
469      */
470     public static void isInstanceOf(final Class<?> type, final Object obj, final String message, final Object... values) {
471         // TODO when breaking BC, consider returning obj
472         if (!type.isInstance(obj)) {
473             throw new IllegalArgumentException(getMessage(message, values));
474         }
475     }
476 
477     /**
478      * Validate that the argument condition is {@code true}; otherwise
479      * throwing an exception. This method is useful when validating according
480      * to an arbitrary boolean expression, such as validating a
481      * primitive number or using your own custom validation expression.
482      *
483      * <pre>
484      * Validate.isTrue(i &gt; 0);
485      * Validate.isTrue(myObject.isOk());</pre>
486      *
487      * <p>The message of the exception is &quot;The validated expression is
488      * false&quot;.</p>
489      *
490      * @param expression  the boolean expression to check.
491      * @throws IllegalArgumentException if expression is {@code false}.
492      * @see #isTrue(boolean, String, long)
493      * @see #isTrue(boolean, String, double)
494      * @see #isTrue(boolean, String, Object...)
495      * @see #isTrue(boolean, Supplier)
496      */
497     public static void isTrue(final boolean expression) {
498         if (!expression) {
499             throw new IllegalArgumentException(DEFAULT_IS_TRUE_EX_MESSAGE);
500         }
501     }
502 
503     /**
504      * Validate that the argument condition is {@code true}; otherwise
505      * throwing an exception with the specified message. This method is useful when
506      * validating according to an arbitrary boolean expression, such as validating a
507      * primitive number or using your own custom validation expression.
508      *
509      * <pre>Validate.isTrue(d &gt; 0.0, "The value must be greater than zero: &#37;s", d);</pre>
510      *
511      * <p>For performance reasons, the double value is passed as a separate parameter and
512      * appended to the exception message only in the case of an error.</p>
513      *
514      * @param expression  the boolean expression to check.
515      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
516      * @param value  the value to append to the message when invalid.
517      * @throws IllegalArgumentException if expression is {@code false}.
518      * @see #isTrue(boolean)
519      * @see #isTrue(boolean, String, long)
520      * @see #isTrue(boolean, String, Object...)
521      * @see #isTrue(boolean, Supplier)
522      */
523     public static void isTrue(final boolean expression, final String message, final double value) {
524         if (!expression) {
525             throw new IllegalArgumentException(String.format(message, Double.valueOf(value)));
526         }
527     }
528 
529     /**
530      * Validate that the argument condition is {@code true}; otherwise
531      * throwing an exception with the specified message. This method is useful when
532      * validating according to an arbitrary boolean expression, such as validating a
533      * primitive number or using your own custom validation expression.
534      *
535      * <pre>Validate.isTrue(i &gt; 0.0, "The value must be greater than zero: &#37;d", i);</pre>
536      *
537      * <p>For performance reasons, the long value is passed as a separate parameter and
538      * appended to the exception message only in the case of an error.</p>
539      *
540      * @param expression  the boolean expression to check.
541      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
542      * @param value  the value to append to the message when invalid.
543      * @throws IllegalArgumentException if expression is {@code false}.
544      * @see #isTrue(boolean)
545      * @see #isTrue(boolean, String, double)
546      * @see #isTrue(boolean, String, Object...)
547      * @see #isTrue(boolean, Supplier)
548      */
549     public static void isTrue(final boolean expression, final String message, final long value) {
550         if (!expression) {
551             throw new IllegalArgumentException(String.format(message, Long.valueOf(value)));
552         }
553     }
554 
555     /**
556      * Validate that the argument condition is {@code true}; otherwise
557      * throwing an exception with the specified message. This method is useful when
558      * validating according to an arbitrary boolean expression, such as validating a
559      * primitive number or using your own custom validation expression.
560      *
561      * <pre>{@code
562      * Validate.isTrue(i >= min &amp;&amp; i <= max, "The value must be between %d and %d", min, max);}</pre>
563      *
564      * @param expression  the boolean expression to check.
565      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
566      * @param values  the optional values for the formatted exception message, null array not recommended.
567      * @throws IllegalArgumentException if expression is {@code false}.
568      * @see #isTrue(boolean)
569      * @see #isTrue(boolean, String, long)
570      * @see #isTrue(boolean, String, double)
571      * @see #isTrue(boolean, Supplier)
572      */
573     public static void isTrue(final boolean expression, final String message, final Object... values) {
574         if (!expression) {
575             throw new IllegalArgumentException(getMessage(message, values));
576         }
577     }
578 
579     /**
580      * Validate that the argument condition is {@code true}; otherwise throwing an exception with the specified message. This method is useful when validating
581      * according to an arbitrary boolean expression, such as validating a primitive number or using your own custom validation expression.
582      *
583      * <pre>{@code
584      * Validate.isTrue(i >= min && i <= max, "The value must be between %d and %d", min, max);
585      * }</pre>
586      *
587      * @param expression      the boolean expression to check.
588      * @param messageSupplier the exception message supplier.
589      * @throws IllegalArgumentException if expression is {@code false}.
590      * @see #isTrue(boolean)
591      * @see #isTrue(boolean, String, long)
592      * @see #isTrue(boolean, String, double)
593      * @since 3.18.0
594      */
595     public static void isTrue(final boolean expression, final Supplier<String> messageSupplier) {
596         if (!expression) {
597             throw new IllegalArgumentException(messageSupplier.get());
598         }
599     }
600 
601     /**
602      * Validate that the specified argument character sequence matches the specified regular
603      * expression pattern; otherwise throwing an exception.
604      *
605      * <pre>Validate.matchesPattern("hi", "[a-z]*");</pre>
606      *
607      * <p>The syntax of the pattern is the one used in the {@link Pattern} class.</p>
608      *
609      * @param input  the character sequence to validate, not null.
610      * @param pattern  the regular expression pattern, not null.
611      * @throws IllegalArgumentException if the character sequence does not match the pattern.
612      * @see #matchesPattern(CharSequence, String, String, Object...)
613      * @since 3.0
614      */
615     public static void matchesPattern(final CharSequence input, final String pattern) {
616         // TODO when breaking BC, consider returning input
617         if (!Pattern.matches(pattern, input)) {
618             throw new IllegalArgumentException(String.format(DEFAULT_MATCHES_PATTERN_EX, input, pattern));
619         }
620     }
621 
622     /**
623      * Validate that the specified argument character sequence matches the specified regular
624      * expression pattern; otherwise throwing an exception with the specified message.
625      *
626      * <pre>Validate.matchesPattern("hi", "[a-z]*", "%s does not match %s", "hi" "[a-z]*");</pre>
627      *
628      * <p>The syntax of the pattern is the one used in the {@link Pattern} class.</p>
629      *
630      * @param input  the character sequence to validate, not null.
631      * @param pattern  the regular expression pattern, not null.
632      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
633      * @param values  the optional values for the formatted exception message, null array not recommended.
634      * @throws IllegalArgumentException if the character sequence does not match the pattern.
635      * @see #matchesPattern(CharSequence, String)
636      * @since 3.0
637      */
638     public static void matchesPattern(final CharSequence input, final String pattern, final String message, final Object... values) {
639         // TODO when breaking BC, consider returning input
640         if (!Pattern.matches(pattern, input)) {
641             throw new IllegalArgumentException(getMessage(message, values));
642         }
643     }
644 
645     /**
646      * Validate that the specified argument iterable is neither
647      * {@code null} nor contains any elements that are {@code null};
648      * otherwise throwing an exception.
649      *
650      * <pre>Validate.noNullElements(myCollection);</pre>
651      *
652      * <p>If the iterable is {@code null}, then the message in the exception
653      * is &quot;The validated object is null&quot;.
654      *
655      * <p>If the array has a {@code null} element, then the message in the
656      * exception is &quot;The validated iterable contains null element at index:
657      * &quot; followed by the index.</p>
658      *
659      * @param <T> the iterable type.
660      * @param iterable  the iterable to check, validated not null by this method.
661      * @return the validated iterable (never {@code null} method for chaining).
662      * @throws NullPointerException if the array is {@code null}.
663      * @throws IllegalArgumentException if an element is {@code null}.
664      * @see #noNullElements(Iterable, String, Object...)
665      */
666     public static <T extends Iterable<?>> T noNullElements(final T iterable) {
667         return noNullElements(iterable, DEFAULT_NO_NULL_ELEMENTS_COLLECTION_EX_MESSAGE);
668     }
669 
670     /**
671      * Validate that the specified argument iterable is neither
672      * {@code null} nor contains any elements that are {@code null};
673      * otherwise throwing an exception with the specified message.
674      *
675      * <pre>Validate.noNullElements(myCollection, "The collection contains null at position %d");</pre>
676      *
677      * <p>If the iterable is {@code null}, then the message in the exception
678      * is &quot;The validated object is null&quot;.
679      *
680      * <p>If the iterable has a {@code null} element, then the iteration
681      * index of the invalid element is appended to the {@code values}
682      * argument.</p>
683      *
684      * @param <T> the iterable type.
685      * @param iterable  the iterable to check, validated not null by this method.
686      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
687      * @param values  the optional values for the formatted exception message, null array not recommended.
688      * @return the validated iterable (never {@code null} method for chaining).
689      * @throws NullPointerException if the array is {@code null}.
690      * @throws IllegalArgumentException if an element is {@code null}.
691      * @see #noNullElements(Iterable)
692      */
693     public static <T extends Iterable<?>> T noNullElements(final T iterable, final String message, final Object... values) {
694         Objects.requireNonNull(iterable, "iterable");
695         final AtomicInteger ai = new AtomicInteger();
696         iterable.forEach(e -> {
697             if (e == null) {
698                 throw new IllegalArgumentException(getMessage(message, ArrayUtils.addAll(values, ai.getAndIncrement())));
699             }
700         });
701         return iterable;
702     }
703 
704     /**
705      * Validate that the specified argument array is neither
706      * {@code null} nor contains any elements that are {@code null};
707      * otherwise throwing an exception.
708      *
709      * <pre>Validate.noNullElements(myArray);</pre>
710      *
711      * <p>If the array is {@code null}, then the message in the exception
712      * is &quot;The validated object is null&quot;.</p>
713      *
714      * <p>If the array has a {@code null} element, then the message in the
715      * exception is &quot;The validated array contains null element at index:
716      * &quot; followed by the index.</p>
717      *
718      * @param <T> the array type.
719      * @param array  the array to check, validated not null by this method.
720      * @return the validated array (never {@code null} method for chaining).
721      * @throws NullPointerException if the array is {@code null}.
722      * @throws IllegalArgumentException if an element is {@code null}.
723      * @see #noNullElements(Object[], String, Object...)
724      */
725     public static <T> T[] noNullElements(final T[] array) {
726         return noNullElements(array, DEFAULT_NO_NULL_ELEMENTS_ARRAY_EX_MESSAGE);
727     }
728 
729     /**
730      * Validate that the specified argument array is neither
731      * {@code null} nor contains any elements that are {@code null};
732      * otherwise throwing an exception with the specified message.
733      *
734      * <pre>Validate.noNullElements(myArray, "The array contain null at position %d");</pre>
735      *
736      * <p>If the array is {@code null}, then the message in the exception
737      * is &quot;The validated object is null&quot;.
738      *
739      * <p>If the array has a {@code null} element, then the iteration
740      * index of the invalid element is appended to the {@code values}
741      * argument.</p>
742      *
743      * @param <T> the array type.
744      * @param array  the array to check, validated not null by this method.
745      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
746      * @param values  the optional values for the formatted exception message, null array not recommended.
747      * @return the validated array (never {@code null} method for chaining).
748      * @throws NullPointerException if the array is {@code null}.
749      * @throws IllegalArgumentException if an element is {@code null}.
750      * @see #noNullElements(Object[])
751      */
752     public static <T> T[] noNullElements(final T[] array, final String message, final Object... values) {
753         Objects.requireNonNull(array, "array");
754         for (int i = 0; i < array.length; i++) {
755             if (array[i] == null) {
756                 final Object[] values2 = ArrayUtils.add(values, Integer.valueOf(i));
757                 throw new IllegalArgumentException(getMessage(message, values2));
758             }
759         }
760         return array;
761     }
762 
763     /**
764      * <p>Validates that the specified argument character sequence is
765      * neither {@code null}, a length of zero (no characters), empty
766      * nor whitespace; otherwise throwing an exception.
767      *
768      * <pre>Validate.notBlank(myString);</pre>
769      *
770      * <p>The message in the exception is &quot;The validated character
771      * sequence is blank&quot;.
772      *
773      * @param <T> the character sequence type.
774      * @param chars  the character sequence to check, validated not null by this method.
775      * @return the validated character sequence (never {@code null} method for chaining).
776      * @throws NullPointerException if the character sequence is {@code null}.
777      * @throws IllegalArgumentException if the character sequence is blank.
778      * @see #notBlank(CharSequence, String, Object...)
779      * @since 3.0
780      */
781     public static <T extends CharSequence> T notBlank(final T chars) {
782         return notBlank(chars, DEFAULT_NOT_BLANK_EX_MESSAGE);
783     }
784 
785     /**
786      * Validates that the specified argument character sequence is not {@link StringUtils#isBlank(CharSequence) blank} (whitespaces, empty ({@code ""}) or
787      * {@code null}); otherwise throwing an exception with the specified message.
788      *
789      * <pre>
790      * Validate.notBlank(myString, "The string must not be blank");
791      * </pre>
792      *
793      * @param <T>     the character sequence type.
794      * @param chars   the character sequence to check, validated not null by this method.
795      * @param message the {@link String#format(String, Object...)} exception message if invalid, not null.
796      * @param values  the optional values for the formatted exception message, null array not recommended.
797      * @return the validated character sequence (never {@code null} method for chaining).
798      * @throws NullPointerException     if the character sequence is {@code null}.
799      * @throws IllegalArgumentException if the character sequence is blank.
800      * @see #notBlank(CharSequence)
801      * @see StringUtils#isBlank(CharSequence)
802      * @since 3.0
803      */
804     public static <T extends CharSequence> T notBlank(final T chars, final String message, final Object... values) {
805         Objects.requireNonNull(chars, toSupplier(message, values));
806         if (StringUtils.isBlank(chars)) {
807             throw new IllegalArgumentException(getMessage(message, values));
808         }
809         return chars;
810     }
811 
812     /**
813      * <p>Validates that the specified argument collection is neither {@code null}
814      * nor a size of zero (no elements); otherwise throwing an exception.
815      *
816      * <pre>Validate.notEmpty(myCollection);</pre>
817      *
818      * <p>The message in the exception is &quot;The validated collection is
819      * empty&quot;.
820      *
821      * @param <T> the collection type.
822      * @param collection  the collection to check, validated not null by this method.
823      * @return the validated collection (never {@code null} method for chaining).
824      * @throws NullPointerException if the collection is {@code null}.
825      * @throws IllegalArgumentException if the collection is empty.
826      * @see #notEmpty(Collection, String, Object...)
827      */
828     public static <T extends Collection<?>> T notEmpty(final T collection) {
829         return notEmpty(collection, DEFAULT_NOT_EMPTY_COLLECTION_EX_MESSAGE);
830     }
831 
832     /**
833      * <p>Validates that the specified argument map is neither {@code null}
834      * nor a size of zero (no elements); otherwise throwing an exception.
835      *
836      * <pre>Validate.notEmpty(myMap);</pre>
837      *
838      * <p>The message in the exception is &quot;The validated map is
839      * empty&quot;.
840      *
841      * @param <T> the map type.
842      * @param map  the map to check, validated not null by this method.
843      * @return the validated map (never {@code null} method for chaining).
844      * @throws NullPointerException if the map is {@code null}.
845      * @throws IllegalArgumentException if the map is empty.
846      * @see #notEmpty(Map, String, Object...)
847      */
848     public static <T extends Map<?, ?>> T notEmpty(final T map) {
849         return notEmpty(map, DEFAULT_NOT_EMPTY_MAP_EX_MESSAGE);
850     }
851 
852     /**
853      * <p>Validates that the specified argument character sequence is
854      * neither {@code null} nor a length of zero (no characters);
855      * otherwise throwing an exception with the specified message.
856      *
857      * <pre>Validate.notEmpty(myString);</pre>
858      *
859      * <p>The message in the exception is &quot;The validated
860      * character sequence is empty&quot;.
861      *
862      * @param <T> the character sequence type.
863      * @param chars  the character sequence to check, validated not null by this method.
864      * @return the validated character sequence (never {@code null} method for chaining).
865      * @throws NullPointerException if the character sequence is {@code null}.
866      * @throws IllegalArgumentException if the character sequence is empty.
867      * @see #notEmpty(CharSequence, String, Object...)
868      */
869     public static <T extends CharSequence> T notEmpty(final T chars) {
870         return notEmpty(chars, DEFAULT_NOT_EMPTY_CHAR_SEQUENCE_EX_MESSAGE);
871     }
872 
873     /**
874      * <p>Validates that the specified argument collection is neither {@code null}
875      * nor a size of zero (no elements); otherwise throwing an exception
876      * with the specified message.
877      *
878      * <pre>Validate.notEmpty(myCollection, "The collection must not be empty");</pre>
879      *
880      * @param <T> the collection type.
881      * @param collection  the collection to check, validated not null by this method.
882      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
883      * @param values  the optional values for the formatted exception message, null array not recommended.
884      * @return the validated collection (never {@code null} method for chaining).
885      * @throws NullPointerException if the collection is {@code null}.
886      * @throws IllegalArgumentException if the collection is empty.
887      * @see #notEmpty(Object[])
888      */
889     public static <T extends Collection<?>> T notEmpty(final T collection, final String message, final Object... values) {
890         Objects.requireNonNull(collection, toSupplier(message, values));
891         if (collection.isEmpty()) {
892             throw new IllegalArgumentException(getMessage(message, values));
893         }
894         return collection;
895     }
896 
897     /**
898      * Validate that the specified argument map is neither {@code null}
899      * nor a size of zero (no elements); otherwise throwing an exception
900      * with the specified message.
901      *
902      * <pre>Validate.notEmpty(myMap, "The map must not be empty");</pre>
903      *
904      * @param <T> the map type.
905      * @param map  the map to check, validated not null by this method.
906      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
907      * @param values  the optional values for the formatted exception message, null array not recommended.
908      * @return the validated map (never {@code null} method for chaining).
909      * @throws NullPointerException if the map is {@code null}.
910      * @throws IllegalArgumentException if the map is empty.
911      * @see #notEmpty(Object[])
912      */
913     public static <T extends Map<?, ?>> T notEmpty(final T map, final String message, final Object... values) {
914         Objects.requireNonNull(map, toSupplier(message, values));
915         if (map.isEmpty()) {
916             throw new IllegalArgumentException(getMessage(message, values));
917         }
918         return map;
919     }
920 
921     /**
922      * Validate that the specified argument character sequence is
923      * neither {@code null} nor a length of zero (no characters);
924      * otherwise throwing an exception with the specified message.
925      *
926      * <pre>Validate.notEmpty(myString, "The string must not be empty");</pre>
927      *
928      * @param <T> the character sequence type.
929      * @param chars  the character sequence to check, validated not null by this method.
930      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
931      * @param values  the optional values for the formatted exception message, null array not recommended.
932      * @return the validated character sequence (never {@code null} method for chaining).
933      * @throws NullPointerException if the character sequence is {@code null}.
934      * @throws IllegalArgumentException if the character sequence is empty.
935      * @see #notEmpty(CharSequence)
936      */
937     public static <T extends CharSequence> T notEmpty(final T chars, final String message, final Object... values) {
938         Objects.requireNonNull(chars, toSupplier(message, values));
939         if (chars.length() == 0) {
940             throw new IllegalArgumentException(getMessage(message, values));
941         }
942         return chars;
943     }
944 
945     /**
946      * <p>Validates that the specified argument array is neither {@code null}
947      * nor a length of zero (no elements); otherwise throwing an exception.
948      *
949      * <pre>Validate.notEmpty(myArray);</pre>
950      *
951      * <p>The message in the exception is &quot;The validated array is
952      * empty&quot;.
953      *
954      * @param <T> the array type.
955      * @param array  the array to check, validated not null by this method.
956      * @return the validated array (never {@code null} method for chaining).
957      * @throws NullPointerException if the array is {@code null}.
958      * @throws IllegalArgumentException if the array is empty.
959      * @see #notEmpty(Object[], String, Object...)
960      */
961     public static <T> T[] notEmpty(final T[] array) {
962         return notEmpty(array, DEFAULT_NOT_EMPTY_ARRAY_EX_MESSAGE);
963     }
964 
965     /**
966      * <p>Validates that the specified argument array is neither {@code null}
967      * nor a length of zero (no elements); otherwise throwing an exception
968      * with the specified message.
969      *
970      * <pre>Validate.notEmpty(myArray, "The array must not be empty");</pre>
971      *
972      * @param <T> the array type.
973      * @param array  the array to check, validated not null by this method.
974      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
975      * @param values  the optional values for the formatted exception message, null array not recommended.
976      * @return the validated array (never {@code null} method for chaining).
977      * @throws NullPointerException if the array is {@code null}
978      * @throws IllegalArgumentException if the array is empty
979      * @see #notEmpty(Object[])
980      */
981     public static <T> T[] notEmpty(final T[] array, final String message, final Object... values) {
982         Objects.requireNonNull(array, toSupplier(message, values));
983         if (array.length == 0) {
984             throw new IllegalArgumentException(getMessage(message, values));
985         }
986         return array;
987     }
988 
989     /**
990      * Validates that the specified argument is not Not-a-Number (NaN); otherwise
991      * throwing an exception.
992      *
993      * <pre>Validate.notNaN(myDouble);</pre>
994      *
995      * <p>The message of the exception is &quot;The validated value is not a
996      * number&quot;.</p>
997      *
998      * @param value  the value to validate.
999      * @throws IllegalArgumentException if the value is not a number.
1000      * @see #notNaN(double, String, Object...)
1001      * @since 3.5
1002      */
1003     public static void notNaN(final double value) {
1004         notNaN(value, DEFAULT_NOT_NAN_EX_MESSAGE);
1005     }
1006 
1007     /**
1008      * Validates that the specified argument is not Not-a-Number (NaN); otherwise
1009      * throwing an exception with the specified message.
1010      *
1011      * <pre>Validate.notNaN(myDouble, "The value must be a number");</pre>
1012      *
1013      * @param value  the value to validate.
1014      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
1015      * @param values  the optional values for the formatted exception message.
1016      * @throws IllegalArgumentException if the value is not a number.
1017      * @see #notNaN(double)
1018      * @since 3.5
1019      */
1020     public static void notNaN(final double value, final String message, final Object... values) {
1021         if (Double.isNaN(value)) {
1022             throw new IllegalArgumentException(getMessage(message, values));
1023         }
1024     }
1025 
1026     /**
1027      * Validate that the specified argument is not {@code null};
1028      * otherwise throwing an exception.
1029      *
1030      * <pre>Validate.notNull(myObject, "The object must not be null");</pre>
1031      *
1032      * <p>The message of the exception is &quot;The validated object is
1033      * null&quot;.
1034      *
1035      * @param <T> the object type.
1036      * @param object  the object to check.
1037      * @return the validated object (never {@code null} for method chaining).
1038      * @throws NullPointerException if the object is {@code null}.
1039      * @see #notNull(Object, String, Object...)
1040      * @deprecated Use {@link Objects#requireNonNull(Object)}.
1041      */
1042     @Deprecated
1043     public static <T> T notNull(final T object) {
1044         return notNull(object, DEFAULT_IS_NULL_EX_MESSAGE);
1045     }
1046 
1047     /**
1048      * Validate that the specified argument is not {@code null};
1049      * otherwise throwing an exception with the specified message.
1050      *
1051      * <pre>Validate.notNull(myObject, "The object must not be null");</pre>
1052      *
1053      * @param <T> the object type.
1054      * @param object  the object to check.
1055      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
1056      * @param values  the optional values for the formatted exception message.
1057      * @return the validated object (never {@code null} for method chaining).
1058      * @throws NullPointerException if the object is {@code null}.
1059      * @see Objects#requireNonNull(Object)
1060      */
1061     public static <T> T notNull(final T object, final String message, final Object... values) {
1062         return Objects.requireNonNull(object, toSupplier(message, values));
1063     }
1064 
1065     private static Supplier<String> toSupplier(final String message, final Object... values) {
1066         return () -> getMessage(message, values);
1067     }
1068 
1069     /**
1070      * Validates that the index is within the bounds of the argument
1071      * collection; otherwise throwing an exception.
1072      *
1073      * <pre>Validate.validIndex(myCollection, 2);</pre>
1074      *
1075      * <p>If the index is invalid, then the message of the exception
1076      * is &quot;The validated collection index is invalid: &quot;
1077      * followed by the index.</p>
1078      *
1079      * @param <T> the collection type.
1080      * @param collection  the collection to check, validated not null by this method.
1081      * @param index  the index to check.
1082      * @return the validated collection (never {@code null} for method chaining).
1083      * @throws NullPointerException if the collection is {@code null}.
1084      * @throws IndexOutOfBoundsException if the index is invalid.
1085      * @see #validIndex(Collection, int, String, Object...)
1086      * @since 3.0
1087      */
1088     public static <T extends Collection<?>> T validIndex(final T collection, final int index) {
1089         return validIndex(collection, index, DEFAULT_VALID_INDEX_COLLECTION_EX_MESSAGE, Integer.valueOf(index));
1090     }
1091 
1092     /**
1093      * Validates that the index is within the bounds of the argument
1094      * character sequence; otherwise throwing an exception.
1095      *
1096      * <pre>Validate.validIndex(myStr, 2);</pre>
1097      *
1098      * <p>If the character sequence is {@code null}, then the message
1099      * of the exception is &quot;The validated object is
1100      * null&quot;.</p>
1101      *
1102      * <p>If the index is invalid, then the message of the exception
1103      * is &quot;The validated character sequence index is invalid: &quot;
1104      * followed by the index.</p>
1105      *
1106      * @param <T> the character sequence type.
1107      * @param chars  the character sequence to check, validated not null by this method.
1108      * @param index  the index to check.
1109      * @return the validated character sequence (never {@code null} for method chaining).
1110      * @throws NullPointerException if the character sequence is {@code null}.
1111      * @throws IndexOutOfBoundsException if the index is invalid.
1112      * @see #validIndex(CharSequence, int, String, Object...)
1113      * @since 3.0
1114      */
1115     public static <T extends CharSequence> T validIndex(final T chars, final int index) {
1116         return validIndex(chars, index, DEFAULT_VALID_INDEX_CHAR_SEQUENCE_EX_MESSAGE, Integer.valueOf(index));
1117     }
1118 
1119     /**
1120      * Validates that the index is within the bounds of the argument
1121      * collection; otherwise throwing an exception with the specified message.
1122      *
1123      * <pre>Validate.validIndex(myCollection, 2, "The collection index is invalid: ");</pre>
1124      *
1125      * <p>If the collection is {@code null}, then the message of the
1126      * exception is &quot;The validated object is null&quot;.</p>
1127      *
1128      * @param <T> the collection type.
1129      * @param collection  the collection to check, validated not null by this method.
1130      * @param index  the index to check.
1131      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
1132      * @param values  the optional values for the formatted exception message, null array not recommended.
1133      * @return the validated collection (never {@code null} for chaining).
1134      * @throws NullPointerException if the collection is {@code null}.
1135      * @throws IndexOutOfBoundsException if the index is invalid.
1136      * @see #validIndex(Collection, int)
1137      * @since 3.0
1138      */
1139     public static <T extends Collection<?>> T validIndex(final T collection, final int index, final String message, final Object... values) {
1140         Objects.requireNonNull(collection, "collection");
1141         if (index < 0 || index >= collection.size()) {
1142             throw new IndexOutOfBoundsException(getMessage(message, values));
1143         }
1144         return collection;
1145     }
1146 
1147     /**
1148      * Validates that the index is within the bounds of the argument
1149      * character sequence; otherwise throwing an exception with the
1150      * specified message.
1151      *
1152      * <pre>Validate.validIndex(myStr, 2, "The string index is invalid: ");</pre>
1153      *
1154      * <p>If the character sequence is {@code null}, then the message
1155      * of the exception is &quot;The validated object is null&quot;.</p>
1156      *
1157      * @param <T> the character sequence type.
1158      * @param chars  the character sequence to check, validated not null by this method.
1159      * @param index  the index to check.
1160      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
1161      * @param values  the optional values for the formatted exception message, null array not recommended.
1162      * @return the validated character sequence (never {@code null} for method chaining).
1163      * @throws NullPointerException if the character sequence is {@code null}.
1164      * @throws IndexOutOfBoundsException if the index is invalid.
1165      * @see #validIndex(CharSequence, int)
1166      * @since 3.0
1167      */
1168     public static <T extends CharSequence> T validIndex(final T chars, final int index, final String message, final Object... values) {
1169         Objects.requireNonNull(chars, "chars");
1170         if (index < 0 || index >= chars.length()) {
1171             throw new IndexOutOfBoundsException(getMessage(message, values));
1172         }
1173         return chars;
1174     }
1175 
1176     /**
1177      * Validates that the index is within the bounds of the argument
1178      * array; otherwise throwing an exception.
1179      *
1180      * <pre>Validate.validIndex(myArray, 2);</pre>
1181      *
1182      * <p>If the array is {@code null}, then the message of the exception
1183      * is &quot;The validated object is null&quot;.</p>
1184      *
1185      * <p>If the index is invalid, then the message of the exception is
1186      * &quot;The validated array index is invalid: &quot; followed by the
1187      * index.</p>
1188      *
1189      * @param <T> the array type.
1190      * @param array  the array to check, validated not null by this method.
1191      * @param index  the index to check.
1192      * @return the validated array (never {@code null} for method chaining).
1193      * @throws NullPointerException if the array is {@code null}.
1194      * @throws IndexOutOfBoundsException if the index is invalid.
1195      * @see #validIndex(Object[], int, String, Object...)
1196      * @since 3.0
1197      */
1198     public static <T> T[] validIndex(final T[] array, final int index) {
1199         return validIndex(array, index, DEFAULT_VALID_INDEX_ARRAY_EX_MESSAGE, Integer.valueOf(index));
1200     }
1201 
1202     /**
1203      * Validates that the index is within the bounds of the argument
1204      * array; otherwise throwing an exception with the specified message.
1205      *
1206      * <pre>Validate.validIndex(myArray, 2, "The array index is invalid: ");</pre>
1207      *
1208      * <p>If the array is {@code null}, then the message of the exception
1209      * is &quot;The validated object is null&quot;.</p>
1210      *
1211      * @param <T> the array type.
1212      * @param array  the array to check, validated not null by this method.
1213      * @param index  the index to check.
1214      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
1215      * @param values  the optional values for the formatted exception message, null array not recommended.
1216      * @return the validated array (never {@code null} for method chaining).
1217      * @throws NullPointerException if the array is {@code null}.
1218      * @throws IndexOutOfBoundsException if the index is invalid.
1219      * @see #validIndex(Object[], int)
1220      * @since 3.0
1221      */
1222     public static <T> T[] validIndex(final T[] array, final int index, final String message, final Object... values) {
1223         Objects.requireNonNull(array, "array");
1224         if (index < 0 || index >= array.length) {
1225             throw new IndexOutOfBoundsException(getMessage(message, values));
1226         }
1227         return array;
1228     }
1229 
1230     /**
1231      * Validate that the stateful condition is {@code true}; otherwise
1232      * throwing an exception. This method is useful when validating according
1233      * to an arbitrary boolean expression, such as validating a
1234      * primitive number or using your own custom validation expression.
1235      *
1236      * <pre>
1237      * Validate.validState(field &gt; 0);
1238      * Validate.validState(this.isOk());</pre>
1239      *
1240      * <p>The message of the exception is &quot;The validated state is
1241      * false&quot;.</p>
1242      *
1243      * @param expression  the boolean expression to check.
1244      * @throws IllegalStateException if expression is {@code false}.
1245      * @see #validState(boolean, String, Object...)
1246      * @since 3.0
1247      */
1248     public static void validState(final boolean expression) {
1249         if (!expression) {
1250             throw new IllegalStateException(DEFAULT_VALID_STATE_EX_MESSAGE);
1251         }
1252     }
1253 
1254     /**
1255      * Validate that the stateful condition is {@code true}; otherwise
1256      * throwing an exception with the specified message. This method is useful when
1257      * validating according to an arbitrary boolean expression, such as validating a
1258      * primitive number or using your own custom validation expression.
1259      *
1260      * <pre>Validate.validState(this.isOk(), "The state is not OK: %s", myObject);</pre>
1261      *
1262      * @param expression  the boolean expression to check.
1263      * @param message  the {@link String#format(String, Object...)} exception message if invalid, not null.
1264      * @param values  the optional values for the formatted exception message, null array not recommended.
1265      * @throws IllegalStateException if expression is {@code false}.
1266      * @see #validState(boolean)
1267      * @since 3.0
1268      */
1269     public static void validState(final boolean expression, final String message, final Object... values) {
1270         if (!expression) {
1271             throw new IllegalStateException(getMessage(message, values));
1272         }
1273     }
1274 
1275     /**
1276      * Constructs a new instance. This class should not normally be instantiated.
1277      */
1278     public Validate() {
1279     }
1280 }