使用Long.parseLong()面对奇怪的行为

时间:2016-05-05 11:56:14

标签: java android type-conversion

在尝试从字符串中提取数字时,我使用Long.parseLong()方法遇到了一种非常奇怪的行为。

字符串包含多个数字,但只有一个(我需要)在问号内,所以我使用正则表达式提取它,然后我尝试将15位数字解析成一个长变量:

    Pattern p = Pattern.compile("\"\\d+\"");
    Matcher m = p.matcher(myString);
    while (m.find()) {
        String var1 = m.group();
        var1 = var1.replace("\"", "");

        try {
            long var2 = Long.parseLong(var1);
            return var2;
        }
        catch (Exception e) {
            return -1L;
        }
    }
    return 0L;

虽然我希望它返回var2或抛出异常,但Long.parseLong(var1)之后调用的下一行是return 0L,我不明白为什么。我错过了什么吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我只是运行你的代码:

public static void main(String [] args) {
    String myString = "abc 350 \"123451234512345\"";
    System.out.println(doSth(myString));
}

public static long doSth(final String myString) {
    final Pattern p = Pattern.compile("\"\\d+\"");
    final Matcher m = p.matcher(myString);

    while (m.find()) {
        String var1 = m.group().replace("\"", "");

        try {
            return Long.parseLong(var1);
        } catch (Exception e) {
            return -1L;
        }
    }

    return 0L;
}

我得到了:

123451234512345

Process finished with exit code 0

这可能是与.classess文件相关的问题。尝试重建你的项目(mvn clean / gradle clean / find。-type f -name" * .class" -exec rm -rf {} \;)。

我认为你的.class文件与.java文件中的代码不匹配。

答案 1 :(得分:0)

在将返回部分从while(m.find())循环中取出时,代码按预期工作:

Pattern p = Pattern.compile("\"\\d+\"");
Matcher m = p.matcher(myString);
String var = "-1";
    while (m.find()) {
        var = m.group().replace("\"", "");
    }
return Long.parseLong(var);

我无法理解它,因为它在打印时没有返回,并且在g-t的例子中也可以在循环中工作。如果你愿意详细说明这个案例,我想读一读。