五、断言和断言的使用                                              
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.4javac并加上参数'-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、   运行情况如下图所示:
 
9acf1d53tb86ae017b244&690

 
程序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 代表本类。
 
9acf1d53tb86ae176abfb&690

 
 
 
 
作业                                      
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  mainjava.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)
总是被执行