Hello! 欢迎来到小浪资源网!



项目 避免不必要地使用检查异常


项目 避免不必要地使用检查异常

检查异常是 Java 中的一个强大工具,因为它们迫使程序员处理异常情况,从而提高代码可靠性。然而,过度使用可能会导致 api 难以使用。为了证明检查异常是合理的,情况必须是真正的异常并且程序员能够采取有用的操作。否则,未经检查的异常可能更合适。

java 8 给检查异常的使用带来了额外的挑战,因为抛出异常的方法不能直接在流中使用,需要在代码中进行额外的处理。为了避免这种复杂性,可以考虑替代方案,例如返回一个可选对象而不是抛出可验证的异常,或者将方法分为两个,一个检查错误的可能性,另一个执行操作。

应谨慎使用受检异常:如果无法恢复,请使用非受检异常。当恢复可行时,考虑可选返回。如果这没有提供足够的信息,那么检查异常可能是合理的。

加:
这里有一些例子来说明检查异常和替代方案(例如optional)的正确使用以及检查方法的使用。

谨慎使用检查异常
假设我们有一个从文件加载数据的方法。如果没有找到该文件,我们想抛出一个异常来通知调用者有问题。在这种情况下,检查异常是合适的,因为开发人员可以采取措施解决问题(例如提供正确的存档路径)。

public class fileloader {     public string loadfile(string filepath) throws filenotfoundexception {         file file = new file(filepath);         if (!file.exists()) {             throw new filenotfoundexception("arquivo não encontrado: " + filepath);         }         // código para carregar o arquivo         return "conteúdo do arquivo";     } }  

这里调用者需要处理 filenotfoundexception 异常,因为他可以通过提供正确的文件路径来解决问题。

使用可选异常代替检查异常
如果丢失文件是不应该中断正常执行的情况,我们可以使用optional来指示结果可以丢失而不抛出异常。这使得 api 在可以容忍缺乏价值的情况下更加流畅。

import java.util.optional;  public class fileloader {     public optional<string> loadfile(string filepath) {         file file = new file(filepath);         if (!file.exists()) {             return optional.empty();         }         // código para carregar o arquivo         return optional.of("conteúdo do arquivo");     } }  

在调用者代码中:

fileloader loader = new fileloader(); optional<string> content = loader.loadfile("caminho/para/arquivo.txt"); content.ifpresentorelse(     system.out::println,     () -> system.out.println("arquivo não encontrado.") );  

在这个例子中,调用者不需要处理异常,而optional可以让它更顺利地处理缺失的内容。

方法分为两种:验证和操作
在某些情况下,我们可以将该方法分为两种:一种检查条件,另一种执行操作。这允许调用者在调用 main 方法之前处理异常情况,使 api 更加灵活。

public class fileloader {     // verifica se o arquivo está disponível     public boolean isfileavailable(string filepath) {         file file = new file(filepath);         return file.exists();     }      // carrega o conteúdo do arquivo     public string loadfile(string filepath) {         if (!isfileavailable(filepath)) {             throw new illegalstateexception("arquivo não encontrado: " + filepath);         }         // código para carregar o arquivo         return "conteúdo do arquivo";     } }  

在调用者代码中:

FileLoader loader = new FileLoader(); String filePath = "caminho/para/arquivo.txt";  if (loader.isFileAvailable(filePath)) {     String content = loader.loadFile(filePath);     System.out.println(content); } else {     System.out.println("Arquivo não encontrado."); }  

这里我们使用 illegalstateexception,这是一种未经检查的异常,如果调用者尝试加载文件而不首先检查它是否可用。

总结
checked exception:用于调用者可以直接修复的条件,例如文件的 filenotfoundexception。
可选:当缺少值不应中断程序流程时使用。

方法划分:在可以预测和避免错误的情况下,将检查和执行方法分开,使api更加灵活和简单使用。

相关阅读