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