`
gjr2004
  • 浏览: 1167 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类

回复“主题:验证String是不是整数,用异常作判断怎么了!”

 
阅读更多
看了那帖子讨论的很激烈,也想说两句。

先说两句人人都知道的大道理,我认为任何事情都不能一概而论,一棍子打死,要具体问题具体分析,那篇帖子在没有任何背景条件下讨论“验证String是不是整数,用异常作判断”是否可行,争论不休,实在没多大意思。

首先,我先申明,大多数情况下我也不赞成用异常来判断正常逻辑,
但是,试想下面这种情况,用异常作判断String是不是整数是否反而比其他方法效率更高?

假设
1.我不仅要验证一个String是否是数字,还必须在它是数字的时候转成int型数据
2.我要验证的字符串是一个手机号码,这个字符串是其他系统传过来的(理论上其他系统对此字符串是否为数字已经做了验证),也就是说这个字符串不是数字的可能性几乎没有,即时有也很小,万分之一?十万分之一? 不管,为了自己系统的完整性,我还得再验证一遍。

这时,一种方法是,先用其他方法验证一下此字符串是否为数字,再将此字符串用parseInteger转成数字;
另一种方法是,不管三七二十一先用parseInteger转,顺便通过异常判断是否为数字。

我不说大家也应该知道那种方法快,而且应该快的不是一点点,因为异常几乎不会发生。

所以我认为,具体问题,具体分析,不能一概而论,人云亦云。
分享到:
评论
16 楼 qianhd 2011-01-09  
luckaway 写道
slaser 写道
luckaway 写道
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。




Unchecked Exception说明是软件bug?
谁TM规定的?


不一定就是程序的上bug,有可能资源、数据状态不正确引起的bug。我是没有看到那个JAVA规范里明确的说Unchecked Exception就一定是软件bug。我承认我有可能在误导大家

但是我希望你能举出一个例子,抛出Unchecked Exception不是一个bug的例子。



对于初级程序员或者愚笨的程序员来说
与其声明抛出checked exception, 让这帮兔崽子随便的catch一下, 不打印不处理压制异常.
还不如抛出unchecked exception. 然后再统一的处理一下.

跟他们说明白到底是继续throw 还是try catch. 还不如让他们好好做业务逻辑.对他们要隐藏他们不懂的东西.

虽然我也不是很喜欢这种方式,但是公司不是培训机构
15 楼 sydra 2011-01-09  
slaser 写道
luckaway 写道
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。




Unchecked Exception说明是软件bug?
谁TM规定的?

java确实有这样的规范,runtime exception就是软件问题
14 楼 chan.d 2011-01-09  
固执和执着,开发者的优点
13 楼 mawt 2011-01-09  
可以用正则,判断数字的个数是否等于字符串长度
12 楼 denger 2011-01-08  
Come from Apache-Lang (NumberUtils)

/**
     * <p>Checks whether the String a valid Java number.</p>
     *
     * <p>Valid numbers include hexadecimal marked with the <code>0x</code>
     * qualifier, scientific notation and numbers marked with a type
     * qualifier (e.g. 123L).</p>
     *
     * <p><code>Null</code> and empty String will return
     * <code>false</code>.</p>
     *
     * @param str  the <code>String</code> to check
     * @return <code>true</code> if the string is a correctly formatted number
     */
    public static boolean isNumber(String str) {
        if (StringUtils.isEmpty(str)) {
            return false;
        }
        char[] chars = str.toCharArray();
        int sz = chars.length;
        boolean hasExp = false;
        boolean hasDecPoint = false;
        boolean allowSigns = false;
        boolean foundDigit = false;
        // deal with any possible sign up front
        int start = (chars[0] == '-') ? 1 : 0;
        if (sz > start + 1) {
            if (chars[start] == '0' && chars[start + 1] == 'x') {
                int i = start + 2;
                if (i == sz) {
                    return false; // str == "0x"
                }
                // checking hex (it can't be anything else)
                for (; i < chars.length; i++) {
                    if ((chars[i] < '0' || chars[i] > '9')
                        && (chars[i] < 'a' || chars[i] > 'f')
                        && (chars[i] < 'A' || chars[i] > 'F')) {
                        return false;
                    }
                }
                return true;
            }
        }
        sz--; // don't want to loop to the last char, check it afterwords
              // for type qualifiers
        int i = start;
        // loop to the next to last char or to the last char if we need another digit to
        // make a valid number (e.g. chars[0..5] = "1234E")
        while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                foundDigit = true;
                allowSigns = false;

            } else if (chars[i] == '.') {
                if (hasDecPoint || hasExp) {
                    // two decimal points or dec in exponent   
                    return false;
                }
                hasDecPoint = true;
            } else if (chars[i] == 'e' || chars[i] == 'E') {
                // we've already taken care of hex.
                if (hasExp) {
                    // two E's
                    return false;
                }
                if (!foundDigit) {
                    return false;
                }
                hasExp = true;
                allowSigns = true;
            } else if (chars[i] == '+' || chars[i] == '-') {
                if (!allowSigns) {
                    return false;
                }
                allowSigns = false;
                foundDigit = false; // we need a digit after the E
            } else {
                return false;
            }
            i++;
        }
        if (i < chars.length) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                // no type qualifier, OK
                return true;
            }
            if (chars[i] == 'e' || chars[i] == 'E') {
                // can't have an E at the last byte
                return false;
            }
            if (!allowSigns
                && (chars[i] == 'd'
                    || chars[i] == 'D'
                    || chars[i] == 'f'
                    || chars[i] == 'F')) {
                return foundDigit;
            }
            if (chars[i] == 'l'
                || chars[i] == 'L') {
                // not allowing L with an exponent
                return foundDigit && !hasExp;
            }
            // last character is illegal
            return false;
        }
        // allowSigns is true iff the val ends in 'E'
        // found digit it to make sure weird stuff like '.' and '1E-' doesn't pass
        return !allowSigns && foundDigit;
    }
11 楼 zdmcjm 2011-01-08  
luckaway 写道
slaser 写道
luckaway 写道
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。




Unchecked Exception说明是软件bug?
谁TM规定的?


不一定就是程序的上bug,有可能资源、数据状态不正确引起的bug。我是没有看到那个JAVA规范里明确的说Unchecked Exception就一定是软件bug。我承认我有可能在误导大家

但是我希望你能举出一个例子,抛出Unchecked Exception不是一个bug的例子。


牛B的play!框架,算不算一个例子。
10 楼 davepkxxx 2011-01-08  
luckaway 写道
slaser 写道
luckaway 写道
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。




Unchecked Exception说明是软件bug?
谁TM规定的?


不一定就是程序的上bug,有可能资源、数据状态不正确引起的bug。我是没有看到那个JAVA规范里明确的说Unchecked Exception就一定是软件bug。我承认我有可能在误导大家

但是我希望你能举出一个例子,抛出Unchecked Exception不是一个bug的例子。


约定俗成很重要,不要特立独行嘛
9 楼 txlaijava 2011-01-08  
怎么弄?
异常判断也是一个办法.
8 楼 luckaway 2011-01-08  
slaser 写道
luckaway 写道
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。




Unchecked Exception说明是软件bug?
谁TM规定的?


不一定就是程序的上bug,有可能资源、数据状态不正确引起的bug。我是没有看到那个JAVA规范里明确的说Unchecked Exception就一定是软件bug。我承认我有可能在误导大家

但是我希望你能举出一个例子,抛出Unchecked Exception不是一个bug的例子。

7 楼 slaser 2011-01-08  
luckaway 写道
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。




Unchecked Exception说明是软件bug?
谁TM规定的?
6 楼 icanfly 2011-01-08  
"验证String是不是整数,用异常作判断怎么了!” 这个主题真是又臭又长啊,能不能不谈这个了,,,
5 楼 luckaway 2011-01-08  
这跟性能没关系,两种方式的功能也一样。


该情形,用异常做判断就不合适,Unchecked Exception说明是软件bug,要尽量避免的。
这是规范! 你就不要再固执了。

除非判断是否整形非常难于实现。



4 楼 hzwq 2011-01-08  
三人行,必有我师! 抱着学习交流的心态就好了
没有必要看贬别人,有意思吗?
3 楼 Reset 2011-01-07  
正则 (最小长度为5)
2 楼 gdpglc 2011-01-07  
昨天晚上,给客户做培训,其中就有人说java效率低,然后拿IBM的ITM的agent举例。想想很有意思:因为ITM的agent根本不是用java写的。在这世界上,找个理由太容易了...
1 楼 gdpglc 2011-01-07  
虽然我觉得你说的不对。但是不想多说这事了。你可能要被投隐藏了。当然,我不会这么做。很小的一件事,却需要仔给的思考和实践...

相关推荐

    std::string format格式化函数源代码及两种格式化方法

    通过这些测试,我们可以验证`format`函数是否能正确处理空字符串、包含占位符的字符串、以及不同类型的数据。 在C++中,有两种常见的字符串格式化方法: 1. **使用`std::stringstream`**:这是C++标准库提供的一个...

    详解Java判断是否是整数,小数或实数的正则表达式

    在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...

    delphi 判断字符串是否为整数.rar

    在本示例中,我们关注的是如何判断一个字符串是否表示一个整数。这个问题在处理用户输入或者解析数据时非常常见,因为用户可能会输入各种各样的值,包括整数、浮点数、非数字字符等。 Delphi 是一种基于 Pascal ...

    C ++ 17:string_view转换为整数类型

    在“C++ 17:string_view转换为整数类型”这一主题中,我们主要探讨如何使用Boost Spirit Qi库将`string_view`对象转换为整数类型。 Boost Spirit Qi是Boost库的一部分,它是一个强大的解析库,允许程序员用C++编写...

    C++中string类的使用说明(保姆级说明)

    ### C++中`std::string`类的使用详解 #### 一、引言 在C++编程语言中,`std::string`类是处理文本数据的核心工具之一。它提供了丰富的功能,使得字符串的操作变得简单而高效。本文将详细介绍`std::string`类中的...

    利用C++实现从std::string类型到bool型的转换

    在C++编程中,将`std::string`类型的值转换为`bool`类型有时是必要的,特别是在处理用户输入或者从配置文件读取布尔值时。本文将详细介绍如何使用C++来实现这种转换,并讨论其中的一些限制和解决方案。 首先,C++...

    判断输入整数含有多少个0

    在Python中,我们可以直接用内置的`str()`函数将整数转换为字符串,然后使用`count()`方法来计算"0"的出现次数。例如: ```python def count_zeros(num): return str(num).count('0') ``` **Java**: 在Java中,...

    简单的string类

    6. **比较字符串**:`compare()`方法可以进行字符串之间的比较,返回值可以用来判断字符串是否相等或大小关系。 7. **拷贝和赋值**:`copy()`用于将字符串的一部分拷贝到字符数组,`assign()`用于给字符串赋新值。 ...

    c++ String去除头尾空格的方法

    实现该功能可使用string的find_first_not_of,和find_last_not_of方法,具体实现带如下: 代码如下:#include #include &lt;string&gt; std::string& trim(std::string &); int main() { std::string s = ” Hello World!! ...

    解决dbf Failed to parse Number: For input string: "-.---"

    首先,"Failed to parse Number: For input string: "-.---""”是一个典型的Java解析异常,通常发生在尝试将字符串转换为数值类型(如整数或浮点数)时,而该字符串不能被成功解析。在这种情况下,“-.---”是一个...

    c++string类源码

    `std::string` 提供了`assign()`函数来改变字符串的值,它可以接受一个字符数组、另一个`std::string`对象或者一个整数值(表示重复某个字符的次数)。 ```cpp std::string str; str.assign("New Value"); // ...

    java.lang.NumberFormatException For inputstring 4294967295处理方法

    在Java编程中,`java.lang.NumberFormatException`是一个常见的运行时异常,它通常发生在尝试将一个字符串转换为数值类型(如int、long、float或double)时,但该字符串无法被解析为有效的数值。"For input string: ...

    StringAPI.java

    boolean isEmpty():判断是否是空字符串:return value.length == 0 String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写 String toUpperCase():使用默认语言环境,将 String 中的所有...

    STL string详解

    8. **异常安全**:`std::string`设计时考虑了异常安全,这意味着在发生异常时,它会保持内部状态的正确性,避免内存泄漏。 9. **多态性与模板**:由于`std::string`是模板类的一个实例,因此它能够与其他STL组件...

    cPP-string--.rar_c string_doc_string stl

    这篇文档“c++中的string用法(一) .doc”将深入探讨`std::string`的使用方法,帮助程序员更有效地管理字符串数据。 1. **`std::string`的定义** `std::string`是一个类模板,用于存储、操作和操作Unicode或ASCII...

    十六进制字符串到浮点数,整型的相互转换源代码(qt+vc2010)

    在C++中,我们可以使用`std::stringstream`或者`std::stoi`函数配合基数参数进行转换。例如: ```cpp #include #include int hexStrToInt(std::string hexStr) { std::stringstream ss; int value; ss &lt;&lt; std...

    C++读写ini配置文件

    - 使用`std::ifstream`打开ini文件,逐行读取,根据行首的`[`判断是否开始新的节,根据等号`=`判断是否为键值对。 - 将读取到的节和键值对适当地插入到数据结构中。 2. **写入配置文件**: - 写入时,同样需要...

    StdString类代码,可完善替代CString字符串类

    5. **异常安全**:`StdString`可能包含了异常安全的编程实践,确保在异常发生时能正确地清理资源,避免内存泄漏。 6. **扩展功能**:除了基本的字符串操作,`StdString`可能还添加了一些实用的成员函数,如格式化...

    输入一个整数判断正负

    标题“输入一个整数判断正负”涉及到的是基础的编程逻辑,主要在JAVA语言环境下实现。这个任务的核心是编写一个程序,它能接收用户输入的一个整数,然后根据该整数的值判断它是正数、负数还是零。在JAVA中,我们可以...

    BigDecimal工具类.docx

    add方法有三种重载形式,分别是add(double,double)、add(String,String)和add(String,String,int)。第一个方法add(double,double)是将两个double类型的数相加,然后返回double类型的结果。第二个方法add(String,...

Global site tag (gtag.js) - Google Analytics