Java代码调用Long.valueOf()函数时抛出运行时异常问题排查
异常触发原因
NumberFormatException的触发逻辑非常明确:
- 代码中使用
Long.valueOf()做字符串转数值的逻辑,long是Java的基础整数类型,对应的解析方法只能识别不含小数点、非科学计数法的纯整数字符串。 - 你传入的命令行参数是
34.678、46.322这类带小数点的浮点数字符串,解析逻辑遇到小数点就会判定格式非法,直接抛出数字格式异常。
关于「传整数时提示异常但仍能输出结果」的说明
这个现象和代码逻辑、运行流程有关:
- 如果传入两个合法整数字符串,
Long.valueOf()可以正常解析,代码会顺利走到求和输出的逻辑,根本不会进入catch块,也不会打印异常栈。 - 出现异常提示说明运行过程中确实触发了异常,最常见的两种原因:一是运行时没传够2个命令行参数,取
args[0]/args[1]时触发了数组下标越界异常,控制台混了之前运行的错误日志;二是修改代码后没有重新执行javac命令编译,运行的是旧版本的class文件。
修正方案
如果需要支持整数、浮点数混合求和,把数值类型换成double即可,Double.valueOf()可以兼容解析整数字符串和浮点数字符串,修正后代码如下:
public class testforfun { public static void main(String[] args) { try{ if(args.length < 2){ System.out.println("请传入2个数字参数"); return; } double num1 = Double.valueOf(args[0]); double num2 = Double.valueOf(args[1]); // 浮点数计算建议格式化输出规避精度问题 System.out.printf("%.3f%n", num1 + num2); }catch(NumberFormatException e){ System.out.println("参数格式错误,请传入合法数字"); e.printStackTrace(); } } }
重新编译执行的命令如下:
javac testforfun.javajava testforfun 34.678 46.322
执行后会正常输出结果81.000,不会抛出异常。
内容的提问来源于stack exchange,提问作者FAIZ ALAM
相关产品推荐
相关产品推荐

