I'm trying to create an implementation that allows the use of IOException through the method, but something weird occurs
/**
 * Represents a predicate (boolean-valued function) of two arguments. This is the two-arity specialization of {@link Predicate}.
 *
 * <p>
 * This interface is similar to {@link BiPredicate} except that it is allowed to throw an {@link IOException}.
 * </p>
 *
 * @param <T> the type of the first argument to the predicate
 * @param <U> the type of the second argument the predicate
 *
 * @author Magno N A Cruz
 * @see Predicate
 */
@FunctionalInterface
public interface IOBiPredicate<T, U> {
/**
 * Evaluates this predicate on the given arguments.
 *
 * @param t the first input argument
 * @param u the second input argument
 * @return {@code true} if the input arguments match the predicate, otherwise {@code false}
 * @throws IOException if there is an I/O error performing the operation.
 */
boolean test(T t, U u) throws IOException;
/**
 * Returns a composed predicate that represents a short-circuiting logical AND of this predicate and another. When evaluating the composed predicate, if this
 * predicate is {@code false}, then the {@code other} predicate is not evaluated.
 *
 * <p>
 * Any exceptions thrown during evaluation of either predicate are relayed to the caller; if evaluation of this predicate throws an exception, the
 * {@code other} predicate will not be evaluated.
 * </p>
 *
 * @param other a predicate that will be logically-ANDed with this predicate
 * @return a composed predicate that represents the short-circuiting logical AND of this predicate and the {@code other} predicate
 * @throws NullPointerException if other is null
 */
default IOBiPredicate<T, U> and(BiPredicate<? super T, ? super U> other) {
    Objects.requireNonNull(other);
    return (T t, U u) -> test(t, u) && other.test(t, u);
}
/**
 * Returns a predicate that represents the logical negation of this predicate.
 *
 * @return a predicate that represents the logical negation of this predicate
 */
default IOBiPredicate<T, U> negate() {
    return (T t, U u) -> !test(t, u);
}
/**
 * Returns a composed predicate that represents a short-circuiting logical OR of this predicate and another. When evaluating the composed predicate, if this
 * predicate is {@code true}, then the {@code other} predicate is not evaluated.
 *
 * <p>
 * Any exceptions thrown during evaluation of either predicate are relayed to the caller; if evaluation of this predicate throws an exception, the
 * {@code other} predicate will not be evaluated.
 * </p>
 *
 * @param other a predicate that will be logically-ORed with this predicate
 * @return a composed predicate that represents the short-circuiting logical OR of this predicate and the {@code other} predicate
 * @throws NullPointerException if other is null
 */
default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> other) {
    Objects.requireNonNull(other);
    return (T t, U u) -> test(t, u) || other.test(t, u);
}
}
on the lambda expression (T t, U u) -> test(t, u) || other.test(t, u), the first part of the condition i.e., test(t, u) gives me a compiler error saying Unhandled exception type IOException but the second one i.e., other.test(t, u) seems to work fine, so it's a puzzling situation for me, why does it occur to one but not to the other?
Is there a clean solution for that? If not, how could I fix it without having kludges on the program?
This question is similar to Java 8 Lambda function that throws exception?, but for simple functions shown in that question it works and for others that have a conditional like this BiPredicate don't.
 
     
    