Java 在这种情况下,为什么subpath()抛出IllegaArgumentException?

Java 在这种情况下,为什么subpath()抛出IllegaArgumentException?,java,directory,illegalargumentexception,Java,Directory,Illegalargumentexception,我正在编写一个文件夹同步应用程序。我有两个dir结构,Source和Target,当通过另一个dir结构递归时,我需要以某种方式引用另一个dir结构中的eqivalent文件/文件夹。此方法试图通过首先提取源中文件的子位置来实现这一点,方法是将用户先前选择并存储为全局变量的根文件夹清除,然后将其附加到目标的根文件夹,该根文件夹也是用户选择并全局存储的。为什么这不起作用?争论似乎很好;从sourcePath的长度到最后一个元素的索引 private Path getEquivalentFileIn

我正在编写一个文件夹同步应用程序。我有两个dir结构,Source和Target,当通过另一个dir结构递归时,我需要以某种方式引用另一个dir结构中的eqivalent文件/文件夹。此方法试图通过首先提取源中文件的子位置来实现这一点,方法是将用户先前选择并存储为全局变量的根文件夹清除,然后将其附加到目标的根文件夹,该根文件夹也是用户选择并全局存储的。为什么这不起作用?争论似乎很好;从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

subpath
方法的第二个参数必须是严格大于第一个参数的数字,因为它是subpath元素的索引。在任何情况下都不允许出现负面影响

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

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

subpath
方法的第二个参数必须是严格大于第一个参数的数字,因为它是subpath元素的索引。在任何情况下都不允许出现负面影响

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

Path sourceSublocation = pathOfSource.subpath(0, sourcePath.getNameCount()-1);
发件人:

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

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

由于
endIndex
必须大于
beginIndex
beginIndex
必须大于零,因此
endIndex
也必须大于零,并且您从以下位置通过了-1

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

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


由于
endIndex
必须大于
beginIndex
beginIndex
必须大于零,因此
endIndex
也必须大于零,并且您通过了-1

您误用了
Path

现在,我不知道您的不同
路径是否由不同的文件系统提供商发布,但如果不是,您可以这样做:

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

如果
子路径
是空路径(这是
sourceRoot.relatize(sourceRoot)
将返回的路径),这也会起作用。

您误用了
路径

现在,我不知道您的不同
路径是否由不同的文件系统提供商发布,但如果不是,您可以这样做:

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

如果
子路径
是空路径(这就是
sourceRoot.relatize(sourceRoot)
将返回的路径)。

“距离根最远的名称的索引计数为-1”,所以“计数”就是这个意思。。。好了,就这样浏览文档而不是彻底阅读文档并确保我理解每个单词。“离根最远的名称有索引count-1”,所以这就是“count”的意思。。。好了,我只需要浏览一下文档,而不是彻底阅读文档并确保我理解每一个单词就够了。你为什么要在那里使用“final”呢?纯粹的编码习惯;如果一个变量被声明为final,我知道它不能在作用域中的任何其他地方重新分配。为什么在那里使用final?纯粹的编码习惯;如果一个变量被声明为final,我知道它不能被重新分配到范围中的任何其他地方