gpt4 book ai didi

java.lang.NoSuchMethodError :java. io.ByteArrayOutputStream.toString

转载 作者:行者123 更新时间:2023-12-03 08:28:30 24 4
gpt4 key购买 nike

我用gradle做了一个java程序。我的计算机上有 jdk 15,但在我放入的 gradle 文件中:

sourceCompatibility = 1.8
targetCompatibility = 1.8

因此它可以与 java 8 一起运行。

我将 jar 文件发送给使用 java 8 的人,它工作得很好。在我的计算机上,它与 java 8 和 java 15 完美配合。

我将 jar 文件发送给另一个人,他收到以下错误:

[ERROR)Exceptioninthread'Thread-7"java.lang.NoSuchMethodError:java.io.ByteArrayOutputStream.toString(Ljava/nio/charset/Charset;)Ljava/lang/String;
[ERROR) at fr.bloomenetwork.fatestaynight.packager.Utils.docxToKsFile(Utils.java:84)
[ERROR) at fr.bloomenetwork.fatestaynight.packager.FetchingThread.run(FetchingThread.java:197)
[ERROR) at java.lang.Thread.run(UnknownSource)

如果它对我和其他人都有效,我不明白为什么他会收到此错误。

这是引发错误的代码:

public static void docxToKsFile(InputStream is, String filename) throws IOException {
ZipInputStream zis = new ZipInputStream(is);
ByteArrayOutputStream fos = new ByteArrayOutputStream();
ZipEntry ze = null;
String xmlContent = null;
while ((ze = zis.getNextEntry()) != null) {
if (ze.getName().equals("word/document.xml")) {
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int len;
while ((len = zis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
xmlContent = new String(fos.toString(StandardCharsets.UTF_8)); //Here is line 84
fos.close();
break;
}
}
fos.close();
String txtContent = xmlContent.replaceAll("</w:p>", "\n");
txtContent = txtContent.replaceAll("<[^>]*/?>", "");
txtContent = txtContent.replaceAll("&amp;", "&");
txtContent = txtContent.replaceAll("&quot;", "\"");
java.nio.file.Files.write(Paths.get(filename), txtContent.getBytes(StandardCharsets.UTF_8));
}

最佳答案

根据 javadoc of ByteArrayOutputStream's toString(Charset) method ,它是在Java10中添加的,因此在JDK8上不可用。

sourceCompatibility = 1.8
targetCompatibility = 1.8

so it can run with java 8.

不是这个意思。这仅意味着源文件是使用 java 语言的 JDK8 思想进行编译的,并且生成的类文件采用 JDK8 格式。它不能保证您只使用 JDK8 理念的核心库。这些 gradle 选项相当于 javac--source 的 gradle 选项。 --target 选项。

这些是错误的选项。

使用 javac,现在有一个 --release 选项(在...我认为是 JDK8 中引入的?),它涵盖了源和目标兼容性,甚至警告尝试使用核心库调用不在声明的版本中。让我们尝试一下,使用我的机器上碰巧安装的 JDK14(但也应该适用于 JDK11):

echo "class Test {{ new java.io.ByteArrayOutputStream().toString(java.nio.charset.StandardCharsets.UTF_8); }}" > Test.java
javac -version
> javac 14.0.1
javac --release 8 Test.java
> Test.java:1: error: no suitable method found for toString(Charset)
javac --release 11 Test.java
> [no message; it compiles fine]

根据 current gradle docssourceCompatibilitytargetCompatibility已弃用,不应再使用。请改用 options.release = 8,它是 --release 选项的 gradle 变体。耶!

注意:.toString("UTF-8") 很难看,但确实有效;它是在java8之前引入的。

NB2:

On my computer, it works perfectly fine with java 8 and java 15.

不。您没有在计算机上的 java8 上运行它。如果你这样做了,应用程序将会失败并出现同样的错误。一定是不小心用错了:P

关于java.lang.NoSuchMethodError :java. io.ByteArrayOutputStream.toString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65915184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com