◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
检查异常是 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更加灵活和简单使用。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。