java.lang.
Throwable
可以 自定义异常类来表示自己程序中的特定异常。要自己定义异常类,必须从已有的异常类继承。对于异常来说,最重要的就是类名,所以起一个好的名字,类内为空也行。
printStackTrace()方法。它将打印 从方法调用处,知道异常抛出处 的方法调用栈。
可以通过语句 catch(Exception e){} 捕获所有的异常,所以最好把它放在所有捕获的末尾,以防它 抢在其他处理程序之前 先把异常捕获了。
异常捕获后也可以再把它重新抛出。
在Java中所有 不是 RuntimeException派生的Exception都是 检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。 检查型异常是JAVA首创的,在编译期对异常的处理有强制性的要求。在JDK代码中大量的异常属于检查型异常,包括IOException,SQLException等。
在Java中 所有RuntimeException的派生类都是非检查型异常,与检查型异常相对抛出非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。
是所有错误和异常的父类。只有它(或它的子类)的实例才可以被JVM抛出。
Throwable对象派生出两种类型:Error和Exception,前者用来表示编译时和系统错误,程序员往往不必关心;后者是可以被抛出的基本类型,需要程序员关注。
1.try与catch
try{ //code that might generate exceptions }catch(Type1 id1){ //Handle exception of Type1 }catch(Type2 id2){ //Handle exception of Type2 }catch(Type3 id3){ //Handle exception of Type3 } // etc ...
可以 自定义异常类来表示自己程序中的特定异常。要自己定义异常类,必须从已有的异常类继承。对于异常来说,最重要的就是类名,所以起一个好的名字,类内为空也行。
printStackTrace()方法。它将打印 从方法调用处,知道异常抛出处 的方法调用栈。
可以通过语句 catch(Exception e){} 捕获所有的异常,所以最好把它放在所有捕获的末尾,以防它 抢在其他处理程序之前 先把异常捕获了。
异常捕获后也可以再把它重新抛出。
public class A { public static void main(String[] args) { try { fun(); System.out.println(1);//若上句发生异常,此句将得不到执行,符合预期。 } catch (Exception e) { System.out.println(2); } } static void fun() throws NullPointerException { throw new NullPointerException(); } } /*2*/
2.finally
对于一些代码A,可能希望 无论try{} 中是否发生了异常,A都能得到执行,此时可在异常处理后面加上finally{}语句块。
finally{}中不要写return,IDE会有警告,这样的写法不合理。
注意:若一个函数中return语句在finally语句前面,finally仍能得到执行。
有时可以见到这样的写法,try{} finally{},不要catch{}。这种写法也是可以的,编译器不会报错。效果是发生异常照样抛出,但finally{}照样执行。
3.执行顺序
try{ line1; line 2;}中有多行代码,若line1抛出了异常,则line2得不到执行。
catch(Exception e){}若得到命中,则执行完后,它后面的正常代码也能得到执行。
检查型/非检查型 异常
Java的异常(Exception)按照编译器检查方式又可以分为检查型异常(CheckedException)和非检查型异常(UncheckedException)。在Java中所有 不是 RuntimeException派生的Exception都是 检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。 检查型异常是JAVA首创的,在编译期对异常的处理有强制性的要求。在JDK代码中大量的异常属于检查型异常,包括IOException,SQLException等。
在Java中 所有RuntimeException的派生类都是非检查型异常,与检查型异常相对抛出非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。
常见的NullPointException,ClassCastException是常见的非检查型异常。非检查型异常可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。
自定义异常类
不必拘泥于Java中已有的异常类,我们可以自己定义异常来满足需求。对于异常来说,有一个能够说明问题的类名就基本足够了。
Exception类继承自Throwable类,所以拥有了 PrintStackTrace()方法。此方法默认输出到System.err标准错误流中,可以放入实参System.out输出到标准输出流中。
Exception拥有 带String参数的构造函数,所以自己的异常类中可以做一个一样参数列表的构造函数。
定义新的异常类时,必须从已有的异常类继承。
图1 控制台 输出
4.接口中的异常
接口中抛出了异常,那么实现时就不能再抛出其他异常。
这个逻辑也可以用在基类中的函数上。
5.assert 断言
assert (布尔表达式)
若表达式为false,程序抛出 java.lang.AssertError 异常。
默认jvm是不支持断言的,需要用开关
-enableassertions或
-ea来显式开启。
所以尽量不用断言吧,测试的时候使用Junit的assertEquals()方法即可。
6.带资源的try语句
英文名叫 try-with-resource block。