• 十五.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)

  • 相关阅读:
    js float浮点数计算精度问题
    NLB多WEB站点访问共享文件解决方案
    Flash文件跨域访问
    博客地址
    在Ubuntu上安装Mysql
    Ajax调用NPOI导出Excel报表
    在Ubuntu上安装Mongodb
    获取月份的周时间段
    sql表结构和注释
    Highcharts使用指南
  • 原文地址:https://www.cnblogs.com/Magic-Li/p/12814522.html
Copyright © 2020-2023  润新知