奇怪的Java行为

时间:2016-03-19 07:24:10

标签: java

我在运行时遇到了奇怪的java行为。所有信息都在截图上。 我的申请失败了。令人惊讶的是,在不同时间使用相同的输入数据,可以正确处理。你能解释一下这种奇怪行为的原因是什么吗?我用的是jdk 1.7.0_79 这里是完整的代码部分id = "common.dto.IdsFilter"

    private String[] splitPackageAndNameParts(String id) {
    // check string not empty
    if (StringUtils.isEmpty(id)) {
        throw new IllegalArgumentException("Unexpected id : " + id);
    }

    // get last point index
    int index = id.lastIndexOf(".");

    // check index
    if (index == 0 || index >= (id.length() - 1)) {
        throw new IllegalArgumentException("Unexpected id : " + id);
    }

    // split
    String pkgPart = index < 0 ? "" : id.substring(0, index + 1);
    String namePart = id.substring(index + 1, id.length());

    // return result
    return new String[]{pkgPart, namePart};
}

正确的结果应该是pkgPart = "common.dto.",但在运行时它返回"common.dto"(没有点)

enter image description here

1 个答案:

答案 0 :(得分:1)

从我所看到的,它看起来像你的子串中的一个错误。您想要做的是封装,但不包括期间索引点的位置,因为那也包括子串中的句点。

简单更改:从子字符串操作中删除+ 1

或者,使用Java 8,可以使用StringJoinerString#split更清晰地执行此操作。这将为您提供第一个元素;第二个元素只是拆分集合中的最后一个元素。

String[] split = pkg.split("\\.");
final StringJoiner stringJoiner = new StringJoiner(".");
for(int i = 0; i < split.length - 1; i++) {
    stringJoiner.add(split[i]);
}
System.out.println(stringJoiner.toString());