/* * Copyright (C) 2007 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.common.base; import javax.annotation.Nullable; import com.google.common.annotations.GwtCompatible; /** * Static convenience methods that help a method or constructor check whether it * was invoked correctly (whether its preconditions have been met). These * methods generally accept a {@code boolean} expression which is expected to be * {@code true} (or in the case of {@code * checkNotNull}, an object reference which is expected to be non-null). When * {@code false} (or {@code null}) is passed instead, the {@code Preconditions} * method throws an unchecked exception, which helps the calling method * communicate to its caller that that caller has made a mistake. * Example: * *
* {@code * * /** * * Returns the positive square root of the given value. * * * * @throws IllegalArgumentException if the value is negative * *}{@code / * public static double sqrt(double value) { * Preconditions.checkArgument(value >= 0.0, "negative value: %s", value); * // calculate the square root * } * * void exampleBadCaller() { * double d = sqrt(-1.0); * }} ** * In this example, {@code checkArgument} throws an * {@code IllegalArgumentException} to indicate that {@code exampleBadCaller} * made an error in its call to {@code sqrt}. * *
* The goal of this class is to improve readability of code, but in some * circumstances this may come at a significant performance cost. Remember that * parameter values for message construction must all be computed eagerly, and * autoboxing and varargs array creation may happen as well, even when the * precondition check then succeeds (as it should almost always do in * production). In some circumstances these wasted CPU cycles and allocations * can add up to a real problem. Performance-sensitive precondition checks can * always be converted to the customary form: * *
* {@code * * if (value < 0.0) { * throw new IllegalArgumentException("negative value: " + value); * }} ** *
* Not every type of precondition failure is supported by these methods. * Continue to throw standard JDK exceptions such as * {@link java.util.NoSuchElementException} or * {@link UnsupportedOperationException} in the situations they are intended * for. * *
* It is of course possible to use the methods of this class to check for * invalid conditions which are not the caller's fault. Doing so is * not recommended because it is misleading to future readers of the code * and of stack traces. See Conditional * failures explained in the Guava User Guide for more advice. * *
* Projects which use {@code com.google.common} should generally avoid the use * of {@link java.util.Objects#requireNonNull(Object)}. Instead, use whichever * of {@link #checkNotNull(Object)} or {@link Verify#verifyNotNull(Object)} is * appropriate to the situation. (The same goes for the message-accepting * overloads.) * *
* In {@code Preconditions} error message template strings, only the * {@code "%s"} specifier is supported, not the full range of * {@link java.util.Formatter} specifiers. However, note that if the number of * arguments does not match the number of occurrences of {@code "%s"} in the * format string, {@code Preconditions} will still behave as expected, and will * still include all argument values in the error message; the message will * simply not be formatted exactly as intended. * *
* See the Guava User Guide on using
* {@code
* Preconditions}.
*
* @author Kevin Bourrillion
* @since 2.0 (imported from Google Collections Library)
*/
@GwtCompatible
public final class Preconditions {
private Preconditions() {
}
/**
* Ensures the truth of an expression involving one or more parameters to the
* calling method.
*
* @param expression a boolean expression
* @throws IllegalArgumentException if {@code expression} is false
*/
public static void checkArgument(boolean expression) {
if (!expression) {
throw new IllegalArgumentException();
}
}
/**
* Ensures the truth of an expression involving one or more parameters to the
* calling method.
*
* @param expression a boolean expression
* @param errorMessage the exception message to use if the check fails; will be
* converted to a string using
* {@link String#valueOf(Object)}
* @throws IllegalArgumentException if {@code expression} is false
*/
public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
if (!expression) {
throw new IllegalArgumentException(String.valueOf(errorMessage));
}
}
/**
* Ensures the truth of an expression involving one or more parameters to the
* calling method.
*
* @param expression a boolean expression
* @param errorMessageTemplate a template for the exception message should the
* check fail. The message is formed by replacing
* each {@code %s} placeholder in the template with
* an argument. These are matched by position - the
* first {@code %s} gets {@code
* errorMessageArgs[0]} , etc. Unmatched arguments will be appended to
* the formatted message in square braces. Unmatched
* placeholders will be left as-is.
* @param errorMessageArgs the arguments to be substituted into the message
* template. Arguments are converted to strings
* using {@link String#valueOf(Object)}.
* @throws IllegalArgumentException if {@code expression} is false
* @throws NullPointerException if the check fails and either
* {@code errorMessageTemplate} or
* {@code errorMessageArgs} is null (don't let
* this happen)
*/
public static void checkArgument(boolean expression, @Nullable String errorMessageTemplate,
@Nullable Object... errorMessageArgs) {
if (!expression) {
throw new IllegalArgumentException(format(errorMessageTemplate, errorMessageArgs));
}
}
/**
* Ensures the truth of an expression involving the state of the calling
* instance, but not involving any parameters to the calling method.
*
* @param expression a boolean expression
* @throws IllegalStateException if {@code expression} is false
*/
public static void checkState(boolean expression) {
if (!expression) {
throw new IllegalStateException();
}
}
/**
* Ensures the truth of an expression involving the state of the calling
* instance, but not involving any parameters to the calling method.
*
* @param expression a boolean expression
* @param errorMessage the exception message to use if the check fails; will be
* converted to a string using
* {@link String#valueOf(Object)}
* @throws IllegalStateException if {@code expression} is false
*/
public static void checkState(boolean expression, @Nullable Object errorMessage) {
if (!expression) {
throw new IllegalStateException(String.valueOf(errorMessage));
}
}
/**
* Ensures the truth of an expression involving the state of the calling
* instance, but not involving any parameters to the calling method.
*
* @param expression a boolean expression
* @param errorMessageTemplate a template for the exception message should the
* check fail. The message is formed by replacing
* each {@code %s} placeholder in the template with
* an argument. These are matched by position - the
* first {@code %s} gets {@code
* errorMessageArgs[0]} , etc. Unmatched arguments will be appended to
* the formatted message in square braces. Unmatched
* placeholders will be left as-is.
* @param errorMessageArgs the arguments to be substituted into the message
* template. Arguments are converted to strings
* using {@link String#valueOf(Object)}.
* @throws IllegalStateException if {@code expression} is false
* @throws NullPointerException if the check fails and either
* {@code errorMessageTemplate} or
* {@code errorMessageArgs} is null (don't let
* this happen)
*/
public static void checkState(boolean expression, @Nullable String errorMessageTemplate,
@Nullable Object... errorMessageArgs) {
if (!expression) {
throw new IllegalStateException(format(errorMessageTemplate, errorMessageArgs));
}
}
/**
* Ensures that an object reference passed as a parameter to the calling method
* is not null.
*
* @param reference an object reference
* @return the non-null reference that was validated
* @throws NullPointerException if {@code reference} is null
*/
public static