5.2.5  灵活应用throw

Scanner 类验证数据的方法,和包装类的方法,如 parseDouble() 等,只是验证数据是否合法类型,或者对合法数据进行数值转换,但不能验证数据值是否超出规定的应用范围。例如,年龄 age 必须是从 0 199 之间的正整数。灵活应用 throw 语句,可以达到进一步验证数据是否超界的异常。
1. 利用 throw 验证年龄 age 是否超界,并处理这个异常。
 
// 完整程序见本书配套资源目录 Ch5 中名为 ThrowExceptionTest.java
try {
     ageString = JOptionPane.showInputDialog("Please enter your age: ");
     age = Integer.parseInt(ageString);
     if (age < 0 )                  //age 小于下界
        throw new Exception ( "Age less than 0 error!  Please try again. ")
     else if (age > 199)            //age 大于上界
        t hrow new Exception("Age greater than 199 error!. Please try ag ain.
        ")
     ...
}
catch (NumberFormatException e) {
    System.out.println("Invalid entry.  Please enter an integer as your
    age." );
}  
catch (Exception e) {
    System.out.println(e);
}
 
如同讨论过的,在这个例子中如果输入的 age 是非法整数, parseInt() 将抛出 NumberFormatException 异常对象。但如果 age 小于 0 ,利用 throw 抛出一个包含有数据小于下界错误信息的 Exception 异常对象;如果 age 大于 199 ,则抛出一个包含有数据大于上界错误信息的 Exception 异常对象,达到进一步验证数据的目的。
我们也称系统抛出的异常,如 parseInt() 抛出的异常为隐性异常抛出;而利用 throw 语句抛出的异常为显性异常抛出。
2 .利用 String 类的 isEmpty() 方法,可以用来验证输入数据是否为空,即如果调用它的字符串长度为 0 isEmpty() 将返回真。这样可以产生更精确的异常处理信息。上面的例子可以修改为:
 
try {
    ageString = JOptionPane.showInputDialog("Please enter your age: ");
    if (ageString.isEmpty())        // 如果没有输入任何数据
        throw new Exception("Did not enter any data.  Please enter your
        age.
");
    ...
    }
    catch (Exception e) {
        System.out.println(e);
}
 
在以上例子中我们利用标准异常类 Exception ,“借花献佛”,创建一个有具体的、精确异常信息的对象,达到验证数据的目的。实际上,我们可以选择任何一个 API 提供的标准异常类,例如 InputMismatchException 等,取得同样异常处理效果。只要在创建这个异常对象时利用构造器设置自定义的异常信息即可。例如:
 
if (ageString.isEmpty())        // 如果没有输入任何数据
    throw new InputMismatchException("Did not enter any data.  Please enter
    your age. ");
...
}
catch (InputMismatchException e) {
    System.out.println(e);
}