黑马程序员技术交流社区

标题: 关于异常的问题 [打印本页]

作者: 黑马-郑鹏    时间: 2012-9-6 21:32
标题: 关于异常的问题
class Tools
{
        int div(int a, int b) throws ArithmeticException
        {
                return a/b;
        }
}

class ExceptionDemo
{
        public static void main(String[] args)
        {
                Tools tool = new Tools();
                int x=tool.div(4,0);
                System.out.println("x="+x);
        }
}
这段代码我在编译的时候为什么不抛异常?我用的jdk是最新的7u7
作者: 舒远    时间: 2012-9-6 21:36
编译期只对源码做语法检查和类型检查。除零异常是运行期的错误。
因为你的 代码0作为参数传递到方法中,编译器在编译的时候无法检查到实参的传递是否合法的。
你的代码完全符合java的语法。编译器所以不会报错的 。
作者: 黑马-郑鹏    时间: 2012-9-6 21:40
class Tools
{
        int div(int a, int b) throws Exception
        {
                return a/b;
        }
}

class ExceptionDemo
{
        public static void main(String[] args)
        {
                Tools tool = new Tools();
                int x=tool.div(4,0);
                System.out.println("x="+x);
        }
但是上面的代码在编译的时候就会报以下的错。
ExceptionDemo.java:14: 错误: 未报告的异常错误Exception; 必须对其进行捕获或声明以
便抛出
                int x=tool.div(4,0);
                              ^
1 个错误
作者: 杨卓儒    时间: 2012-9-6 21:49
既然int x = tool.div(4,0);
抛出异常了,那你main函数接受到以后总得有个处理方式吧,抛出或者捕获。
作者: 方志亮    时间: 2012-9-6 21:51
本帖最后由 方志亮 于 2012-9-6 21:52 编辑




作者: 创出一片辉煌    时间: 2012-9-6 21:52
黑马-郑鹏 发表于 2012-9-6 21:40
class Tools
{
        int div(int a, int b) throws Exception

在一个普通方法中抛出异常,就是告诉调用处"小心点,我有异常",有异常肯定要进行捕获处理啊,要么在main方法中抛出给JVM
作者: 张飞年    时间: 2012-9-6 21:52
编译期只是针对语法格式,数据类型等进行检查,对于传递的参数只要类型合法就不会报错。除以零是运行时当出现异常的运算条件时,抛出此异常。
作者: 王宝龙    时间: 2012-9-6 21:58
本帖最后由 王宝龙 于 2012-9-6 21:59 编辑

ArithmeticException这个异常是继承与RuntimeException异常的属于运行时异常,
运行时异常编译时不会报错的。
运行时异常最好不要声明,这样就掩盖了问题。
假如有一个这样的程序:
classExceptionA
{
       public void div(int a,int b)throwsArithmeticException
       {
}
}

这些运行错误完全在我们的控制之下。如果特别关注数组下标引发的错误,
就应该更多的时间花费在修正程序错误上,而不是说明这些错误发生的可能性上。

作者: 杨卫腾    时间: 2012-9-6 21:59

你的代码0作为参数传递到方法中,编译器在编译的时候无法检查到实参的传递是否合法的。

你的代码完全符合java的语法。编译器所以不会报错的 。

至于你说的 在方法上边表Exception 编译不通过,你抛出的是父类的对象;

至于  ArithmeticException 是运行时错误,所以在编译的时候是不会标错

RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。

可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。



作者: 杨千里    时间: 2012-9-6 22:25
本帖最后由 杨千里 于 2012-9-6 22:31 编辑

当抛出ArithmeticException时,告诉下面的程序或者调用者,有可能出现 一个整数“除以零”的情况。因为程序已经声明了这种情况,java就把这种情况视为“没有错误
”,程序已经抛出了,如果出现这种问题,会在运行时告诉你。

当抛出Exception时,告诉我们:有异常,有什么异常,我们不知道,java也不知道,这个异常包含的太大了,所以编译时java只检查语法,当你输入(4,0)时,编译就会失败
java告诉你”必须对其进行捕获或声明以便抛出",虽然你声明了throws Exception,java知道你声明的是这个异常吗?

对症下药   就是这个道理,错一点就不行,例如:你得了小小的感冒,你非得吃“治艾滋病,癌症”等那些大病的药,行吗?




作者: 徐传任    时间: 2012-9-6 23:09
属于运行时异常
作者: 黑马-郑鹏    时间: 2012-9-6 23:14
标题: RE: 【以解决】关于异常的问题
谢谢大家的解答,问题以解决。
作者: 郭阳    时间: 2012-9-6 23:18
ArithmeticException是RuntimeException的子类
不需要声明

作者: 黑马-郑鹏    时间: 2012-9-6 23:27
谢谢大家的解答,我问一下,我怎么把我的问题设置为【已解答】状态。
作者: AngieFans85    时间: 2012-9-6 23:37
因为ArithmeticException是运行时异常啊,运行时异常是可以不进行处理的.
作者: AngieFans85    时间: 2012-9-6 23:39
黑马-郑鹏 发表于 2012-9-6 21:40
class Tools
{
        int div(int a, int b) throws Exception

因为Exception不是运行时异常,Exception异常是所有异常的父类,必须对其进行处理.




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