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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵阳 中级黑马   /  2012-9-1 08:17  /  7007 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天敲代码发现一个疑问,就是在匿名内部类中的异常只能被捕获,不能被抛出吗?

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

12 个回复

倒序浏览
我觉得是这样的:
        写匿名内部类的前提是这个类继承了某个类或者实现了某个接口。  而在子父类抛异常的时候有一条要求是:父类没有异常,子类里出现的异常不能抛出,只能自己 处理。
               
回复 使用道具 举报

不能被抛出,因为java中出现异常,处理方式基本就是:1,通过捕获try语句来处理把异常干掉。2,抛出异常,把异常抛给别人

前者通过try把异常处理掉了,程序没问题。编译通过

而后者抛出异常,并不是代表异常已经解决,而是把异常抛出,抛给调用者,但是异常问题还存在。这时需要调用者来处理这个异常。编译通过,运行时出现异常。

匿名内部类是一个类中没有名字类,内部类出现了问题,只能解决掉它,所以只能捕获try,不能抛出。如果抛出的话,外部那个没有异常的类会首先接收到这个异常,发生更多的异常,这是不允许的



我也是刚学,这时我的理解,希望对你有帮助   谢谢




回复 使用道具 举报
本帖最后由 梁志冰 于 2012-9-1 11:22 编辑

首先匿名内部类的前提是:内部类必须继承或实现一个外部的类或者接口。
再则异常抛出的基本原则:功能中用throw关键字抛出了异常,如果没有被catch处理,就必须用throws
关键字在函数上进行声明。
最后看一下异常覆盖时的细节:(A)、
子类在覆盖父类方法时,如果父类方法抛出异常,子类覆盖的方法只能抛出父类方法异常或者其子集。
                            (B)、父类方法如果抛出多个异常,子类在覆盖父类方法时,只能抛出父类方法异常的子集。
                                                                 (C)、如果父类中的方法没有抛出异常。 子类覆盖父类是,绝对不能声明异常。只能进行try  catch  
综上所述,如果匿名内部类的父类中方法声明了异常,那么其子类就可以声明其父类方法的异常或者其子集。
如下示例:

class Inter
{
public void show()throws  Exception
{ }
}
class Demo
{
public static void main(String[] args)
{
  try
  {
   
      new Inter()
         {
           public void show()throws  Exception
            {        
              System.out.println(5/1);
              System.out.println(5/0);
            }
         }.show();
  
   }
  catch (Exception e)
     {
      System.out.println("异常");
     }
}
}
回复 使用道具 举报
5,什么时候try 什么时候throws?******
1,定义功能,功能内部因为传入的参数问题,导致了功能会出现问题,这时为了解决这个问题,通常,我们都会将问题通过
        throw声明在函数上。
        目地:为了调用者在使用这个功能的时候,能明确处理方式。也就是说throws抛出的目的是为了让调用者预先定义好问题的
        处理方式。
2,当throws抛出了异常的时候,我们需要用try来捕捉。

定义功能的时候,如果能在方法内部解决的就try,解决不了的就抛。声明在函数上。
回复 使用道具 举报
需要补充一下,匿名内部类中的方法不可以抛出非运行时异常,但是可以抛出运行时异常.
回复 使用道具 举报
今天敲代码发现一个疑问,就是在匿名内部类中的异常只能被捕获,不能被抛出吗?

匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样或者是父类异常的子集。

我写了段代码来验证了一下:


import java.io.*;
class Demo
{
    public static void main(String[] args)throws Exception
    {
        new Fu(){
           void show()throws IOException                  //这里是子类抛出的异常是父类异常的子类            
           {
               System.out.println("Zishow");                //这里是匿名内部类覆写了Fu类的show()方法
           }
                }.show();
    }

}
class Fu
{
   void show()throws Exception
   {
       System.out.println("Fushow");
   }

}

如果将class Fu中的Exception改成IOException,再将new Fu()中的IOException改成Exception的话(子类的异常是父类异常的子类)编译失败。所以匿名内部类是可以抛出的。

回复 使用道具 举报
上面这句“匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样或者是父类异常的子集。”
应该是父类异常的子类和数量上的子集,打太快字漏了。
回复 使用道具 举报
梁志冰 发表于 2012-9-1 11:20
首先匿名内部类的前提是:内部类必须继承或实现一个外部的类或者接口。
再则异常抛出的基本原则:功能中用t ...

B)、父类方法如果抛出多个异常,子类在覆盖父类方法时,只能抛出父类方法异常的子集。

哥们这个怎么解释啊,求详解
回复 使用道具 举报
黑马张旭明 发表于 2012-9-1 13:21
上面这句“匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样 ...

怎么是数量上的子集啊
回复 使用道具 举报
就是父类抛出3个异常,而子类只能抛出3个或者3个以内的异常,而且这些异常还必须和父类抛出的异常一样或者是其子类
回复 使用道具 举报

import java.io.*;
class Demo
{
    public static void main(String[] args)throws Exception
    {
        new Fu(){
         void show()throws Exception1,Exception2,Exception3,Exception4                                 
           {                                               //这里就错了,比父类多抛了一个
               System.out.println("Zishow");               
           }
                }.show();
    }
}
class Fu
{
   void show()throws Exception1,Exception2,Exception3
   {
       System.out.println("Fushow");
   }
}

回复 使用道具 举报
黑马张旭明 发表于 2012-9-1 13:21
上面这句“匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样 ...

你这么一说,我也想起老毕的视频里有讲过的了.平时都是用eclipse自动生成代码,也没注意这些细节,呵呵.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马