java - 在搜索特定值时静默捕获 ClassCastException 是否安全?

标签 java collections exception-handling classcastexception

假设我正在实现一个排序集合(简单示例 - 基于排序数组的 Set。)考虑这个(不完整的)实现:

import java.util.*;

public class SortedArraySet<E> extends AbstractSet<E> {

    @SuppressWarnings("unchecked")
public SortedArraySet(Collection<E> source, Comparator<E> comparator) {
    this.comparator = (Comparator<Object>) comparator;
    this.array = source.toArray();
    Arrays.sort(this.array, this.comparator);
}

@Override
public boolean contains(Object key) {
    return Arrays.binarySearch(array, key, comparator) >= 0;
}

    private final Object[] array;

    private final Comparator<Object> comparator;

}

现在让我们创建一组整数

Set<Integer> s = new SortedArraySet<Integer>(Arrays.asList(1, 2, 3), null);

并测试它是否包含一些特定的值:

System.out.println(s.contains(2));
System.out.println(s.contains(42));
System.out.println(s.contains("42"));

上面的第三行将抛出一个ClassCastException。不是我想要的。我希望它返回 false(就像 HashSet 那样。)

我可以通过捕获异常并返回 false 来获得此行为:

@Override    
public boolean contains(Object key) {
    try {
        return Arrays.binarySearch(array, key, comparator) >= 0;
    } catch (ClassCastException e) {
        return false;
    }
}

假设 source 集合类型正确,如果我这样做会出现什么问题?

最佳答案

我认为这没有任何问题,因为 Collection.contains 的 Javadoc明确指出抛出 ClassCastException 是可选的。

我看到的唯一问题是,如果您在某处有错误,不抛出异常将阻止您查明错误。

关于java - 在搜索特定值时静默捕获 ClassCastException 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674553/

相关文章:

Java DataInputStream.read() 在被阻塞时导致 20% 的持续 CPU 使用率。

java - CollectionUtils - 转换 - 有性能问题吗?

java - 有没有一种数据结构可以避免重复、保持顺序和随机访问

kotlin - 推断的类型是可为空值的集合,但预期为非可空值的集合

java - 如何编写不需要try/catch的异常?

Xcode 捕获所有未捕获的异常

ruby - EAFP 与 LBYL : Which is more idiomatic Ruby?

java - 每个字段有多个 GSON @SerializedName?

java - ORA-29532 : Java call terminated by uncaught Java exception: java. lang.NoClassDefFoundError

java - 如何获得以像素为单位的 View 之间的距离?