我在运行时遇到了奇怪的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"
(没有点)
答案 0 :(得分:1)
从我所看到的,它看起来像你的子串中的一个错误。您想要做的是封装,但不包括期间索引点的位置,因为那也包括子串中的句点。
简单更改:从子字符串操作中删除+ 1
。
或者,使用Java 8,可以使用StringJoiner
和String#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());