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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

关于异常的概念和运行机制我能理解。异常中使用的几个关键字我也都知道怎么用。
我想说的是:在时间开发中,我们应该怎么样合理捕获和处理异常。
什么时候该抛给调用者?
什么时候该自己捕获掉?
什么使用自定义异常?
而我大部分的时候都是发现异常就直接捕获,很少像java源码那样把异常抛给调用者。让调用者继续捕获或者继续像上抛。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

5 个回复

正序浏览
可以看看下面的异常的总结:
        异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。
        有些异常需要做处理,有些则不需要捕获处理,后面会详细讲到。
        天有不测风云,人有旦夕祸福,Java的程序代码也如此。在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免、不可预测的情况则在考虑异常发生时如何处理。
        Java中的异常用对象来表示。Java对异常的处理是按异常分类处理的,不同异常有不同的分类,每种异常都对应一个类型(class),每个异常都对应一个异常(类的)对象。
        异常类从哪里来?有两个来源,一是Java语言本身定义的一些基本异常类型,二是用户通过继承Exception类或者其子类自己定义的异常。Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
        异常的对象从哪里来呢?有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的异常。二是程序员自己抛出的异常,这个异常可以是程序员自己定义的,也可以是Java语言中定义的,用throw 关键字抛出异常,这种异常常用来向调用者汇报异常的一些信息。
        异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中进行的。
        Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理。基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执行return之前执行,一般结构如下:
try{
  程序代码
}catch(异常类型1 异常的变量名1){
  程序代码
}catch(异常类型2 异常的变量名2){
  程序代码
}finally{
  程序代码
}
        catch语句可以有多个,用来匹配多个异常,匹配上多个中一个后,执行catch语句块时候仅仅执行匹配上的异常。catch的类型是Java语言中定义的或者程序员自己定义的,表示代码抛出异常的类型,异常的变量名表示抛出异常的对象的引用,如果catch捕获并匹配上了该异常,那么就可以直接用这个异常变量名,此时该异常变量名指向所匹配的异常,并且在catch代码块中可以直接引用。这一点非常非常的特殊和重要!
        Java异常处理的目的是提高程序的健壮性,你可以在catch和finally代码块中给程序一个修正机会,使得程序不因异常而终止或者流程发生以外的改变。同时,通过获取Java异常信息,也为程序的开发维护提供了方便,一般通过异常信息就很快就能找到出现异常的问题(代码)所在。
        Java异常处理是Java语言的一大特色,也是个难点,掌握异常处理可以让写的代码更健壮和易于维护。
回复 使用道具 举报
实际开发的异常的话,这个饿基本没做个实际开发诶,但是也做过小小的网站,下面举个简单的异常处理吧!

假设你在一个网页注册用户的时候,当你点注册时,这时候网页上的数据回提交到服务器端,然后服务器再去查询数据库,不过饿用的是xml数据库,方便点!如果数据库里面有那个用户名,也就是用户名已经被注册了的话!饿就会抛一个 UserExistException (这个异常时自定义异常,一般开发的时候都要自定义异常的),交给上级处理,也就是业务逻辑曾,然后在数据回显,在网页上会提示你 用户名已存在 相关的提示信息,这就是简单的异常处理了


希望可以帮到楼主、、、

The you smile until forever 、、、、、、、、、、、、、、、、、、、、、、
回复 使用道具 举报
Java异常的捕获和处理是一个不容易把握的事情,如果处理不当,不但会让程序代码的可读性大大降低,而且导致系统性能低下,甚至引发一些难以发现的错误。



    Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。下面将骤一介绍,通过认识这五个关键字,掌握基本异常处理知识。

    1、 异常处理的基本语法     在java中,异常处理的完整语法是:      try{       //(尝试运行的)程序代码     }catch(异常类型 异常的变量名){       //异常处理代码     }finally{       //异常发生,方法返回之前,总是要执行的代码     }



    以上语法有三个代码块:     try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。

    catch语句块会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,表示可捕获异常类型。当 try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对 象。catch语句可以有多个,用来匹配多个中的一个异常,一旦匹配上后,就不再尝试匹配别的catch块了。通过异常对象可以获取异常发生时完整的 JVM堆栈信息,以及异常信息和异常发生的原因等。

    finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并且这个语句块总是在方 法返回前执行。目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性。     2、 try、catch、finally三个语句块应注意的问题     第一、try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个。     第二、try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。     第三、多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下。

    3、throw、throws关键字     throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该 方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出 的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。    throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。 当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,看看如何 使用这两个关键字:          public static void test3() throws Exception{       //抛出一个检查异常             throw new Exception("方法test3中的Exception");         }     3、 Throwable类中的常用方法     getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。     getMessage():返回异常的消息信息。     printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。
回复 使用道具 举报
今天刚看到的博客,希望对楼主有帮助
http://blog.csdn.net/p106786860/article/details/11795771
回复 使用道具 举报
首先,先说一下什么时候抛给调用者,当你的上一层需要你抛出的异常的结果的时候,你就抛出异常给你的上一层,举个简单的例子,我要调用一个连网的方法,并根据连网状态来执行让程序给出用户相应的提示,如果联网异常你就告诉我,我提示给用户,比如联网状态异常等等都要通过界面告诉用户,而不是只在你的控制台显示。
自己捕获异常一般常用的就是Thread.sleep();这个方法,都是自己捕获。不希望通知用户,你捕获异常自己处理,一般捕获后写到自定义的日志文件里面。
自定义异常:这个一般用的比较少,就是自己的异常交给自己定义的方法自己处理,不要交给系统,也不必让用户看到,最简单的就只在控制台打印一下,或存到日志文件里面。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马