如何抛出"可选"异常呢?

5 java exception-handling

我有这个方法,我正在努力(我认为这是名称),它本质上试图匹配字符串的一部分,然后返回字符串的前一部分 - 我得到的部分,简单的东西.该方法的类型为String.

当我的方法无法在字符串中找到模式时,我希望它返回一个空字符串.我也想发送一些带有空字符串的东西去"嘿,我没找到你的钥匙",但我希望这是可选的.

这基本上是我想要的方法:

public static String getKey(String key) throws KeyNotFoundException {
    if (key.equals("something")) {
        return "great";
    } else {
        throw new KeyNotFoundException();
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这个代码的问题return "";在于显然无法访问throw new KeyNotFoundException();.

如果我打算调用这个方法,我必须使用该try {} catch(KeyNotFoundException knf) {}块.我想要这个块是可选的.

如果我选择忽略未找到密钥的事实(例如,不要使用try catch),那么我只想在返回时获得空字符串.

但是如果我需要知道是否找到了正确完成操作的密钥,我还希望能够用try-catch块包围它.

我想我会以错误的方式解决这个问题,但我似乎无法想出一个替代方案(Java的新手),有人可以对此有所了解吗?

Tom*_*son 10

执行此操作的常用方法是编写两个方法,一个返回默认值,另一个抛出异常.您可以让其中一个调用另一个,以避免重复:

public static String getKey(String key) throws KeyNotFoundException {
    String value = getOptionalKey(key);
    if (value.equals("")) throw new KeyNotFoundException(key);
    return value;
}

public static String getOptionalKey(String key) {
    if (key.equals("something")) {
        return "great";
    } else {
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,呼叫者可以根据需要选择呼叫哪一个:

String value = getOptionalKey("uma"); // oblivious

try {
    String value = getKey("uma"); // cognisant
}
catch (KeyNotFoundException e) {
    // panic
}
Run Code Online (Sandbox Code Playgroud)