黑马程序员技术交流社区

标题: 集合TreeSet比较器里面抛异常的问题。 [打印本页]

作者: 曹德君    时间: 2013-4-26 11:50
标题: 集合TreeSet比较器里面抛异常的问题。
本帖最后由 曹德君 于 2013-4-26 21:05 编辑
  1. import java.util.*;

  2. class  TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                
  7.                 TreeSet ts = new TreeSet();
  8.                 ts.add(new Person("lisi001",10));
  9.                 ts.add(new Person("lisi002",20));
  10.                 ts.add(new Person("lisi003",30));
  11.                 ts.add(new Person("lisi004",40));
  12.                 ts.add(new Person("lisi007",40));
  13.                 ts.add(new Person("lisi002",40));

  14.                 for (Iterator it=ts.iterator();it.hasNext(); )
  15.                 {
  16.                         //Object obj =it.next();这里有类型提升。必须强转成Person才能输出名字和年龄。
  17.                         Person p = (Person)it.next();
  18.                         sop(p.getName()+"..m.."+p.getAge());
  19.                 }
  20.         }
  21.         public static void sop(Object obj)
  22.         {
  23.                 System.out.println(obj);
  24.         }
  25. }

  26. class Person implements Comparable
  27. {
  28.         private String name;
  29.         private int age;

  30.         Person(String name,int age)
  31.         {
  32.                 this.name=name;
  33.                 this.age=age;
  34.         }
  35.         public String getName()
  36.         {
  37.                 return name;
  38.         }
  39.         public int getAge()
  40.         {
  41.                 return age;        
  42.         }
  43.         public int compareTo(Object obj)
  44.         {        
  45.                 if (!(obj instanceof Person))
  46.                 {
  47.                         throw new RuntimeException("不是Person对象");//1疑问这里为什么要抛出RuntimeException异常?用horows抛为什么不行??
  48.                 }
  49.                 Person  p=(Person)obj;
  50.                 if (this.age>p.age)
  51.                         return 1;
  52.                 if (this.age==p.age)
  53.                         //字符串本身也具备比较性String类里面的comparaTo()方法
  54.                         return this.name.compareTo(p.name);
  55.                 return  -1;
  56.         }
  57.         
  58. }
复制代码

作者: 谭威    时间: 2013-4-26 13:03
RuntimeException是运行时异常。意思是程序只要出现这种异常就要断掉。因为你的传递的对象都不同,根本就没有比较的意义了。程序就必须断掉。
如果用throws抛出异常的话,表示这个方法就有异常。别人调用的这个方法也要抛出这个异常。就是Person类,compareTo方法是Comparable接口中的方法,compareTo本身没没有抛出RuntimeException,你不能比自己的父类抛出更多的异常吧。
作者: 聖手`书生    时间: 2013-4-26 13:27
1.RuntimeException:这是运行时异常,就是java程序在运行时期才会发生的异常,java默认给这个异常特殊的权限,就是不用在函数上声明,程序自动停止。
2.如果在函数上抛异常,那主函数调用时,就要做异常处理,增加了不必要的麻烦。具体情况根据需求而定。
作者: 曹德君    时间: 2013-4-26 13:51
谭威 发表于 2013-4-26 13:03
RuntimeException是运行时异常。意思是程序只要出现这种异常就要断掉。因为你的传递的对象都不同,根本就没 ...

你说的我有点糊涂了。你的意思是不让抛RuntimeException吗????
作者: 袁梦希    时间: 2013-4-26 14:36
楼主看看异常的概念,以及各种区别能好点,这样的帖子我发了太多了。
作者: 谭威    时间: 2013-4-26 14:48
曹德君 发表于 2013-4-26 13:51
你说的我有点糊涂了。你的意思是不让抛RuntimeException吗????

我的意思是在你的程序里面,可以抛RuntimeException,这是程序逻辑需要。你传的不是person对象,我怎么比较啊,可以直接让程序停掉掉,这时就可以throw new RuntimeException("..");,但是绝对不能在compareTo方法上throws 任何Exception,因为这个方法不是你写的。是Comparable自己的方法,它自己都没抛,你如果throws了,那就不叫实现接口的方法了。
作者: 曹德君    时间: 2013-4-26 16:38
哦明白了。谢谢。
作者: 袁梦希    时间: 2013-4-26 16:40
楼主如果明白了    就把帖子的类型改为“已解决”。{:soso_e181:}




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