throws处理异常(声明 抛出)

发生编译时异常直接 throws 一个异常类名 向上抛出异常 即可


为啥发生的异常java虚拟机可以知道他是编译时异常还是运行时异常呢 因为异常方法有 throws关键字向上抛出了异常 抛给了某个异常 java虚拟机就根据抛给的异常判断时那个时期的异常


throws不是真正的处理异常,它只是在推卸责任,它是将异常信息捕捉到抛给调用它的人处理,如果调用它的人能真正的处理掉异常就处理(try...catch...)不能处理就抛给上级,直到抛给了jvm,如果让jvm知道了异常,那么程序就直接退出jvm了发生异常的代码后面的代码不会在执行了,但是如果一个方法用throws向上抛出异常,但是没人调用这个方法,也不会产生异常,是可以编译通过的。



try catch处理异常(捕捉)

catch可以捕捉多个异常

但是不能重复捕捉一个异常,所以捕捉的异常应该从上到下,从小到大,因为大的异常会包含小的异常当捕捉到一个异常过后将执行该异常的catch语句块一旦执行了catch语句块过后,整个try语句将结束执行,继续执行try语句后面的代码

语法格式是

 try

 {可能出现错误的代码}catch(异常类型1 储存异常事件对象内存地址的变量){

  异常处理代码;

 }catch(异常类型2 储存异常事件对象内存地址的变量){

  异常处理代码;

 }


 注意

  catch前面必须有try但是try后面不一定有catch


try catch是真正的处理异常,它不会在向上抛,从此被处理的异常就销声匿迹了



getMessage方法和printStackTrace

getMessage方法是用来获取错误信息的

printStackTrace是用来打印异常堆栈信息

 这个比getMessage详细很多

 getMessage获取的内容就是printStackTrace的一部分

 程序员调试代码一般就用这个



finally语句块

它可以 try...finally 也可以 try...catch...finally

finally里面的代码块一定会执行 retrun 也没用 除非在执行finally之前直接退出JVM system.exit(0) 执行顺序是先把try中的代码执行完 然后执行如果有异常就先执行catch里面的语句如果没有就直接执行finally中的代码

一定要注意作用域的问题

一般就是保证某个 资源的释放会在finally中执行


注意不要将 final finalSize finally 这几个关键字搞混淆了第一个是修饰符 第二个是object中的一个方法是在垃圾回收机制回收垃圾的时候自动调用的一个方法 最后一个才是在异常处理的时候执行的finlly语句