java 断言 异常_十五.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=? 3010

第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)

你可能感兴趣的:(java,断言,异常)