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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王虎 中级黑马   /  2012-10-6 23:33  /  4760 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于异常的处理是个细致的工作,解决好异常能让程序走的更稳健些,但是最近遇到两个问题:1.啥情况下才进行异常传递?怎么传递的?请知晓的朋友结合代码或图例说明一下 2.自定义异常时需要注意哪些问题,说说自己造异常时是怎么分析并定义出来的?

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

12 个回复

倒序浏览
本帖最后由 廖智 于 2012-10-6 23:50 编辑

异常传递:你说的异常传递应该就是抛异常,如果方法中出现出现异常,那么谁调用这个方法,那么这个异常就抛给谁。
                 默认情况下如果没有对异常情况进行处理,最后会抛给jvm。jvm默认异常处理方式就是将收到的异常名字,信息,位置,都打印在控制台上(也就是我们在运
                 行时看到的异常提示)。然后结束程序。
自定义异常:有些异常java中没有给出对应的异常描述。这时就需要我们来根据异常的特点,按照面向对象的思想对这个问题进行描述,封装成异常对象。
                     也就是说自定义异常就是我们自己描述的一个java中不存在的异常类。
自定义异常的方式:
   1、定义一个类,对问题进行描述。
   2、让这个类继承异常类Exception和RuntimeException。
        

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
自定义异常:解决一些独有的异常,个人认为这是为了将实现功能的代码和异常代码完全分开,不会让开发人员混乱

                自定义异常其实就是我们自已写的一个类
                这个类要想是一个异常类,那么必须继承自
                Exception或其子类.
你说的异常传递我不懂,我想应该是异常使用的细节问题吧?
异常细节

                1.如果父类中的被重写方法抛出异常,那么子类中的重写的方法可以不抛出,或者抛出一样的异常

                2.如果父类中的被重写方法抛出异常,那么子类可以抛出相同的异常或父类抛出异常的子类异常.

                3.如果父类中的被重写方法抛出多个异常,那么子类中重写的方法可以不抛出任何异常,或者与父类
                  相同的异常或这些异常的子类.

                如果被重写的方法没有抛出任何异常,但是在重写的方法中出现的异常,这时
                只能在内部处理 try....catch,不可以进行抛出。
                当你继承异常类后,我们自定义的异常类就有了
                异常的一些特点.
                我们可以通过构造方法自定义一些错误信息,以方便对其进行处理。

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 孙含庆 于 2012-10-7 00:20 编辑

class  
{
        public static void main(String[] args)
        {
                try
                {
                       String str = new String("java run");  //try 块内写可能会抛出异常的代码块
                       exceptionTest(str);

                        Thread.sleep(2000); //这里线程睡上2 秒,假设是多线程,如果别的线程也睡了,这里就会出InterruptedException异常。

                                                       //所以下面要 catch 捕捉一下异常               
                      }
                catch(Exception e)
                {
                }
                catch (InterruptedException e)
                {
                        System.out.println("模拟处理代码");  //如果InterruptedException 被抛出,就执行这段代码。
                }
                finally
                {
                        System.out.println("异常处理不处理,这里都执行");
                                                        //无条件执行的语句               
               }
        }
        public static void exceptionTest(String str)throws Exception

                        /** 在定义方法时,如果不能确定如何处理其中出现的异常,可以不用try-catch 语句进行处理,而是
                                将可能发生的异常抛给该方法的调用者处理,调用者想 try-catch 还是继续 throws 抛出,是他的事。*/         
       {
                System.out.println(str+"模拟出异常代码段");
        }
}
                                /**这两种方式在使用上的区别是: try 方式允许开发者在程序发生异常时,对异常部分进行补救,或是
                                        把异常记录成日志。 而 throws 方式仅仅是在异常发生时把异常抛给上一级,让调用者处理。

                                        使用原则是:如代码发生异常后,后面代码需要继续执行,用 try。                                                               
                                                                如代码发生异常后,有替代方法或要处理,用 try。
                                                                如代码发生异常后,无法处理,后面代码无法正常工作,用 throws                                        
                                        根据情况选择用那个,不要一会儿 try ,一会儿 throws 的,一般用统一的方式来处理。                                
                                */

评分

参与人数 2技术分 +1 黑马币 +16 收起 理由
王海宇 + 1
王虎 + 16 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 孙含庆 于 2012-10-7 00:41 编辑

class  MyException extends Exception // 自定义异常部分,本代码是伪代码
{
        public MyException(){
                super();
        }
        public MyException(String msg){
                super(msg);
        }
        public static void main(String[] args)
        {
                try
                {
                        int age = 102;

                        exceptionTest(age);        //这个方法报了异常,所以这里要 try-catch 处理               
                }
                catch(MyException e)
                {
                        throw new MyException("年龄过大了"); //对接收到得异常进行捕捉                }               
                finally
                {
                        System.out.println("异常处理不处理,这里都执行");
                }
        }
        public static void exceptionTest(int age)throws MyException                        
        {
                if(age>100){
                        throw new MyException(age+"年龄过大了");
                }
        }
}
        /**因为Java 提供的异常有时候不能满足需要,就需要使用自定义异常,如对年龄的限制,java 中没有描述这个异常的错误。               
                自定义异常只要继承Exception 或者Exception的子类,如RnntimeException ,就可以了。        */                                

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
孙含庆 发表于 2012-10-7 00:40
class  MyException extends Exception // 自定义异常部分,本代码是伪代码
{
        public MyException() ...

"throw new MyException("年龄过大了"); //对接收到得异常进行捕捉 "

朋友,你这不是对异常进行捕捉,而是将异常捕捉到后又重新抛出了一个新的自定义异常对象.
回复 使用道具 举报
刚那个题也是你吧,都说了本代码是伪代码,只是演示什么时候用自定义异常。这里就是捕捉,只是捉到后处理方式还是抛出。 哥们,报的几期啊,? 一起交流学习。
回复 使用道具 举报
王虎 中级黑马 2012-10-7 10:40:02
8#
孙含庆 发表于 2012-10-7 10:34
刚那个题也是你吧,都说了本代码是伪代码,只是演示什么时候用自定义异常。这里就是捕捉,只是捉到后处理方 ...

想报呢,不过是javaEE+物联网那个班,不知道那个班啥时候开啊
回复 使用道具 举报
孙含庆 来自手机 中级黑马 2012-10-7 10:45:33
9#
马镱洵 发表于 2012-10-7 07:24
"throw new MyException("年龄过大了"); //对接收到得异常进行捕捉 "

朋友,你这不是对异常进行捕捉,而是 ...

点错回复了。。
回复 使用道具 举报
孙含庆 发表于 2012-10-7 10:34
刚那个题也是你吧,都说了本代码是伪代码,只是演示什么时候用自定义异常。这里就是捕捉,只是捉到后处理方 ...

我是看到你注释地方正是和抛出自定义代码在同一行,所以我觉得有必要说一下什么时候是捕获异常,什么时候是处理捕获到的异常.为了确定让你弄明白这一点并且不误导其他人,所以我才有此回复.
我还没定,自己的事儿还没有处置好.
回复 使用道具 举报
孙含庆 发表于 2012-10-7 10:45
点错回复了。。

原来不是回复我啊,那你也可以看看.
回复 使用道具 举报

RE: java中异常传递和自定义异常是怎么回事?

马镱洵 发表于 2012-10-7 10:48
原来不是回复我啊,那你也可以看看.

就是回复你的,我用手机上的,给发成新回复了,哎,手机打字太难受了。还有,谢谢那哥们的加分,都一块学习哈。!
回复 使用道具 举报
孙含庆 发表于 2012-10-7 11:11
就是回复你的,我用手机上的,给发成新回复了,哎,手机打字太难受了。还有,谢谢那哥们的加分,都一块学 ...

那就好,说明我没有自作多情,哈哈.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马