你知道ApacheCommon包中isNumeric方法是坑吗?

使用的Apache-Common包的版本是commons-lang-2.6.jar
本文就来分享一个这个坑的情况,以免其它tx也掉坑中

操作方法

  • 01

    费话不多说,来看代码: package chapter4; import org.apache.commons.lang.StringUtils; /** * Created by MyWorld on 2016/3/24. */ public class StringUtilsIsNumericChecker { public static void main(String[] args) { System.out.println(StringUtils.isNumeric("1")); System.out.println(StringUtils.isNumeric("-1")); } }

  • 02

    围观的tx,认为上面api的输出结果会是什么呢?两个true? 好吧,执行一行看看结果: true false

  • 03

    什么情况,-1不是数字吗? 为什么是false呢 来分析下源码: public static boolean isNumeric(String str) { if (str == null) { return false; } int sz = str.length(); for (int i = 0; i < sz; i++) { if (Character.isDigit(str.charAt(i)) == false) { return false; } } return true; }

  • 04

    源码中判断是否数字的依据是JDK的API: java.lang.Character.isDigit(str.charAt(i)) 看看个API的源码: public static boolean isDigit(char ch) { return isDigit((int)ch); }

  • 05

    看看isDigit(int codePoint)的源码: public static boolean isDigit(int codePoint) { boolean bDigit = false; if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX) { bDigit = CharacterDataLatin1.isDigit(codePoint); } else { int plane = getPlane(codePoint); switch(plane) { case(0): bDigit = CharacterData00.isDigit(codePoint); break; case(1): bDigit = CharacterData01.isDigit(codePoint); break; case(2): bDigit = CharacterData02.isDigit(codePoint); break; case(3): // Undefined case(4): // Undefined case(5): // Undefined case(6): // Undefined case(7): // Undefined case(8): // Undefined case(9): // Undefined case(10): // Undefined case(11): // Undefined case(12): // Undefined case(13): // Undefined bDigit = CharacterDataUndefined.isDigit(codePoint); break; case(14): bDigit = CharacterData0E.isDigit(codePoint); break; case(15): // Private Use case(16): // Private Use bDigit = CharacterDataPrivateUse.isDigit(codePoint); break; default: // the argument's plane is invalid, and thus is an invalid codepoint // bDigit remains false; break; } } return bDigit; }

  • 06

    下面还有更深的调用,貌似还涉及到ASCII码了。 水太深,就不继续看了。 有一点是肯定的,这个API不是通过类似Regex expression的方式来判断是数字,而通过每个字符的ASCII的值类确定的 回到API的isNumeric(String str), 看看Doc是怎么说的: /** * <p>Checks if the String contains only unicode digits. * A decimal point is not a unicode digit and returns false.</p> * * <p><code>null</code> will return <code>false</code>. * An empty String (length()=0) will return <code>true</code>.</p> * * <pre> * StringUtils.isNumeric(null)   = false * StringUtils.isNumeric("")     = true * StringUtils.isNumeric("  ")   = false * StringUtils.isNumeric("123")  = true * StringUtils.isNumeric("12 3") = false * StringUtils.isNumeric("ab2c") = false * StringUtils.isNumeric("12-3") = false * StringUtils.isNumeric("12.3") = false * </pre> * * @param str  the String to check, may be null * @return <code>true</code> if only contains digits, and is non-null */

  • 07

    看完上面的Doc,感觉水好深。 这个API的方法名直接命名为isInt不就完了。方法名很容易误导人 这也是给开发的tx敲了一个警钟, api使用之前一定要确认清楚,至少看看Doc文档吧

(0)

相关推荐

  • 怎么在微信中添加喜欢的图片到表情包中

    有的小伙伴在使用微信软件聊天时,好友发了一张图片,接着想要将该图片添加到表情包中,但是却发现长按表情,并没有找到添加表情功能,也不知道该如何添加该图片为表情包,那么小编就来为大家介绍一下吧.具体如下: ...

  • 和包中的联系人怎么删除?

    和包可以添加联系人是方便用户在充值话费或者其他缴费时直接选择联系人即可,当用户在查看联系人时发现有些联系人的号码都过期没用了便想要删除联系人,该如何删除呢?今天小编就教大家和包中的联系人怎么删除的方法 ...

  • Win8.1系统无法安装语言包怎么解决 win8.1不能安装语言包的解决方法

    有时候在重装完win8.1系统后,系统是英文版,这个时候我们就得下载语言包进行语言替换了,但是在Win8.1系统中,有时候会出现无法安装语言包的情况,那么遇到这个问题该怎么办呢?还不知道的小伙伴就一起 ...

  • 微信表情包怎么调整顺序?微信表情包整理排序方法

    不管是手机微信,还是在Windows系统上的电脑版微信,随着最近更新可以在电脑微信添加表情之,更重要的事情是可以调整.想想如果你一口气添加了那么多表情,总有几个是常用的吧,如果那些常用的表情却添加到最 ...

  • TWRP恢复包的使用方法

    在我们的日常生活中,往往会遇到TWRP恢复包的使用方法的问题,常常会不知道怎么处理,下面就让小编为大家提供一下解决这种问题的方法,希望能够给大家提供一定的帮助. 操作方法 01 首先,进入recove ...

  • linux系统下将php和mysql命令加入到环境变量中的方法

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行 “php -v”命令查看当前php版本信息时时 ...

  • Word2013中将错误拼写添加到词典中的方法

    在Word2013文档中经常会出现标有红色波浪线的单词,这些单词或者是拼写错误,或者是被Word2013误判断为拼写错误。如果是一些简写词或者具有特殊用法的单词(例如LI Yuchun),则常常被误判 ...

  • 在 Wireshark 抓包中显示 snmp mib 名

    Wireshark 是最富盛名的开源抓包工具了,在电信网管开发的日常工作中是不可或缺的,经常需要抓包分析。那有没有办法可以在抓到的包中直接显示 snmp mib 的名字,而不是 OID 呢?办法当然是 ...

  • 战网卡在"战网开启中"解决方法

    战网卡在"战网开启中"解决方法 1.请确保已开启Secondary Logon服务; 2.请尝试删除Battle.net文件夹; 损坏的Battle.net文件夹可能会导致技术问题 ...