gpt4 book ai didi

java - 我应该在方法声明中提及哪些异常,以及我应该在 catch block 中捕获哪些异常?

转载 作者:行者123 更新时间:2023-12-01 19:02:57 25 4
gpt4 key购买 nike

假设我们有如下条件。

A)

public void method() throws ... {

XXXXXXXXXXXXXXXXXXXXXXX;
}

B)

public void method(){

try{

XXXXXXXXXXXXXXXXXXXXXXX;
}catch(...){

//doing something here
}

}

假设标有“XXXX”的行是可能抛出异常的代码行(假设这一行不会抛出错误)。

所以我的问题是,在第一种情况下(在方法声明处)我应该提到哪些异常,以及我应该在 catch block 中捕获哪些异常??

* 我知道仅抛出并捕获 Exception 异常就足够了,但我认为这不是一个好的设计。 *

最佳答案

您似乎在问如何判断给定方法将或可能抛出哪些异常。这很难回答,因为您没有告诉我们您正在尝试运行什么方法。但 Java 的部分优点是它是静态类型的,并且您实际上确切地知道任何方法可以抛出哪些异常。不显式捕获您调用的任何可能触发的异常方法是一个编译时错误,因此您会立即知道是否应该捕获某些内容。异常(exception)情况是 RuntimeException 及其子项,它们故意不属于编译时协定的一部分。

通常,不应捕获 RuntimeException,它们表示您不应该让程序首先进入某种状态(例如不检查 null 触发 NullPointerException),但您可以检查您正在使用的方法的文档,看看它们可能会抛出什么。例如,String.substring()说它可能会抛出IndexOutOfBoundsException。通常,您应该提前进行必要的索引检查,但如果您无法提前这样做,您可以捕获它,如下所示:

int userInputWeCantTrust = -4;
try {
System.out.println("foo".substring(userInputWeCantTrust));
} catch (IndexOutOfBoundsException e) {
System.err.println("Looks like I can't trust you, user.");
}

当您这样做时,您希望尽可能明确地显示异常类型(例如捕获IndexOutOfBoundsException,而不是RuntimeException),并放置尽可能少的代码可能在 try block 内。否则,您可能会意外捕获本应允许继续传播的异常。

<小时/>

决定接住还是 throw 是一个设计决策。如果您能够处理给定的异常,则将其包装在 try-catch 中,如果不能,则不处理。

示例一,解析整数,失败时默认为default:

public static int parse(String s, int default) {
try {
return Integer.parseInt(s);
} catch (NumberFormatException e) {
return default;
}
}

示例二,解析用户输入,让main方法处理报错:

// the throws note here isn't actually necessary, since NFE is a RuntimeException
public static int parse(String s) throws NumberFormatException {
return Integer.parseInt(s);
}

public static void main(String[] args) {
try {
for(String s : args){
System.out.println(parse(s));
}
} catch (NumberFormatException e) {
System.err.println("You entered an invalid number.");
}
}

这实际上取决于您的用例。

关于java - 我应该在方法声明中提及哪些异常,以及我应该在 catch block 中捕获哪些异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529565/

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