我将如何引发“可选”异常? - java

我已经在使用这种方法(我想这就是名称),它实际上是在尝试匹配字符串的一部分,然后返回字符串的后续部分-我拥有的那一部分,很简单。该方法的类型为String。

当我的方法无法在字符串中找到模式时,我希望它返回一个空字符串。我还想随空字符串一起发送消息,以“嘿,我没有找到您的密钥”,但是我希望它是可选的。

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

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

但是此代码的问题在于,由于return "";throw new KeyNotFoundException();显然无法访问。

如果要调用此方法,则必须使用try {} catch(KeyNotFoundException knf) {}块。但是,我要将此块设置为可选。

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

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

我认为这是错误的做法,但我似乎找不到其他方法(Java的新功能),请问有人对此有所了解吗?

参考方案

这样做的通常方法是编写两种方法,一种返回默认值,另一种引发异常。您可以让其中一个调用另一个,以避免重复:

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 "";
    }
}

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

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

try {
    String value = getKey("uma"); // cognisant
}
catch (KeyNotFoundException e) {
    // panic
}

Java-NoSuchMethodError没有被异常捕获 - java

我的印象是,Exception非常适合捕获所有可能的异常,因为每个异常都具有Exception作为基类。然后,在开发Android应用程序时,我使用了以下方法,该方法在某些自定义ROM中已被删除。boolean result = false; try{ result = Settings.canDrawOverlays(context); } catch(E…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …