我尝试将path
放到我班级所在的目录中。这很好用。但我想像这样编辑这条路径。例如:
走这条道路:
/C:/User/Folder1/bin/
我想改变上述路径:
C:\\User\\Folder1\\bin\\
现在,我已经编写了这段代码来实现这个目标:
path = StartUp.class.getProtectionDomain().getCodeSource().getLocation().getPath();
decodedPath = URLDecoder.decode(path, "UTF-8");
System.out.println(path);
System.out.println(decodedPath);
pathArray = decodedPath.split("/");
pathLength = pathArray.length;
int x = 1;
while(x <= pathLength){
goodPath = goodPath + pathArray[x] + "\\";
x++;
}
System.out.println("goodPath " + goodPath);
System.out.println(decodedPath);
我认为这会实现它,但我得到的所有输出都是:
/C:/User/Folder1/bin/
/C:/User/Folder1/bin/
5
出于某种原因,它会显示pathArray
中的元素数量并跳过最后两个System.out.println()
。
有谁知道这里发生了什么?
答案 0 :(得分:1)
这是因为数组超出了绑定异常。
更改
while(x <= pathLength){
与
while(x < pathLength){
在Java数组中,索引从零开始,因此如果数组长度为L
,则数组中的最后一项具有索引L-1
。因此,在您的情况下,您必须循环untile x
严格小于pathLength
(您的数组的长度),并且不小于或等于。否则,在最后一次迭代中,变量x
采用pathLength
的值,您将访问数组边界的内存位置。
另外一个注释是你用x=1
开始循环,在这种情况下这是正确的,因为你的原始字符串以字符/
开头,然后split函数创建一个数组,其中第一项(索引零)是一个空字符串,因此通过从索引1开始跳过它是正确的。
无论如何,我建议您也要查看正则表达式,或者更简单地使用类replace
的方法String
。
答案 1 :(得分:0)
使用像(?<!^)\\/
这样的正则表达式并删除第一个字符。无需手动删除每个正斜杠。或者反向放下第一个字符并替换正斜杠,例如。
String path = StartUp.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");
System.out.println(path);
System.out.println(decodedPath);
Pattern compile = Pattern.compile("\\/");
Matcher matcher = compile.matcher(decodedPath.substring(1));
String replaceAll = matcher.replaceAll("\\\\\\\\");
System.out.println(replaceAll);