gpt4 book ai didi

Java异常处理方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:07:12 24 4
gpt4 key购买 nike

在处理我应该处理的 3 个异常时,我在实现以下方法时遇到了一些麻烦。 我应该像我正在做的那样包含 try/catch block ,还是留给应用程序而不是类设计

方法说我应该实现这个:

public Catalog loadCatalog(String filename)
throws FileNotFoundException, IOException, DataFormatException

此方法从产品目录中指定的存档中加载信息并返回目录。

首先打开文件进行阅读。然后它继续读取和处理文件的每一行。

方法String.startsWith用于判断行的类型:

  • 如果行的类型是“Product”,则调用 readProduct 方法。
  • 如果行的类型是“Coffee”,则调用 readCoffee 方法。
  • 如果行的类型是“Brewer”,则调用 readCoffeeBrewer 方法。

处理该行后,loadCatalog 将产品(产品、咖啡或啤酒)添加到产品目录中。

处理完文件的所有行后,loadCatalog 将产品目录返回给进行调用的方法。

该方法会抛出以下异常:

  • FileNotFoundException — 如果指定的文件不存在。
  • IOException — 如果读取指定文件的信息时出错。
  • DataFormatException — 如果一行有错误(异常必须包括有错误数据的行)

这是我目前所拥有的:

public Catalog loadCatalog(String filename)
throws FileNotFoundException, IOException, DataFormatException{
String line = "";
try {
BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat"));
try {
BufferedReader input = new BufferedReader(
new FileReader(stdIn.readLine()));
while(! stdIn.ready()){
line = input.readLine();
if(line.startsWith("Product")){
try {
readProduct(line);
} catch(DataFormatException d){
d.getMessage();
}
} else if(line.startsWith("Coffee")){
try {
readCoffee(line);
} catch(DataFormatException d){
d.getMessage();
}
} else if(line.startsWith("Brewer")){
try {
readCoffeeBrewer(line);
} catch(DataFormatException d){
d.getMessage();
}
}
}
} catch (IOException io){
io.getMessage();
}
}catch (FileNotFoundException f) {
System.out.println(f.getMessage());
}
return null;
}

最佳答案

这取决于您是希望类还是使用它的应用程序的另一部分来处理异常并执行任何需要的操作。

由于将使用 loadCatalog() 的代码 可能 不知道如何处理文件 I/O 或格式异常,就我个人而言,我会去创建一个像 CatalogLoadException 这样的异常,并从 loadCatalog() 方法中抛出它,然后把 cause exception (FileNotFoundException, IOException, DataFormatException) 在其中,同时根据触发的异常包含一条信息性消息。

try {
...
//do this for exceptions you are interested in.
} catch(Exception e) {
//maybe do some clean-up here.
throw new CatalogLoadException(e); // e is the cause.
}

这样您的 loadCatalog() 方法将只会抛出一个有意义的异常。

现在将使用 loadCatalog() 的代码只需处理一个异常:CatalogLoadException

loadCatalog(String filename) throws CatalogLoadException

这还允许您的方法隐藏其实现细节,因此您不必在底层低级结构发生变化时更改其“异常抛出”签名。请注意,如果您更改此签名,则每段代码都需要相应更改以处理您引入的新异常类型。

另请参阅关于 Exception Translation 的问题.


关于 throw 签名要求的更新:

如果您必须保留该签名,那么您别无选择,只能将它们到应用程序而不是捕获它们在 loadCatalog() 方法中,否则 throws 签名将有点无用,因为我们不会抛出与刚刚处理的完全相同的异常.

关于Java异常处理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com