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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓旭 中级黑马   /  2012-4-9 00:55  /  2778 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. 第一遍抛出RuntimeException,编译可以通过
  2. class Send implements Runnable
  3. {
  4.         private DatagramSocket ds;
  5.         public Send(DatagramSocket ds)
  6.         {
  7.                 this.ds = ds;
  8.         }
  9.         public void run()
  10.         {
  11.                 BufferedReader bufr;
  12.                 try
  13.                 {
  14.                         bufr = new BufferedReader(new InputStreamReader(System.in));
  15.                         String line = null;
  16.                         while((line = bufr.readLine())!=null)
  17.                         {
  18.                                 if("886".equals(line))
  19.                                         break;
  20.                                 byte[] buf = line.getBytes();
  21.                                 DatagramPacket dp =
  22.                                         new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.5"),10002);
  23.                                 ds.send(dp);
  24.                         }

  25.                 }
  26.                 catch (Exception ioe)
  27.                 {
  28.                         throw new RuntimeException("send fail");    //这个地方如果是抛出不是Runtime
  29.                 }
  30.         }
  31. }
  32. 第二遍抛出非RuntimeException,程序出现矛盾,不知如何解决,编译不能通过
  33. class Send implements Runnable
  34. {
  35.         private DatagramSocket ds;
  36.         public Send(DatagramSocket ds)
  37.         {
  38.                 this.ds = ds;
  39.         }
  40.         public void run() throws Exception //因为程序内捕获到异常,在此处抛出,但是又因为这个方法是重写,run()并没有异常抛出,所以不能在此添加throws代码
  41.                                         //这里就出现了问题,是说这个run()方法只可能抛出RuntimeExcepton,还是需要对其他异常进行什么处理
  42.         {
  43.                 BufferedReader bufr;
  44.                 try
  45.                 {
  46.                         bufr = new BufferedReader(new InputStreamReader(System.in));
  47.                         String line = null;
  48.                         while((line = bufr.readLine())!=null)
  49.                         {
  50.                                 if("886".equals(line))
  51.                                         break;
  52.                                 byte[] buf = line.getBytes();
  53.                                 DatagramPacket dp =
  54.                                         new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.5"),10002);
  55.                                 ds.send(dp);
  56.                         }

  57.                 }
  58.                 catch (Exception ioe)
  59.                 {
  60.                         throw new Exception("send fail");    //这个地方我假设抛出非RuntimeException,可以不可以呢?
  61.                 }
  62.         }
  63. }
  64. 错误提示:
  65. ChatDemo.java:12: 错误: Send中的run()无法实现Runnable中的run()
  66.         public void run() throws Exception
  67.                     ^
  68.   被覆盖的方法未抛出Exception
复制代码
这是我一个程序中的一部分代码,我想知道如果被覆盖的方法没有抛出异常,我的重写方法是抛出RuntimeException,或者对异常进行处理,这两种思路么?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

3 个回复

倒序浏览
public void run() throws Exception 你这里抛除了异常


catch (Exception ioe)

                {

                        throw new Exception("send fail");    //这个地方我假设抛出非RuntimeException,可以不可以呢?

                }
而在这个方法体中你又捕捉了异常并处理异常。
你到到底抛异常和要捕捉异常呢
回复 使用道具 举报
申振华 发表于 2012-4-9 01:10
public void run() throws Exception 你这里抛除了异常

不是这样的,如果你在某个方法中抛出了非RuntimeException,那么你就得在方法名后面添加"throws 这个异常"
这是固定书写格式......
因为我可能想在这个方法外处理这个异常。。。
当然,我能理解的是多线程run()外面是不能捕获到这个异常的,是不是这个原因所以原始run()方法中并没有throws Exception
但是RuntimeException是特殊的,不用throws

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
第一个你是捕获异常了   而你的写法是把异常捕获到 然后再抛出去 这样语法是没有错的
  但一般不这么写  要么你捕获异常  要么抛   而在catch里面 抛异常的话  一般是抛新的异常  也就是你该类中出现新的问题异常 抛给调用者
     而你在catch中抛的是Runtime异常  就不用再run方法上声明异常   编译是不会出错的  
第二个 写法就是抛异常了  接口中没有抛异常  子类是不能抛异常的 所以语法错误      
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马