当前位置: 代码迷 >> J2SE >> 关于try catch的一个小疑点,请大家指点一下
  详细解决方案

关于try catch的一个小疑点,请大家指点一下

热度:35   发布时间:2016-04-23 20:27:13.0
关于try catch的一个小问题,请大家指点一下
先贴代码吧,这个代码相信大多数人都看过或者写过

package t20140808;

import java.util.Scanner;

public class ConvertMoney {
// 大写数字
private static final String[] STR_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍",
"陆", "柒", "捌", "玖" };
// 整数单位
private static final String[] STR_UNIT = { "", "拾", "佰", "仟", "万", "拾",
"佰", "仟", "亿", "拾", "佰", "仟" };

public static void main(String[] args){
try{
    Scanner scan = new Scanner(System.in);  //扫描器
    System.out.println("请输入一个金额:");
    String convert = convert(scan.nextLong());
    System.out.println(convert);
    scan.close();
}
catch(Exception e){
System.out.println("输入的格式不正确!");
}
}

public static String convert(long i) {
String strNum = Long.toString(i);
// 如果整数部分大于12,则不能转换
if (strNum.length() > 12) {
System.out.println("数字太大,不能完成转换!");
return "";
}
String point = "元整"; // 小数点位置的替换元素
String result = getLong(strNum) + point;
return result;
}

public static String getLong(String num) {
num = new StringBuffer(num).reverse().toString(); // 反转字符串
StringBuffer temp = new StringBuffer(); // 创建一个StringBuffer对象
for (int i = 0; i < num.length(); i++) {
temp.append(STR_UNIT[i]);
temp.append(STR_NUMBER[num.charAt(i) - 48]);
}
num = temp.reverse().toString();
num = numReplace(num, "零拾", "零");
num = numReplace(num, "零佰", "零");
num = numReplace(num, "零仟", "零");
num = numReplace(num, "零万", "万");
num = numReplace(num, "零亿", "亿");
num = numReplace(num, "亿万", "亿");
num = numReplace(num, "零零", "零");
if (num.lastIndexOf("零") == num.length() - 1) {
num = num.substring(0, num.length() - 1);
}
return num;
}

public static String numReplace(String num, String oldStr, String newStr) {
while (true) {
if (num.indexOf(oldStr) == -1) {
break;
}
num = num.replaceAll(oldStr, newStr);
}
return num;
}
}

我在main方法里加入try就是为了捕捉非long型的数据异常,这样写也确实达到目的。
我的疑问就在于当我输入一个负的long型数据时(如:-128),为什么程序也会认为是数据异常?
------解决方案--------------------
这不是数据转换异常,而是你数组越界了,把try catch去掉结果如下:
请输入一个金额:
-128
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -3
at Proctice.ConvertMoney.getLong(ConvertMoney.java:39)
at Proctice.ConvertMoney.convert(ConvertMoney.java:30)
at Proctice.ConvertMoney.main(ConvertMoney.java:17)
你字符串反转之后就是821-,-对应的ASCII码值 189,189-48=141,已经数组越界了。
------解决方案--------------------
temp.append(STR_NUMBER[num.charAt(i) - 48]);
就是这行代码报异常了,负号“-”的ASCALL码值是45.
45-48=-3
所以数组下标越界了。。