getmessage tostring-java中的getMessage()和toString()有啥区别?见下代码

问题描述

java中的getMessage()和toString()有啥区别?见下代码
class ZiDingYiChang
    {
        public static void main(String[] args)
        {
                  Demo a =  new Demo();
                 try
                 {
                            int b=a.div(4,-2);
                         System.out.println(b);

                       }
                    catch (FuShuException e)
                 {
                            System.out.println(e.toString());//为什么说这里的toString()方法自动调用下面的getMessage()方法?

                   }

                 System.out.println("Hello World!");
              }
}

class FuShuException extends Exception
  {
      private String str;
      FuShuException(String str)
         {
         this.str=str;
        }

         public String getMessage()
               {
              return str;
               }
    }

 class Demo
  {
        int div(int x,int y) throws FuShuException
          {
          if (y<0)
            {
                 throw new FuShuException("除数为负数,运算失败");
             }
      return x/y;
   }
}

解决方案

你没有重写toString方法,因此这里调用的toString方法是父类的方法,即Throwable类的方法,查看api文档可知, Throwable的toString方法调用了当前对象的 getLocalizedMessage方法,这个方法也是 Throwable类的方法, 对于不重写此方法的子类,默认实现返回与 getMessage() 相同的结果。总之,toString方法调用了 getMessage方法,因此返回与 getMessage方法一样的内容。

解决方案二:

toString是每个对象都有的方法,也可以重写toString方法;
在异常中toString和getMessage都是表示展示异常的基本信息。

如果你不想要toString和getMessage一样,那么你可以自定义异常,然后继承Exception,
在你自定义的异常中,重写toString,让toString指向你的错误堆栈信息,而不是基本错误信息。

异常的基本错误信息可以在生成异常的时候放入:
如new IOException("基本错误信息");
getMessage就表示你new的时候的值;
而错误堆栈则需要一步步跟踪。

解决方案三:

你没有重写toString方法,因此这里调用的toString方法是父类的方法,即Throwable类的方法,查看api文档可知, Throwable的toString方法调用了当前对象的 getLocalizedMessage方法,这个方法也是 Throwable类的方法, 对于不重写此方法的子类,默认实现返回与 getMessage() 相同的结果。总之,toString方法调用了 getMessage方法,因此返回与 getMessage方法一样的内容。

时间: 2024-08-07 12:54:41

getmessage tostring-java中的getMessage()和toString()有啥区别?见下代码的相关文章

线程-java中this和Thread.currentThread()区别,见下代码

问题描述 java中this和Thread.currentThread()区别,见下代码 public class hello extends Thread { public hello(String name){ super(name); System.out.println(""Thread.currentThread().getname()=""+Thread.currentThread().getName()); System.out.println(&qu

java中super.父类方法和super( )的区别和联系是什么

问题描述 java中super.父类方法和super( )的区别和联系是什么 java中super.父类方法 和super( )的区别和联系是什么 为什么子类重写父类方法之后还要在那方法体里面写super.父类方法 解决方案 super.父类方法就是调用父类的方法.super() 就是执行父类的构造方法.重写后调用不调用父类方法是看你具体需求的.如果父类有a,b两个方法,你子类只重写了a方法,那么子类中并没有b方法,这时你就要 在你重写的a中写super.b()

深入剖析java中String、StringBuffer、StringBuilder的区别_java

java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1. 可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在

java中this.方法和方法有什么区别?

问题描述 java中this.方法和方法有什么区别? java中this.方法和方法有什么区别? 比如this.setContentView( )和单单写setContentView( )有何区别,谢谢解答 解决方案 this就是代表自身,默认可以不加 解决方案二: Lesson_for_java_day08--类的属性和方法.类的封装性.构造函数和this的使用Java在不同环境下获取当前路径的方法--this.getClass().getResource("")请问:Scanner

java中的一个随机函数,看不懂帮忙解释下

问题描述 java中的一个随机函数,看不懂帮忙解释下 public void suiji() { int m,n,k=0,k1,k2,k3; for(m=1;m<=15;m++) { k1=(int)(Math.random()*25+1); for(n=1;n<=2;n++) { k2=(int)(Math.random()*6+1); k3=(int)(Math.random()*5+1); while(d[k2][k3])!=0&&k!30) { k2=(int)(Mat

浅谈java中BigDecimal的equals与compareTo的区别_java

这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都是以sun jdk 1.4.2版本为例,其他版本实现未必一致,请忽略] 首先看一下BigDecimal的equals方法: public boolean equals(Object x){ if (!(x instanceof BigDecimal)) return false; BigDecima

浅谈Java中的四种引用方式的区别_java

强引用.软引用.弱引用.虚引用的概念 强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象. 比如下面这段代码: public class Main { publi

Java中String、StringBuffer、StringBuilder的区别介绍_java

java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在A

Java中length,length(),size()详解及区别_java

Java中length,length(),size()区别 length属性:用于获取数组长度. eg: int ar[] = new int{1,2,3} /** * 数组用length属性取得长度 */ int lenAr = ar.length;//此处lenAr=3 System.out.println("Arr length:"+lenAr);  length()方法:用于获取字符串长度. String str = "Hello World Java";