黑马程序员技术交流社区

标题: 匿名内部类中的异常 [打印本页]

作者: 邵阳    时间: 2012-9-1 08:17
标题: 匿名内部类中的异常
今天敲代码发现一个疑问,就是在匿名内部类中的异常只能被捕获,不能被抛出吗?
作者: 阳杰    时间: 2012-9-1 09:36
我觉得是这样的:
        写匿名内部类的前提是这个类继承了某个类或者实现了某个接口。  而在子父类抛异常的时候有一条要求是:父类没有异常,子类里出现的异常不能抛出,只能自己 处理。
               
作者: 杨千里    时间: 2012-9-1 10:58

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

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

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

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



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





作者: 梁志冰    时间: 2012-9-1 11:20
本帖最后由 梁志冰 于 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("异常");
     }
}
}

作者: 李志群    时间: 2012-9-1 11:23
5,什么时候try 什么时候throws?******
1,定义功能,功能内部因为传入的参数问题,导致了功能会出现问题,这时为了解决这个问题,通常,我们都会将问题通过
        throw声明在函数上。
        目地:为了调用者在使用这个功能的时候,能明确处理方式。也就是说throws抛出的目的是为了让调用者预先定义好问题的
        处理方式。
2,当throws抛出了异常的时候,我们需要用try来捕捉。

定义功能的时候,如果能在方法内部解决的就try,解决不了的就抛。声明在函数上。
作者: AngieFans85    时间: 2012-9-1 13:09
需要补充一下,匿名内部类中的方法不可以抛出非运行时异常,但是可以抛出运行时异常.
作者: 黑马张旭明    时间: 2012-9-1 13:18
今天敲代码发现一个疑问,就是在匿名内部类中的异常只能被捕获,不能被抛出吗?

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

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


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 13:21
上面这句“匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样或者是父类异常的子集。”
应该是父类异常的子类和数量上的子集,打太快字漏了。

作者: 邵阳    时间: 2012-9-1 13:27
梁志冰 发表于 2012-9-1 11:20
首先匿名内部类的前提是:内部类必须继承或实现一个外部的类或者接口。
再则异常抛出的基本原则:功能中用t ...

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

哥们这个怎么解释啊,求详解
作者: 邵阳    时间: 2012-9-1 13:33
黑马张旭明 发表于 2012-9-1 13:21
上面这句“匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样 ...

怎么是数量上的子集啊
作者: 黑马张旭明    时间: 2012-9-1 13:36
就是父类抛出3个异常,而子类只能抛出3个或者3个以内的异常,而且这些异常还必须和父类抛出的异常一样或者是其子类
作者: 黑马张旭明    时间: 2012-9-1 13:40

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");
   }
}


作者: AngieFans85    时间: 2012-9-1 13:56
黑马张旭明 发表于 2012-9-1 13:21
上面这句“匿名内部类中的异常是可以抛出的,前提是父类中必须得有异常而且子类抛出的异常必须和父类的一样 ...

你这么一说,我也想起老毕的视频里有讲过的了.平时都是用eclipse自动生成代码,也没注意这些细节,呵呵.




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