黑马程序员技术交流社区

标题: 是不是有的异常可以抛出但不在方法声明啊? [打印本页]

作者: H._张_♂    时间: 2014-3-23 21:31
标题: 是不是有的异常可以抛出但不在方法声明啊?
我今天在看老师视频,在谈到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的话也应该在方法中声明,为什么这里却没有声明就可以抛出,而且运行的时候还不出错呢?
作者: syusikoku    时间: 2014-3-23 22:00
if(!(obj instanceof Student))
           throw new ClassCastException("类型不匹配");   这里是说如果你不是Student对象就要抛出异常,因为你不是Student,而且下面代码需要把对象给转换成Student
                Student s = (Student)obj;
//这个转换是进行强制类型转换的。你想一下,如果要转换的类不是Student而是一个Dog它转换成学生不就出事了吗?明白了吧。兄弟。
作者: my_android_drea    时间: 2014-3-23 22:05
因为   ClassCastException   是RuntimeException 的子类!
RuntimeException 的任何子类都无需在 throws 子句中进行声明。

作者: syusikoku    时间: 2014-3-23 22:11
所以你如果要转换的对象不是当前的类,它就抛出了一个异常。这是在你传入比较的对象的时候。所使用的
作者: 追逐    时间: 2014-3-23 23:15
  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.         }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2