/*
2008年9月22日17:58:27
自定义异常与java自带异常的区别
*/import java.io.*;class A extends Exception
{
}class M
{
public static void main(String[] args) // throws IOException
{
try
{
throw new IOException();
}
catch (ArithmeticException b) //为什么把ArithmeticException改为A 编译时就会出错
{
System.out.println("哈哈哈哈!\n");
}
catch (IOException e)
{
}
}}

解决方案 »

  1.   

    因为ArithmeticException是运行时异常,继承自RuntimeException
    RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。 对于A,方法中没有说明要抛出这种异常,编译器就会报错了.
      

  2.   


    package exc;
    import java.io.*; class A extends Exception 

    } class exception 

    public static void main(String[] args) // throws IOException 

    try 

    throw new A(); 

    catch (A b) //为什么把ArithmeticException改为A 编译时就会出错 

    System.out.println("哈哈哈哈!\n"); 
    } } }
      

  3.   

    因为ArithmeticException是运行时异常,继承自RuntimeException 
    RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。 对于A,方法中没有说明要抛出这种异常,编译器就会报错了
                                ------------------------------------------
    小弟是不是可以这样理解: 如果一个方法中没有抛出某个可控制式异常,我们就不能用 catch去捕捉这个控制式异常! 或者讲:只有抛出的可控制式异常才能利用catch去捕捉,再通俗点说:编译器不允许去捕捉一个没有抛出的控制式异常!
    请指教 先谢谢啦
      

  4.   

    若某类型异常出现在catch子句中,则这种类型或者其子类型的异常必须在try块里面有声明,否则便会报错。
    但是RuntimeException及其子类型异常除外。因为这种类型异常若由JVM来控制开销太大,也不是程序员能控制的。
      

  5.   


    哈哈.这个大哥一提醒我才知道...原来我用Opera浏览器 那儿显示空白..试着点了一下,果然出来代码的下拉单了.
      

  6.   

    很简单,你在try块里抛出的是IO异常,而你试图catch的异常类A不是IO异常或IO异常的任意一个祖先类
      

  7.   

    一般是在CATCH 内先扑捉异常,才抛出异常!THROW ...