十五.Java中的异常和断言

一.异常

  1.异常的定义:Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。

  2.error和exception的区别

    error 一旦发生,程序只能停止,应为程序中是没有办法处理error的
    exception 程序中发生异常之后,如果捕获并进行了相应的处理,那么程序还是可以继续向下正常运行的

  3.主函数是由一个叫main的线程控制的

    异常的报出基于方法的压栈,一个异常如果不处理,这个异常最终会抛到main方法中然后再抛给jvm,JVM调用异常对象的printStackTrace输出异常信息,然后JVM停止运行。

  4.Error和Exception

    在Java中,所有的异常都有一个共同的父类Throwable,该类有两个重要的子类:Exception和Error,二者都是Java异常处理的重要子类,各自都包含大量子类。它们都是java.lang下的类。

                                  java.lang.Throwable
                                  |      |
                             java.lang.Error     java.lang.Exception
                                         |       |
                              java.lang.RunTimeException     (受检异常)编译时异常 
                                |                   |
              (不受检异常)常见的运行时异常:unchecked                                                java.io.IOException
                            |
              算术异常      java.lang.ArithmeticException
              空指针引用     java.lang.NullPointerException
              数组越界      java.lang.ArrayIndexoutofBoundsException
              类型转换异常    java.lang.ClassCastException
              数据格式异常    java.lang.NumberFormatException
              数组长度为负异常  java.lang.NegativeArraySizeException

  Error,这个是程序中发生的错误,是程序无法处理的,表示运行应用程序中较严重问题。而且很多错误与代码编写者执行的操作无关,而是表示代码运行时JVM出现了问题。例如,Java虚拟机运行错误(VirtualMachineError),当JVM中内存不足时,将出现 OutOfMemoryError。这些error发生时,JVM一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应时。如Java虚拟机运行错误(VirtualMachineError)、类定义错误(NoClassDefFoundError)等。这些错误一般是不可查询的,因为它们在应用程序的控制和处理能力之外。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况,因为这是超出程序处理能力的。

  Exception,这个是程序中发生的异常,是程序本身可以处理的,并且处理完之后程序本身还可以继续往下执行。我们进行抛出或捕获的异常就是这个Exception类型及其子类型。

  5.两个例子:
    int a;
    try{         try{
      a=9/0;       a=9/0;
      a=20;        a=20;
      return a;         return a;
    }catch{      }catch{
      a=10;        a=10;
      return a;      return a;
    }finally{     }finally{
      a=30;        a=30;
      return a;    }
    }

    sys:a=? 30 10

    第1.finally部分在 catch 中return前执行了 但是输出的值是30

    第2.finally部分在 catch 中return前执行了 但是输出的值是10//可以看出,finally中有return语句的话catch中的return是没有finally中return语句的优先级高的。

二.断言

  1.断言使用
    在JDK1.4中,Java语言引入一个新的关键字: assert 该关键字有两种形式:

    assert 条件

    以及

    assert 条件:值或表达式

    这两种形式都会对条件进行评估,如果结果为false则抛出AssertionError。
    在第二种形式中,值或表达式的值会传入AssertionError的
    构造器并转成一个消息字符串,成为要显示的错误信息

    例如:
    要断言x不是负数,只需要使用如下简单的语句:
    assert x >= 0;

    或者你可以将x的值传递给AssertionError对象,从而可以在报错时候显示:

    assert x >= 0 : x;

    或者

    assert x >= 0 : "x的值不符合条件:x="+x;

  2. 断言内容代码编译

    因为assert在JDK1.4中是一个新的关键字,因此在使用时需要告诉编译器你编译所使用jdk的版本号。

    javac -source 1.4 MyClass.java

    在jdk的后续版本中,对断言的支持成为默认特性(JDK5.0以上使用时就不需要这个编译了,因为默认就支持的)。

  3. 断言内容代码执行

    默认情况下,断言是关闭的。要通过-enableassertions或者-ea选项来运行程序以打开断言:

    java -enableassertions com.briup.ch07.Xxxx
    java -ea com.briup.ch07.Xxxx

    打开或关闭断言功能,决定了代码在执行时是否会跳过那些和断言相关的代码.因此断言并不会降低程序运行速度。

    注意:使用eclipse运行代码的时候也是可以传参数的(包括俩种参数)
    例如:
    java -xx com.briup.ch07.Test yy
    xx是给JVM传的参数 yy是给Test类的main方法传的参数

   实例:

    public class Stu{
      public static void main(String[] args) throws Exception{
        int x=-1;
        assert x >= 0 : "x的值不符合条件:x="+x;//断言x的值一定大于等于零
      }
    }

    syso:

    Exception in thread "main" java.lang.AssertionError: x的值不符合条件:x=-1
      at jdbc.Stu.main(Stu.java:7)

原文地址:https://www.cnblogs.com/Magic-Li/p/12814522.html