黑马程序员技术交流社区

标题: throws与catch的运用!求解释 [打印本页]

作者: 电饭煲    时间: 2014-3-23 15:56
标题: throws与catch的运用!求解释
class LanPingException extends Exception
{
        LanPingException(String msg)
        {
                super(msg);
        }
}

class MaoYanException extends Exception
{
        MaoYanException(String msg)
        {
                super(msg);
        }
}

class NoPlanException extends Exception
{
        NoPlanException(String msg)
        {
                super(msg);
        }
}

class Computer
{
        private int state = 2;
        public void run()throws LanPingException,MaoYanException
        {
                if(state==1)
                        throw new LanPingException("电脑蓝屏啦!!");
                if(state==2)
                        throw new MaoYanException("电脑冒烟啦!!");

                System.out.println("电脑运行");
        }
        public void reset()
        {
                state = 0;
                System.out.println("电脑重启");
        }
}

class Teacher
{
        private String name;
        private Computer comp;
        Teacher(String name)
        {
                this.name = name;
                comp = new Computer();
        }
       
        public void prelect()throws NoPlanException
        {
                try
                {
                        comp.run();
                        System.out.println(name+"讲课");
                       
                }
                catch (LanPingException e)
                {
                        System.out.println(e.toString());
                        comp.reset();
                        prelect();
                }
                catch (MaoYanException e)
                {
                        System.out.println(e.toString());
                        test();
                        //可以对电脑进行维修。
//                        throw e;
                        throw new NoPlanException("课时进度无法完成,原因:"+e.getMessage());
                }

        }
        public void test()
        {
                System.out.println("大家练习");
        }
}       
class ExceptionTest
{
        public static void main(String[] args)
        {
                Teacher t  = new Teacher("毕老师");
                try
                {
                        t.prelect();
                       
                }
                catch (NoPlanException e)
                {
                        System.out.println(e.toString()+"......");
                        System.out.println("换人");

                }
        }
}
为什么有throws还要catch?
可以帮我解释下throws与catch的区别和用法?


作者: zzkang0206    时间: 2014-3-23 16:22
问题有很多 能解决的就在catch里面解决了 不能解决的就继续抛异常 让别人去解决
作者: 织语不如书    时间: 2014-3-23 16:32
楼主如果想问throws和catch的关系,假如方法A调用了方法B,B throws 了,那个这个异常不就是抛给了A吗,于是A就可以catch啦,当然A可以继续往外抛出
你看你的prelect()方法,里面调用了run()方法,run()方法throws两个异常,这下都被prelect()接住了,prelect要么catch它们然后处理要么继续往外抛~在这里prelect()处理了它们
作者: my_android_drea    时间: 2014-3-23 17:09
本帖最后由 my_android_drea 于 2014-3-23 17:14 编辑

  问题在这里:                        throw new NoPlanException("课时进度无法完成,原因:"+e.getMessage());
                       
        因为你这里又抛了新的异常(这就是你的问题所在!!),即使catcha了,但异常没彻底解决,所以prelect()方法必须声明异常!!!
      如果你这里去掉抛异常的语句,方法中catch了可以不throws!就像我注释的那样,就可以不throws了。即使catch了,只要方法中有异常抛出都得throws。如果catch了问题全部解决了,就不需throws。

                        
                    

作者: 牛头人图腾    时间: 2014-3-23 17:20
一、异常:程序中出现了与某种既定规则相违背的情况。通俗来讲就是程序中出现了不正常的情况。
二、对于不同的编程语言有不同的异常处理方式,而对于JAVA语言把异常封装成了对象,并定义了两种解决方式:声明抛出或者捕捉,也即当你在编程程序时,当遇到会发生异常的地方,你有两种解决方式:声明抛出或者捕捉。通过关键字throws、throw声明抛出,通过关键字try、catch、finally捕捉处理异常。
三、对于我们处理不了的异常就抛出留给调用者处理,我们处理的了的异常就捕捉处理。你的那段程序是毕老师通过模拟现实来说明异常。像电脑蓝屏是可处理的,可通过重启处理。而对于电脑冒烟、NoplanException是处理不了的就声明抛出。那里只是做一个比喻,真正要说明的问题是在我们编写程序时,程序某些地方有可能发生异常,对于这些异常我们是捕捉处理呢还是抛出呢?功能内部可解决的异常捕捉处理,解决不了的声明抛出留给调用者处理。
作者: 赵军军    时间: 2014-3-24 19:32
    程序运行过程中可能会出现异常情况,比如被0除、对负数计算平方根等,还有可能会出现致命的错误,比如内存不足,磁盘损坏无法读取文件等,对于异常和错误情况的处理,统称为异常处理。
    Java异常处理主要通过5个关键字控制:try、catch、throw、throws和finally。try的意思是试试它所包含的代码段中是否会发生异常;而catch当有异常时抓住它,并进行相应的处理,使程序不受异常的影响而继续执行下去;throw是在程序中明确引发异常;throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法;finally是无论发不发生异常都要被执行的代码
   
    关键字:throw,throws,try和catch的用法如下:
        1、throws出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
        2、throw出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw。
        3、try出现在方法体中,它自身是一个代码块,表示尝试执行代码块的语句。如果在执行过程中有某条语句抛出异常,那么代码块后面的语句将不被执行。
        4、catch出现在try代码块的后面,自身也是一个代码块,用于捕获异常try代码块中可能抛出的异常。catch关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。




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