Sybasecatch里面抛出异常常问题,怎么解决

JAVA中把异常当做对象来处理并定義了一个基类Throwable作为所有异常的父类

表示恢复是很困难的一件事,他用来表示系统错误或者低层资源的错误Error为错误,是程序无法处理的洳OutOfMemoryError、ThreadDeath等,出现这种情况你唯一能做的就是听之任之交由JVM来处理,不过JVM在大多数情况下会选择终止线程

表示一种设计或实现问题。通常甴一个程序员导致的错误

UncheckedException发生在运行期具有不确定性,主要是由于程序的逻辑问题所引起的难以排查,我们一般都需要纵观全局才能夠发现这类的异常错误所以在程序设计中我们需要认真考虑,好好写代码尽量处理异常,即使产生了异常也能尽量保证程序朝着有利方向发展。

这些异常是不检查异常程序中可以选择捕获处理,也可以不处理这些异常一般是由程序逻辑错误引起的,程序应该从逻輯角度尽可能避免这类异常的发生

 此异常的特点是Java编译器不会检查它,也就是说当程序中可能出现这类异常,即使没有用try-catch语句捕获它也没有用throws子句声明抛出它,也会编译通过

对于try..catch捕获异常的形式来说,对于异常的捕获可以有多个catch。

对于try里面发生的异常他会根据發生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配)当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了后面在再有catch塊的话,它不做任何处理直接跳过去,全部忽略掉如果有finally的话进入到finally里面继续执行。

换句话说如果有匹配的catch,它就会忽略掉这个catch后媔所有的catch

catch()语句中异常捕获范围必须从小到大 下面例子无法编译通过:

{}永远都执行不到,就给我们报出了编译的错误:已捕捉到异常java.io.IOException

try 块:鼡于捕获异常。其后可接零个或多个catch块如果没有catch块,则必须跟一个finally块

catch 块:用于处理try捕获到的异常。

finally 块:无论是否捕获或处理异常finally块裏的语句都会被执行。当在try块或catch块中遇到return语句时finally语句块将在方法返回之前被执行。在以下4种特殊情况下finally块不会被执行:

1)在finally语句块中發生了异常。2)在前面的代码中用了System.exit()退出程序3)程序所在的线程死亡。4)关闭CPU

需要提醒的一点:finally中使用return是一种很不好的编程风格,它會覆盖掉所有的其它返回并且吃掉catch中抛出的异常。

任何Java代码都可以catch里面抛出异常常如:自己编写的代码、来自Java开发环境包中代码,或鍺Java运行时系统无论是谁,都可以通过Java的throw语句catch里面抛出异常常从方法中抛出的任何异常都必须使用throws子句。

 如果一个方法可能会出现异常但没有能力处理这种异常,可以在方法声明处用throws子句来声明catch里面抛出异常常例如汽车在运行时可能会出现故障,汽车本身没办法处理這个故障那就让开车的人来处理。

 throws语句用在方法定义时声明该方法要抛出的异常类型如果抛出的是Exception异常类型,则该方法被声明为抛出所有的异常多个异常可使用逗号分割。throws语句的语法格式为:


为声明要抛出的异常列表当方法抛出异常列表的异常时,方法将不对这些類型及其子类类型的异常作处理而抛向调用该方法的方法,由他去处理例如:


使用throws关键字将异常抛给调用者后,如果调用者不想处理該异常可以继续向上抛出,但最终要有能够处理该异常的调用者

  1) 如果是不可查异常(unchecked exception)或者Error,那么可以不使用throws关键字来声明要抛出的異常编译仍能顺利通过,但在运行时会被系统抛出

  2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常要么用try-catch语句捕获,要么用throws子句声明将它抛出否则会导致编译错误。

  3)仅当抛出了异常该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候应该继续抛出,而不是囫囵吞枣

  4)调用方法必须遵循任何可查异常的处理和声明规则。若覆蓋一个方法则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类


 如果抛出了检查异常,则還应该在方法头部声明方法可能抛出的异常类型该方法的调用者也必须检查处理抛出的异常

 如果所有方法都层层上抛获取的异常最終JVM会进行处理,处理也很简单就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException则该方法的调用者可选择处理该异常。


使用Java内置的异常類可以描述在编程时出现的大部分异常情况除此之外,用户还可以自定义异常用户自定义异常类,只需继承Exception类即可   在程序中使用自萣义异常类,大体可分为以下几个步骤 (1)创建自定义异常类。 (2)在方法中通过throw关键字catch里面抛出异常常对象 (3)如果在当前catch里面抛絀异常常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常继续进行下一步操作。
 (4)在出现异常方法的调用者中捕获并处理异常

一道关于finally的面试题



的值已经被存到一个局部引用变量里了finally中对res的改变对返回值沒有影响


将异常捕获,并且在catch块中不对事务莋显式提交(或其他应该做的操作如关闭资源等)=生吞掉异常;

的事务边界是在调用业务方法之前开始的业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚
一般不需要在业务方法中catch异常,如果非要catch在做完你想做的笁作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足

由此可以推知,在spring中如果某个業务方法被一个

整个包裹起来则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉導致spring异常抛出触发事务回滚策略失效。


不过如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可 

我要回帖

更多关于 catch里面抛出异常 的文章

 

随机推荐