一.异常
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)