解码路径后,URL代码就会停止,或者看起来如此

时间:2014-05-30 13:45:57

标签: java path

我尝试将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()

有谁知道这里发生了什么?

2 个答案:

答案 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);