首页 > 解决方案 > 使用通用供应商抛出未经检查的异常

问题描述

我有一个方法列表,其中包含Supplier<T>用于返回不同类型的默认值的参数。但是,在某些情况下,我需要抛出异常(未选中)而不是值。

目前,我必须为每个函数定义传递 lambda,但我想创建供应商实例以引发异常并在所有函数定义中重新使用它。

我有以下代码:

    public static void main(String[] args)
    {

        testInt("Key1", 10, () -> 99);
        testInt("Key2", -19, () -> 0);
        testInt("Key3", null, () -> {
            throw new UnsupportedOperationException(); //repetition
        });
        testBoolean("Key4", true, () -> Boolean.FALSE);
        testBoolean("Key5", null, () -> {
            throw new UnsupportedOperationException();//repetition
        });
    }

    static void testInt(String key, Integer value, Supplier<Integer> defaultValue)
    {
        if (value != null)
            System.out.printf("Key : %s, Value : %d" + key, value);
        else
            System.out.printf("Key : %s, Value : %d" + key, defaultValue.get());
    }

    static void testBoolean(String key, Boolean value, Supplier<Boolean> defaultValue)
    {
        if (value != null)
            System.out.printf("Key : %s, Value : %d" + key, value);
        else
            System.out.printf("Key : %s, Value : %d" + key, defaultValue.get());
    }

但我想做类似的事情:

final static Supplier<?> NO_VALUE_FOUND = () -> {
        throw new UnsupportedOperationException();
    };


testInt("Key3", null, NO_VALUE_FOUND);
testBoolean("Key5", null,NO_VALUE_FOUND);

感谢您对此的任何帮助。谢谢。

标签: javalambdajava-8

解决方案


使用一种方法将 NO_VALUE_FOUND 值转换为适当的类型:

static <T>  Supplier<T> NO_VALUE_FOUND() {
    return (Supplier<T>) NO_VALUE_FOUND;
}

public static void main(String[] args) {
    testInt("Key3", null, NO_VALUE_FOUND());
    testBoolean("Key5", null,NO_VALUE_FOUND());
}

推荐阅读