黑马程序员技术交流社区

标题: throw问题 [打印本页]

作者: 刘晓康    时间: 2012-4-4 22:17
标题: throw问题
public class ExceptionDemo4 {

        /**
         * @param args
         */
        public static void main(String[] args) throws ArithmeticException {
                // TODO Auto-generated method stub
     Demo d=new Demo();
     d.div(4, 0);
   
     System.out.println("asd");//为什么抛异常 不执行呢?
        }

}
class Demo
{
        int div(int a,int b)// throws ArithmeticException
        {
        if(b==0)
                        throw new ArithmeticException("出错了");
                return a/b;
        }
}

Exception in thread "main" java.lang.ArithmeticException: 出错了
        at Demo.div(ExceptionDemo4.java:21)
        at ExceptionDemo4.main(ExceptionDemo4.java:10)
为什么不执行System.out.println("asd");//
作者: 胡元    时间: 2012-4-4 22:27
class Demo
{
        int div(int a,int b)// throws ArithmeticException
        {
        if(b==0)
                        throw new ArithmeticException("出错了");
                return a/b;
        }
}
int div(int a,int b)后面生命的异常不要加注释符,你加了注释符虚拟机就不会读取它
那么你下面就相当于还没声明异常就直接抛出异常了!而且,如果在这个程序里主函数
已经是最终调用者了,它把一场抛给虚拟机,虚拟机就把程序停了,下面的代码当然就
读不出来!

作者: 孙利川    时间: 2012-4-4 22:43
本帖最后由 孙利川 于 2012-4-4 23:22 编辑

class Demo
{
        int div(int a,int b)// throws ArithmeticException
        {
        if(b==0)
                        throw new ArithmeticException("出错了");
                return a/b;
        }
}
回复二楼:int div(int a,int b)后面生命的异常不用写,因为ArithmeticException异常是RuntimeException的子类,不用声明。
楼主,这样的结果很正常呀,在程序执行的预料之中呀,d.div(4,0)这句代码调用类Demo的div方法,抛出异常,其后的代码自然就不会执行了,程序到此停止呀。
作者: 葛尧    时间: 2012-4-4 22:43
// ArithmeticException 这里注释不注释都没关系,这个异常没自定义,父类是RuntimeException 所以不声明也没关系

但是异常抛出给了调用者,div(4,0)了 这里是主函数,并且没有try catch()所以就又抛给虚拟机了,所以程序就停掉了
没法执行到下一句了
作者: 刘_浩    时间: 2012-4-5 01:12
因为在抛出异常后,程序就停止了,所以后面的就不会运行了。
作者: 陈苓    时间: 2012-4-5 02:03
   你在主函数上声明了异常,程序在执行的过程中发现除数为0,就发生了异常,这时程序就结束了。下面的代码就执行不了,而且执行也没有意义,如果你要想让他执行必须try,finally 把你需要执行的语句放在finally中的语句一定会被执行,看下面代码

class Demo
{
        int div(int a,int b)throws Exception
        {
                return a/b;
        }
}

class FinallyDemo
{
        public static void main(String[] args)
        {
                Demo d = new Demo();
                try
                {
                        int num = d.div(4,0);
                        System.out.println("num="+num);
                }
                catch (Exception e )
                {
                        System.out.println(e.toString());
                        //return;
                        System.exit(0);//退出jvm。
                }
                finally
                {
                        //定义的是一定会被执行的代码。
                        System.out.println("finally");
                }
                System.out.println("Hello World!");
        }
}




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