首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在我的自定义异常中自动执行getMessage()?

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

Stack Overflow用户
提问于 2022-02-01 18:58:52
回答 1查看 149关注 0票数 3

我有这样的课程:

代码语言:javascript
复制
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);
        }
    }

}

其结果是:

代码语言:javascript
复制
Dont pass negative values!
NegativeNumberException: NegativeNumberException

我以为它会打印一次NegativeNumberException,我想如果我重写getMessage,它无论如何都会被执行,它是正确的还是其他事情正在发生?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 19:05:59

所有对象都有一个toString()实现。因为java.lang.Object本身(以及Exception extends ThrowableThrowable extends Object --所有的东西最终都是扩展对象)具有这个特性。

Throwable类用以下方法重写它的实现:

代码语言:javascript
复制
@Override public String toString() {
  String s = getClass().getName();
  String message = getLocalizedMessage();
  return (message != null) ? (s + ": " + message) : s;
}

并将getLocalizedMessage()实现为:

代码语言:javascript
复制
public String getLocalizedMessage() {
  return getMessage();
}

每当您将对象‘追加’到字符串(使用X + Y,其中X表达式具有String类型,Y是任意类型)时,都是X.concat(Y.toString())的缩写。因此,您要在那里调用toString。您没有重写它,所以您得到Throwable的实现,它调用getLocalizedMessage --您也没有重写它,因此调用getMessage(),因此得到文本。两次。

一些经验教训:

  • 不使用异常构造函数中的任何内容。这个例外会出现在某个地方,如果它需要打印,那么它最终会在哪里打印出来。如果异常以“结束”static void main(String[])方法结束,java将为您打印它。
  • 消息不应该以标点符号结尾(当然不是感叹号--这是一个例外。假设出了问题,不需要大喊大叫),不应该重复或包含异常类型。该信息已经可用;该消息存在以获取其他信息。如果您没有什么可添加的,那么就没有消息。名为NegativeNumberException的异常可能有实际的数字作为消息,也可能是param名称。类似于:

代码语言:javascript
复制
public class NegativeNumberException extends Exception {
  public NegativeNumberException(String msg) {
    super(msg);
  }
}

然后在你的测试方法中:

代码语言:javascript
复制
if (n < 0) throw new NegativeNumberException("n: " + n);

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70946051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档