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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘刚洪 初级黑马   /  2012-3-6 07:50  /  1910 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近自学到自定义异常这里,头就有点大了,毕老师视频里那个长长的例子认真的体会并写了两遍,感觉有些问题还是似懂非懂。结合贴出来的长例子,主要有以下问题:

1、Teacher类中,方法prelect()中直接引用Computer()对象中的方法,假如不是在构造函数时创建的对象new Computer(),而是在该类中的其它方法里创建,还能否在prelect()里引用,为什么?
2、异常抛出与异常处理之间的具体处理机制是什么?
比如在以下程序中:
        当Computer类中的state为3时,就执行if(state==3),从这里一直到相应的catch()发生(两个catch:Teacher里边的和main里边的),应该怎样去理解中间的这个过程?

知道程序长了看起来有点不爽,先在此感谢了


class LanPingException extends Exception
{
        LanPingException(String message)
        {
                super(message);
        }
}

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

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

//---------------------------------------

class Computer
{
        private int state = 3;       

        public void run() throws LanPingException, MaoYanException
        {
                if(state==2)
                        throw new LanPingException("蓝屏了!");
                if(state==3)
                        throw new MaoYanException("冒烟了!");

                System.out.println("电脑运行");
        }

        public void reset()
        {
                System.out.println("电脑重启!");
        }
}
//-------------------------------------

class Teacher
{
        private String name;
        private Computer cmpt;

        Teacher(String name)
        {
                this.name = name;
                cmpt = new Computer();
        }

        public void prelect() throws NoPlanException
        {
                try
                {
                        cmpt.run();
                }
                catch (LanPingException e)
                {
                        cmpt.reset();
                }
                catch (MaoYanException e)
                {
                        test();
                        throw new NoPlanException("课时无法继续"+e.getMessage());
                }
                System.out.println("讲课!");
               
        }

        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("换老师,或者放假!");
                }
        }
}

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

5 个回复

倒序浏览
关于第一个问题,记着对象要先创建后使用。不在构造函数中实例化(new Computer()),也可以只要你保证在prelect()里使用Computer时,已被实例化,比如你就可以在prelect()里开头写上cmpt = new Computer();。但这样一来,其他方法在使用cmpt 又得实例化,很麻烦且浪费资源(创建了很多对象),所以一般都在构造方法里完成实例化。

再一个,异常是本身存在的一个类,抛出异常是一个动作。再合适的时候恰当的地点抛出异常提醒哪里出了什么错。
lz所说的那个问题,还记得对异常的两种处理方法吧:一,抛出去,不作处理,谁调用谁处理。二。加try catch捕捉异常,进行处理。
在这里,Computer把异常抛出,main捕捉这个异常并处理。
回复 使用道具 举报
本帖最后由 代臣 于 2012-3-6 09:55 编辑

问题1:
     之所以在Teacher类中的构造函数中创建Computer类的对象,第一点是因为毕老师在视频中说过,
老师上课都是需要电脑的,这是一种初始化动作,这点在构造函数中有详细讲解,构造函数可以给对应
对象进行初始化,也就是只要你创建了一个Teacher的对象的同时也创建了一个Computer对象,这就是
初始化,也就是基于老师上课需要电脑这一点,才在构造函数中new Computer的。
    你问的可不可以在其他方法中创建Computer对象,答案是视情况而定,在你的这个ExceptionTest
类中,主函数需要调用prelect()这个方法,所以你可以在prelect()方法中调用run方法之前创建Computer
对象,很明显,只要一调用prelect()方法,就会创建一个Computer的对象,拥有Computer的对象之后自
然可以调用run方法。
    但是不可以在test方法中创建Computer的对象,因为test方法根本就没有调用到run方法。

问题2:
在代码中自定义了两个异常:LanPingException, MaoYanException
只要函数中出现了所定义的异常,运行的时候就会报告,在ExceptionTest类中是通过设定state(状态)
的值来检索所出现的异常,也就是state的值不一样,按照代码的定义,抛出的异常也不一样。
具体讲就是:
主函数通过语句t.prelect();调用prelect()方法,语句t.prelect();之所以要放在try中最根本的原因应该是run方法
中有可能出现异常,然后prelect()方法创建Computer对象,通过语句cmpt.run();调用Computer类中的run()
方法,run方法中通过判断state的值执行相应的语句,函数中执行的语句肯定是
if(state==3)
          throw new MaoYanException("冒烟了!");
抛出MaoYanException异常肯定就会自动在命令行出现自定义异常提示。
ok,解释完毕,希望对你有用。

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
dangfei 发表于 2012-3-6 08:10
关于第一个问题,记着对象要先创建后使用。不在构造函数中实例化(new Computer()),也可以只要你保证在pr ...

感谢,Thank you!
回复 使用道具 举报
代臣 发表于 2012-3-6 09:25
问题1:
     之所以在Teacher类中的构造函数中创建Computer类的对象,第一点是因为毕老师在视频中说过,
...

感谢了,Thank you!
回复 使用道具 举报
对于一个类中的成员变量也是一个另外类对象的情况,类中成员方法是无法初始化这样特殊的成员变量的,要初始化只有构造函数,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马