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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-郑鹏 中级黑马   /  2012-9-6 21:32  /  2567 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

15 个回复

倒序浏览
编译期只对源码做语法检查和类型检查。除零异常是运行期的错误。
因为你的 代码0作为参数传递到方法中,编译器在编译的时候无法检查到实参的传递是否合法的。
你的代码完全符合java的语法。编译器所以不会报错的 。
回复 使用道具 举报
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 个错误
回复 使用道具 举报
既然int x = tool.div(4,0);
抛出异常了,那你main函数接受到以后总得有个处理方式吧,抛出或者捕获。
回复 使用道具 举报
本帖最后由 方志亮 于 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:59 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报

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

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

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

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

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

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


回复 使用道具 举报
本帖最后由 杨千里 于 2012-9-6 22:31 编辑

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

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

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



评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
属于运行时异常
回复 使用道具 举报

RE: 【以解决】关于异常的问题

谢谢大家的解答,问题以解决。
回复 使用道具 举报
ArithmeticException是RuntimeException的子类
不需要声明
回复 使用道具 举报
谢谢大家的解答,我问一下,我怎么把我的问题设置为【已解答】状态。
回复 使用道具 举报
因为ArithmeticException是运行时异常啊,运行时异常是可以不进行处理的.
回复 使用道具 举报
黑马-郑鹏 发表于 2012-9-6 21:40
class Tools
{
        int div(int a, int b) throws Exception

因为Exception不是运行时异常,Exception异常是所有异常的父类,必须对其进行处理.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马