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

java.lang.NoSuchMethodError:java.io.ByteArrayOutputStream.toString,java,Java,我用gradle做了一个java程序。我的电脑上有jdk 15,但在gradle文件中我放了: sourceCompatibility = 1.8 targetCompatibility = 1.8 因此,它可以与Java8一起运行 我将jar文件发送给使用Java8的人,它工作得非常好。在我的计算机上,它与Java8和Java15一起工作得非常好 我将jar文件发送给另一个人,他收到以下错误: [ERROR)Exceptioninthread'Thread-7"java.lang.

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

sourceCompatibility = 1.8
targetCompatibility = 1.8
因此,它可以与Java8一起运行

我将jar文件发送给使用Java8的人,它工作得非常好。在我的计算机上,它与Java8和Java15一起工作得非常好

我将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)
我不明白为什么他会犯这样的错误,如果这对我和其他人都适用的话

以下是引发错误的代码:

公共静态void docxToKsFile(InputStream为,字符串文件名)引发IOException{
ZipInputStream zis=新的ZipInputStream(is);
ByteArrayOutputStream fos=新建ByteArrayOutputStream();
ZipEntry ze=null;
字符串xmlContent=null;
而((ze=zis.getNextEntry())!=null){
if(ze.getName().equals(“word/document.xml”)){
字节[]缓冲区=新字节[默认缓冲区大小];
内伦;
而((len=zis.read(buffer))!=-1){
fos.写入(缓冲区,0,len);
}
xmlContent=新字符串(fos.toString(StandardCharsets.UTF_8));//这是第84行
fos.close();
打破
}
}
fos.close();
字符串txtContent=xmlContent.replaceAll(“,”\n”);
txtContent=txtContent.replaceAll(“]*/?>”,“”);
txtContent=txtContent.replaceAll(“&;”、“&”);
txtContent=txtContent.replaceAll(“”,“\”);
write(path.get(filename),txtContent.getBytes(StandardCharsets.utf8));
}
根据,它是在Java10中添加的,因此在JDK8上不可用

因此,它可以与Java8一起运行

那不是什么意思。这仅仅意味着源文件是使用java语言的JDK8思想编译的,并且生成的类文件是JDK8格式的。它不能保证您只使用核心库的JDK8思想。这些gradle选项相当于
javac
--source
resp<代码>--目标选项

这些都是错误的选择

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

根据,
sourceCompatibility
targetCompatibility
已弃用,不应再使用。改用
options.release=8
,这是
--release
选项的渐变变量。耶

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

NB2:

在我的计算机上,它与Java8和Java15一起工作得非常好

没有。你没有在你的机器上的java8上运行它。如果你有,应用程序也会以同样的错误失败。一定是不小心用错了:你试过这个吗

xmlContent =  new String(fos.toByteArray(), "UTF-8");

这可能是个愚蠢的问题。这是不是另一个人检查了他是否也在使用Java8或更高版本?确保你们所有人都在Java8上运行它。根据
ByteArrayOutputStream#toString(java.nio.charset.charset)
方法是在Java10中引入的。他正在运行Java15。奇怪的是,你的评论让你的问题变得不清楚。您是否尝试在Java15、Java8或两者上运行它?你的朋友是在Java8还是Java15上运行它的?我试着在这两个版本上运行它,但它在Java8上不起作用。我的朋友运行Java15,但它不工作。你是对的。我没有看到这种方法只适用于JDK10。但奇怪的是,能够运行jar文件的人正在使用java 8,而不能运行jar文件的人正在运行java 15。他在不知情的情况下使用Java8,因为他有两个版本。感谢gradle中的建议。感谢您,它同时适用于jdk 8和jdk 15。
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]
xmlContent =  new String(fos.toByteArray(), "UTF-8");