我有这样的课程:
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,它无论如何都会被执行,它是正确的还是其他事情正在发生?
发布于 2022-02-01 19:05:59
所有对象都有一个toString()实现。因为java.lang.Object本身(以及Exception extends Throwable和Throwable 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(),因此得到文本。两次。
一些经验教训:
static void main(String[])方法结束,java将为您打印它。NegativeNumberException的异常可能有实际的数字作为消息,也可能是param名称。类似于:public class NegativeNumberException extends Exception {
public NegativeNumberException(String msg) {
super(msg);
}
}然后在你的测试方法中:
if (n < 0) throw new NegativeNumberException("n: " + n);重写getMessage并返回一些字符串常量几乎是不正确的。消息很少是常量,因为它们的目的是详细说明问题的细节,而不是一般地解释异常代表什么(为此编写一些javadoc,并且只有当异常的名称不足以解决它时,所以这里不需要)。
https://stackoverflow.com/questions/70946051
复制相似问题