Java异常处理机制-Java编程思想

异常

不是所有的错误都可以在编译时获得,有些错误只能在运行时获得,Java使用异常报告错误,传递给某个接受者来处理,使得你的应用更加可靠

执行到异常时不能往下继续执行,要从当前环境跳出(抛出异常),给异常处理程序处理

异常使得我们可以把一件事当做一个事务

构造器

  • 默认构造器

  • 字符串参数构造器

    throw new NullPointException(“t=null”);

    返回一个异常对象并退出当前作用域,交给异常处理程序,可能距离异常抛出地很远,跨越方法调用栈的很多层次

try,catch

如果不希望产生异常的时候结束可以使用try块,并通过catch语句来处理(异常处理程序)

只有匹配的catch语句才能被执行,匹配到不在查找其他cathc块

把越宽的异常类放在catch块最下面,防止范围过宽的基类被抢先执行,Exception

终止与恢复

终止:异常一旦被抛出,无法回来继续执行,错误已无法挽回

恢复:异常处理程序的工作是修正错误,会重新尝试调用出问题的方法(放到While块中)

Throwable

分为Error和Exception,一般我们只关心Exception

==printStackTrace方法==输出==堆栈跟踪信息==:

  • void printStackTrace()
  • void printStackTrace(PrintStream)
  • void printStackTrace(PrintWriter)

自定义异常

继承Exception类

日志记录异常

在catch块调用如下

logger.error(e.getMessage(), e);

getMessage()

类似于toString()

异常说明

void f() throws TooBig, TooSmall{}

这是一个规范写法,使得调用该方法的程序员知道该方法会捕获的异常

RuntimeException 不受检查异常

JVM自动捕获,运行时异常 ==无需异常说明==

使用finally清洗

对于Java有内存回收机制,需要它有什么用?

开关:把某个资源恢复到初始状态 ex:已打开的连接,文件,画的图形

没有异常捕获也会执行

### 构造器异常

当一个对象在执行构造函数时出现异常,那么它没有构造成功,我们无需close,所以我们可以使用==嵌套try-catch==来实现在需要的时候close

public class Cleanup {

  public static void main( String[] args ) {

    try {
      InputFile in = new InputFile( "Cleanup.java" );
      try { // 上面InputFile构造完成以后立即进入该try-finally子句!
        String s = "";
        int i = 1;
        while( (s = in.getLine()) != null )
          System.out.println(""+ i++ + ": " + s);
      } catch( Exception e ) {
        e.printStackTrace( System.out );
      } finally {  // 该finally一定确保in能正常cleanup()!
        in.cleanup();
      } 
    } catch( Exception e ) {
      System.out.println( "InputFile ctor failed!" );
    }

  } // end main()
}

重抛异常

在一个异常被捕获了在catch块中把它再次抛出

异常链

常常想要在捕获一个异常后抛出另一个异常

缺陷:异常丢失

  • 从finally中return
  • 从finally中抛出其他异常捕获

异常的限制

覆盖基类的方法时,只能抛出基类方法中声明的异常

把被检查的异常转换成不被检查的异常

try{  
     //。。。to do somthing useful  
}catch(CheckedException e){  
     throw new RuntimeException(e);  
}  

这种方法不用“吞下”异常,也不必把它放到方法的异常说明里面,而异常链还能保证你不会丢失任何原始的异常信息。6

  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/313d7bc.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!