为什么subpath()会抛出IllegaArgumentException?

时间:2015-12-14 14:41:39

标签: java directory illegalargumentexception

我正在为文件夹同步编写应用程序。我有两个目录结构,Source和Target,我需要以某种方式引用另一个dir结构中的eqivalent文件/文件夹。此方法首先通过首先提取用户先前选择并存储为全局变量的根文件夹来提取Source中文件的子位置,然后将其附加到Target的根文件夹(同样是用户)来实现此目的。全局选择和存储。为什么这不起作用?争论似乎很好;从sourcePath的长度到最后一个元素的索引。

private Path getEquivalentFileInTarget(Path pathOfSource) {
    Path sourceSublocation = pathOfSource.subpath(sourcePath.getNameCount(), -1);
    return targetPath.resolve(sourceSublocation);
}

错误日志:

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 48 more
Caused by: java.lang.IllegalArgumentException
    at sun.nio.fs.WindowsPath.subpath(WindowsPath.java:634)
    at sun.nio.fs.WindowsPath.subpath(WindowsPath.java:44)
    at sample.FolderSyncerMainWindowController.getEquivalentFileInTarget(FolderSyncerMainWindowController.java:133)
    at sample.FolderSyncerMainWindowController.putInTreeViewCompare(FolderSyncerMainWindowController.java:120)
    at sample.FolderSyncerMainWindowController.handleCompareButton(FolderSyncerMainWindowController.java:92)
... 58 more

3 个答案:

答案 0 :(得分:1)

subpath方法的第二个参数必须是一个严格大于第一个参数的数字,因为它是子路径元素的索引。没有任何情况会被允许为负面。

您应该从计数中减去1,如下所示:

Path sourceSublocation = pathOfSource.subpath(0, sourcePath.getNameCount()-1);

答案 1 :(得分:1)

来自the documentation website

Path subpath(int beginIndex,
           int endIndex)
  

参数:beginIndex - 第一个元素的索引,   inclusiveendIndex - 最后一个元素的索引,独占

     

抛出:IllegalArgumentException - 如果beginIndex为负数,或者   大于或等于元素的数量。如果endIndex较少   大于或等于beginIndex,或大于    元素的数量。

且由于endIndex必须大于beginIndexbeginIndex必须大于零,因此endIndex也必须大于零且您传递-1 < / p>

答案 2 :(得分:1)

您滥用Path

现在,我不知道您的不同Path是否来自不同的文件系统提供商,但如果它们不是您可以这样做:

final Path subpath = sourceRoot.relativize(fullPathInSource);
final Path fullPathInTarget = targetRoot.resolve(subpath);

如果subpath为空路径(这是sourceRoot.relativize(sourceRoot)将返回的内容),这也会有效。