五、断言和断言的使用
1
.断言
断言用于证明和测试程序的假设,比如“这里的值大于5”。
断言可以在运行时从代码中完全删除,所以对代码的运行速度没有影响。
2
.断言的使用
断言有两种方法:
一种是
assert<<
布尔表达式
>>
;另一种是
assert<<
布尔表达式
>>
:
<<
细节描述
>>
。
如果布尔表达式的值为
false
,将抛出
AssertionError
异常;细节描述是
AssertionError
异常的描述文本
使用
javac –source 1.4 MyClass.java
的方式进行编译
示例如下:
public class AssertExample {
public static void main(String[] args) {
int x = 10;
if (args.length > 0) {
try {
x = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
}
}
System.out.println("Testing assertion that x == 10");
assert x == 10:"Our assertion failed";
System.out.println("Test passed");
}
}
由于引入了一个新的关键字,所以在编译的时候就需要增加额外的参数,要编译成功,必须使用JDK1.4的javac并加上参数'-source 1.4',例如可以使用以下的命令编译上面的代码:
javac -source 1.4 AssertExample.java
以上程序运行使用断言功能也需要使用额外的参数(并且需要一个数字的命令行参数),例如:
java -ea AssertExample 1
程序的输出为:
Testing assertion that x == 10
Exception in thread "main" java.lang.AssertionError:
Our assertion failed
at AssertExample.main(AssertExample.java:20)
由于输入的参数不等于10,因此断言功能使得程序运行时抛出断言错误,注意是错误,这意味着程序发生严重错误并且将强制退出。断言使用boolean值,如果其值不为true则抛出AssertionError并终止程序的运行。
3
.断言推荐使用方法
用于验证方法中的内部逻辑,包括:
-
内在不变式
-
控制流程不变式
-
后置条件和类不变式
注意:不推荐用于公有方法内的前置条件的检查
4
.运行时屏蔽断言
运行时要屏蔽断言,可以用如下方法:
java
–
disableassertions
或
java
–
da
运行时要允许断言,可以用如下方法:
java –enableassertions
或
java –ea
练习实践
本章的主要内容是异常处理,实践重点:
l
异常处理的两种常用方式;
l
try…catch…finally
结构
程序1
创建异常
需求:主动创建一个异常并抛出;
目标:
深入了解异常的工作机制。
程序:
//: ExceptionMethods.java
package com.useful.java.part2;
public class ExceptionMethods {
public static void main(String[] args) {
try {
throw new Exception("Here's my Exception");
} catch(Exception e) {
System.out.println("Caught Exception");
System.out.println(
"e.getMessage(): " + e.getMessage());
System.out.println(
"e.toString(): " + e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
}
}
}
|
说明:
1、
try
的时候,创建一个异常,没有处理,上抛了出去;
2、
catch
时,抓住抛出的异常,并以多种情况显示出来;
3、
运行情况如下图所示:
程序2:
需求:继承Exception
类,定义自己的Exception
类。
目标:
1、 复习Exception
类的使用;
2、 了解继承的基本用法。
程序:
//: Inheriting.java
package com.useful.java.part3;
class MyException extends Exception {
public MyException() {}
public MyException(String msg) {
super(msg);
}
}
public class Inheriting {
public static void f() throws MyException {
System.out.println(
"Throwing MyException from f()");
throw new MyException();
}
public static void g() throws MyException {
System.out.println(
"Throwing MyException from g()");
throw new MyException("Originated in g()");
}
public static void main(String[] args) {
try {
f();
} catch(MyException e) {
e.printStackTrace();
}
try {
g();
} catch(MyException e) {
e.printStackTrace();
}
}
}
|
说明:
1、 根据异常一章及本章内容,我们自定义了一个异常类;
2、 程序运行情况如下:
3
、需要注意的是super
的用法,另外,还有一个this
。super
代表父类,this
代表本类。
作业
1
.用
extends
关键字创建自己的异常类;
2
.用
main()
创建一个类,令其抛出
try
块内的
Exception
类的一个对象。为
Exception
的构造方法赋予一个字串参数。在
catch
从句内捕获异常,并打印出字串参数。添加一个
finally
从句,并打印一条消息,证明自己真正到达那里。
3
.给定下面代码:
public void example(){
try {
unsafe();
System.out.println("Test 1");
}catch(Exception e}{System.out.println("Test 2");
}finally{System.out.println("Test 3");}
System.out.println("Test 4");
}
如果方法unsafe()运行正常,哪个结果不会被显示出来?
A. Test 1 B. Test 2 C. Test 3 D. Test 4
4
.编写应用程序,从命令行传入两个整型数作为除数和被除数。要求程序中捕获NumberFormatException异常和ArithmeticException异常,在命令行输入不同的参数时能输出如下各种结果:
java A
总是被执行
Exception in thread
“main”java.lang.ArrayIndexOutofBoundsException at A.main(A.java:7)
java A 1 2
0
总是被执行
java A 1 3a
java.lang.NumberFormatException: 3a
at java.lang.Integer.parseInt(Integer.java:435)
at java.lang.Integer.parseInt(Integer.java:476)
at A.main(A.java:8)
总是被执行
java A 1 0
java.lang.ArithmeticException: / by zero at A.main(A.java:9)
总是被执行
转载于:https://blog.51cto.com/loveyou010/774692