【问题标题】:NoSuchMethodError JavaNoSuchMethodError Java
【发布时间】:2020-01-12 18:00:02
【问题描述】:

我收到此运行时错误,不知道如何解决:

java.lang.NoSucheMethodError: java.io.FileInputStream.transferTo(Ljava/io/OutputStream;)J

在使用从 FileInputStream 到 ZipOutputStream 的 transferTo 方法时会发生这种情况

FileInputStream fis = new FileInputStream(file);
    ZipEntry zipEntry = new ZipEntry(fileName);

    zos.putNextEntry(zipEntry);

    try {
        fis.transferTo(zos);
    } catch (NoSuchMethodError e) {
        e.printStackTrace();
    }

【问题讨论】:

    标签: java nosuchmethoderror


    【解决方案1】:

    简单:您针对 Java 9编译您的代码(因为该方法是随 java 9 添加的,您可以在 javadoc 中看到),但您似乎是针对较旧的java 运行时。

    该异常总是告诉您编译时使用的依赖项与运行时设置不匹配。仅此而已。

    【讨论】:

    • 现在我在 java 8 上,但从控制面板 java 没有找到其他版本。如何切换到 java 9?
    • 重点是:你编译的java类是从哪里来的?!再说一遍:编译的东西需要一个使用 java 9 添加的方法。你在 java 8 上运行它。我不知道你是如何将你的类组合在一起的,以及你的设置是什么样的。我只能告诉你是什么导致了你的问题。你如何解决你的设置,那是你的问题。因为您是设置的主人。
    • 这是我自己的程序,如果我在eclipse上运行它不会有任何问题
    • 我在 MacOs、Debian 和 Windows 上试过,问题只出现在后者
    • @antonio99 不确定您还在寻找什么。我向您解释了问题的根本原因。你应该做更多的研究 A) 了解你的 Eclipse 使用的 Java 版本(用于编译和运行,两个不同的方面)和 B) 你的 RUNTIME 环境是如何配置的。如前所述:问题是您正在运行使用带有 java 8 JRE 的 java 9 库的代码。您需要查看您的设置,并理解我告诉您的内容。但我不能为你这样做。研究这些主题取决于您自己,也许在某个时候会接受一些答案。
    【解决方案2】:

    出现NoSuchMethodError的多种原因

    1) java.lang.NoSuchMethodError 在程序试图调用一个不存在的类方法时被抛出。该方法可以是静态的,也可以是实例方法。

    2) 由于类名相同而发生冲突。例如,您的应用程序正在使用与您的具有相同完全限定类名的第三方 jar。所以如果类加载器从其他 jar 加载类,你会在运行时得到 java.lang.NoSuchMethodError。

    3) 编译时使用的 Jar 版本与运行时不同。例如,您的应用程序中的 MySQL jar 可能与 Tomcat lib 文件夹中的版本不同。由于 Java 类加载器首先查找 tomcat lib 文件夹 jar,因此如果在加载的类中找不到任何方法,则可能会出现 java.lang.NoSuchMethodError。

    【讨论】:

    • 期待我们谈论的是 java.io 基础包。这真的不应该来自任何应用程序 JAR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多