gpt4 book ai didi

java - 为什么 getMessage() 在我的自定义异常中自动执行?

转载 作者:行者123 更新时间:2023-12-05 01:05:09 27 4
gpt4 key购买 nike

我有这些类(class):

public class NegativeNumberException extends Exception{

NegativeNumberException()
{
System.out.println("Don't pass negative values!");
}

public String getMessage()
{
String message="NegativeNumberException";
return message;
}
}

public class Main {

static void test(int n) throws NegativeNumberException
{
if(n<0) throw new NegativeNumberException();

else System.out.println("Success");
}
public static void main(String[] args) {


try
{
test(-5);
}
catch(NegativeNumberException nne)
{
System.out.println(nne);
}
}

}

这是结果:

Dont pass negative values!
NegativeNumberException: NegativeNumberException

我希望它打印一次 NegativeNumberException,我想如果我覆盖 getMessage 它无论如何都会执行,它是正确的还是发生了其他事情?

最佳答案

所有对象都有一个 toString() 实现。因为 java.lang.Object 本身(以及 Exception extends ThrowableThrowable extends Object - 所有事物最终都会扩展对象)都有这个。

Throwable 类覆盖它的实现:

@Override public String toString() {
String s = getClass().getName();
String message = getLocalizedMessage();
return (message != null) ? (s + ": " + message) : s;
}

getLocalizedMessage() 实现为:

public String getLocalizedMessage() {
return getMessage();
}

每当您将对象“附加”到字符串时(使用 X + Y,其中 X 表达式的类型为 String 并且 Y 是任何东西)都是 的简写>X.concat(Y.toString())。因此,您在那里调用 toString。你没有覆盖它,所以你得到了 Throwable 的实现,它调用 getLocalizedMessage - 你也没有覆盖它,所以调用 getMessage(),因此,你得到了你的文本。两次。

一些教训:

  • System.out 在异常构造函数中执行任何操作。异常出现在某个地方,如果它需要打印,无论它最终会在哪里打印。如果异常最终“结束”您的 static void main(String[]) 方法,java 将为您打印它。
  • 消息不应以标点符号结尾(绝对不是感叹号 - 这是一个异常(exception)。假设出了问题,无需大喊大叫),并且不应重复或包含异常类型。该信息已经可用;该消息存在以获取更多信息。如果您没有要添加的内容,请不要留言。名为 NegativeNumberException 的异常可能应该将实际数字作为消息,或者可能是参数名称。比如:
public class NegativeNumberException extends Exception {
public NegativeNumberException(String msg) {
super(msg);
}
}

然后在你的测试方法中:

if (n < 0) throw new NegativeNumberException("n: " + n);

重写 getMessage 并返回一些字符串常量几乎是不正确的。消息应该很少是常量,因为它们是为了详细说明问题的细节,而不是一般地解释异常代表什么(为此编写一些 javadoc,并且仅当异常的名称不足以弄清楚它时,因此,这里不需要)。

关于java - 为什么 getMessage() 在我的自定义异常中自动执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70946051/

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