- java中所有错误的超类为:Throwable。其下有两个子类:Error和Exception
- Error的子类描述的都是系统错误,比如虚拟机内存溢出等。
- Exception的子类描述的都是程序错误,比如空指针,下表越界等。
- 通常我们程序中处理的异常都是Exception。
##异常处理机制中的finallyjava异常处理try-catch
* 异常处理机制中的try-catch
* 语法:
* try{
* 代码片段...
* }catch(XXXException e){
* 出现错误后的补救措施(B计划)
* }System.out.println("程序开始"); try{ line ="abc"; //String line = null; System.out.println(line.length()); System.out.println(line.charAt(0)); System.out.println(Integer.parseInt(line)); System.out.println("!!!!????"); //前面发生异常,后面的语句不再执行 } catch(NullPointerException | StringIndexOutOfBoundsException e){//子类异常在上 System.out.println("空指针异常或数组下标越界异常"); } catch(Exception e){//超类异常下 System.out.println("发生未知错位"); } System.out.println("程序结束");
##*finalize<1finally块定义在异常处理机制中的最后一块。它可以直接跟在try之后,或者最后一个catch之后。
<2finally可以保证只要程序执行到了try语句块中,无论try语句块中的代码是否出现异常,最终finally都必定执行。
<3finally通常用来做释放资源这类操作。System.out.println("程序开始了..."); try{ String str = "abc"; System.out.println(str.length()); // return;直接跳出main方法 }catch(Exception e){ System.out.println("出错了,并处理了"); } finally{ System.out.println("finally中的代码必执行!"); } System.out.println("程序结束了");使用异常机制处理IOException
//向文件中写入一个字节 FileOutputStream fos =null; try { fos = new FileOutputStream("./fos.dat"); fos.write(1); } catch (IOException exception) { exception.printStackTrace(); } finally { try { if (fos!=null) { fos.close(); } } catch (IOException exception) { exception.printStackTrace(); } }
##throw关键字finalize是Object当中定义的一个方法,这意味着java中所有的类都有该方法,该方法会被GC调用。
当GC扫描时发现一个对象不再被引用,则会将其释放,在释放前会调用finalize,一旦该方法执行完毕,则对象被释放。
API手册明确说明:该方法可以被重写,但是不应当做耗时的操作,否则可能影响GC的工作。
##受检异常和非受检异常throw用来对外主动抛出一个异常,通常下面两种情况我们主动对外抛出异常:
1:当程序遇到一个满足语法,但是不满足业务要求时,可以抛出一个异常告知调用者。
2:程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时可以抛出给调用者。
Exception可分为执行异常(RuntimeException)和检查异常(Checked Exceptions)两种。
1.RuntimeException(非受检)
RuntimeException在默认情况下会得到自动处理。所以通常用不着捕获RuntimeException,但在自己的封装里,也许仍然要选择抛出一部分RuntimeException。
2.非受检异常主要指编译器免检异常,通常包括运行时异常类和 Error相关类。



