A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我今天在看老师视频,在谈到Map的时候,老师的一段代码是这么写的。:
  1.         public boolean equals(Object obj)
  2.         {
  3.                 if(!(obj instanceof Student))
  4.                         throw new ClassCastException("类型不匹配");
  5.                 Student s = (Student)obj;
  6.                
  7.                 return this.name.equals(s.name)&&this.age==s.age;
  8.         }
复制代码
按理说,在代码中抛出Exception的时候,如果不在代码块内catch的话也应该在方法中声明,为什么这里却没有声明就可以抛出,而且运行的时候还不出错呢?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
if(!(obj instanceof Student))
           throw new ClassCastException("类型不匹配");   这里是说如果你不是Student对象就要抛出异常,因为你不是Student,而且下面代码需要把对象给转换成Student
                Student s = (Student)obj;
//这个转换是进行强制类型转换的。你想一下,如果要转换的类不是Student而是一个Dog它转换成学生不就出事了吗?明白了吧。兄弟。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
因为   ClassCastException   是RuntimeException 的子类!
RuntimeException 的任何子类都无需在 throws 子句中进行声明。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
所以你如果要转换的对象不是当前的类,它就抛出了一个异常。这是在你传入比较的对象的时候。所使用的
回复 使用道具 举报
  1. public boolean equals(Object obj)
  2.         {
  3.                 if(!(obj instanceof Student))
  4.                                             //因为ClassCastExcepion是RuntimeException的子类
  5.                                                 //而RuntimeException是是在运行期间抛出的异常。所以这个不用抛。
  6.                                                 //因为当虚拟机碰到这种异常的时候会直接停止程序。
  7.                                                 //知道你手动的解决了这种异常。才会继续运行下去。
  8.                         throw new ClassCastException("类型不匹配");
  9.                 Student s = (Student)obj;
  10.                
  11.                 return this.name.equals(s.name)&&this.age==s.age;
  12.         }
复制代码


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马