java——异常与捕获

异常体系:当程序出现错误时,能最大化的减少损失的一种保护手段。
在java中异常也是类。

异常类继承关系:只有Throwable以及其子类能进行异常捕获与处理。
Error:描述JVM运行时内部错误,如栈溢出,堆溢出。
Exception:程序中普遍存在的,由于代码问题产生的错误。

  • IOException:由于输入输出产生的异常,如在程序中打开了一个并不存在的文件。

  • RuntimeException:发生在运行时异常,编译不会报错,如数组越界异常、类型转换异常、空指针异常(NPE)
    java——异常与捕获

所有的异常都是由Throwable继承而来。

                               Throwable(父类)

Error                                                              Exception

                                          IOException             RuntimeException

受查异常:出了非受查异常的所有异常类都属于受查异常。强制用户进行异常处理。
非受查异常:Error、RuntimeException及其子类。不强制用户进行异常处理。
异常处理:当异常产生时,尽量保证异常之后的代码能够正常执行。

Exception与RuntimeException的区别,以及几个常见RuntimeException:

  1. 使用Exception是RuntimeException的父类,使用Exception定义的异常都要求必须使用异常处理,而使用RuntimeException定义的异常可以由用户选择性的来进行异常处理。
  2. 常见的RuntimeException:ClassCastException、NullPointerException等。

异常处理格式:

try
   [catch...]
    [catch...]
  .....
   [finally]
try..[1,n]catch..
try..finally..
try..[1,n]catch..fianlly..

try:所有可能会出现异常的代码
catch:当相应异常出现时,捕获该异常,然后自定义处理方式
finally:保证重点代码(如IO流的关闭、JDBC资源的释放等)一定会被执行的机制,无论是否产生异常,finally代码块中的内容一定会被执行。

(除了系统退出:System.exit();)

public static  int test(){
    try{
        System.out.println(10/0);
        return 0;
    }
    catch(Exception e){
        return 1;
    }
    finally{
        return 2;
    }
}

throws:用在方法声明上,明确表示该方法可能会产生异常。当异常产生时,将异常对象扔给调用者。

public class Test {
   public static void main(String[] args) {
      try {
         System.out.println(calculate(10, 0));
      } catch (Exception e) {
         e.printStackTrace();
      }
}
   public static int calculate(int x,int y) throws Exception {
      return x/y ;
   }
}

throw:用在方法中,表示人为进行异常对象的产生。一般与自定义的异常类搭配使用。
自定义异常类:extends RuntimeException or Exception
架构设计时用自定义异常类。

assert:(了解)断言
断言是从JDK1.4开始引入的概念。断言指的是当程序执行到某些语句之后其数据的内容一定是约定的内容。

public class Test {
   public static void main(String[] args){
      int num = 10 ;
      assert num == 55 : "错误:num应当为55" ;
      System.out.println(num);
   }
}

如果要想让断言起作用,则必须使用-ea的参数,启用断言。

Exception in thread "main" java.lang.AssertionError: 错误:num应当为55
   at test.Test.main(Test.java:6)

实际上断言的意义并不是很大,Java之所以引入主要是为了与C++兼容,开发之中不提倡使用断言。

上一篇:Java中运行时异常和非运行时异常什么鬼?


下一篇:Java中Exception 和 Error 的区别