java

位置:IT落伍者 >> java >> 浏览文章

Java异常


发布日期:2018年12月09日
 
Java异常

在可能会出现exception的地方要使用try-catch或者throws或者两者都要我的判断依据是如果对可能出现的exception不想被外部(方法的调用者)知道就在方法内部try-catch掉这个exception如果希望外部知道则在catch到之后把exception直接抛出或者抛出自定义的exception

异常的种类

java异常可以分成两大类Exception和RuntimeException(虽然RuntimeException是从Exception继承的)exception异常代表无法避免的异常 如io异常 往往这类异常是由于外部原因造成的程序本身无法保证他们不发生所以这类异常必须捕获如果在函数内部无法处理这个异常必须再次抛出(在函数后面用throws语句)如果什么都不做就出现编译错误

runtimexception是指可以避免的异常如 null引用异常这类异常都是由程序内部原因造成的是可以避免的对于这类异常可以忽略他们但一旦发生程序就会异常终止这类异常对debug非常有帮助当然如果需要也可以catch

另外有些地方即使不会有exception但是从商业逻辑上是错误的非预期的也可以抛出user exception例如用户输入非法bank account非法透支等等

主要原则

处理意外的一个重要原则就是要么处理要么接着抛决不能吃掉(You either handle it or throw it You dont eat it)这就是说当你捕获一个异常之后必须决定是否立即处理这个异常或者继续抛出这个异常(或者另一个自定义异常)以便由调用的客户端捕获之当客户端捕获到以后又会继续进行类似的判断

一般来说GUI端是要处理异常的比如JSP捕获到异常之后需要先是给用户一个友好的出错信息而不要给出系统的出错信息系统的出错信息一方面不太友好另一方面提供了太多的系统信息容易被恶意用户用来攻击系统

换句话说所有的异常最终必须有一个终极的处理者这就是GUI至于中间的环节比如在服务器端运行的JavaBean是否要处理捕获到的异常还是继续抛出所捕获的异常需要视具体情况处理

除非你想把异常处理的责任交给调用者一般不用throws 比如你要读入一些文件如果你想通知调用者让调用者决定如何处理这个异常你就把这个异常throws给调用者如果你知道应该如何处理这个异常或者你想把异常马上解决你可以就地catch她

这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者取决于你的程序的结构和要求

需要注意的有

如果无法处理某个异常那就不要捕获它

如果捕获了一个异常请不要胡乱处理它

尽量在靠近异常被抛出的地方捕获异常

在捕获异常的地方将它记录到日志中除非您打算将它重新抛出

按照您的异常处理必须多精细来构造您的方法

需要用几种类型的异常就用几种尤其是对于应用程序异常

异常嵌套和捕获适当的异常

按照Java语言的定义所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式下面讨论两种在处理异常时可兹利用的技术异常嵌套和捕获适当的异常

异常嵌套

你在试图捕获异常并打算扔出异常时该采取什么措施呢?同时你希望原始的异常信息可用吗?

要回答以上的问题你不妨尝试一下NestedException类具体的编程并不难唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据

此外你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件之后你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明

捕获适当的异常

正确地处理异常并不是一项轻松的任务这是因为异常的处理有时会导致程序出现其他不明行为不过以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险

规则 #: 总是捕获扔出异常的类型而不要理睬异常的超类 为了遵守通常的代码习惯你可以采用Exception类的大写字母作为变量名如下所示

catch(FileNotFoundException fnfe)

以及

catch(SQLException sqle)

规则 # : 决不让catch块留空在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做或者如果采用了日志API(Logging API)那么请编写代码把异常写到日志中

规则 # : 决不扔出Exception基类的实例开发人员应当总是扔出自己创建的异常类

扔出异常的API很难处理在声明方法扔出javalangException的情况下所有的问题都会强加在API用户的头上这样他们就无法以一种专业的编程方式来处理异常通过为扔出API声明Exception类的子类这一举措API开发人员就可以减轻用户的负担

以上提到的两种技术在处理异常时还可能用得更好更适当嵌套技术令异常扔到另一异常的内部而捕获适当的异常令程序调试大大简化

上一篇:Java远程通信技术——Axis实战

下一篇:用Java在各种框架下编译Scala项目