“线程中的异常”;螺纹-0“;java.lang.reflect.InAccessibleObject异常

“线程中的异常”;螺纹-0“;java.lang.reflect.InAccessibleObject异常,java,javafx,gson,accessible,reflect,Java,Javafx,Gson,Accessible,Reflect,尝试在我的java项目上运行服务器和客户端,该项目由CLI和GUI制作的boardgame组成。不幸的是,在添加用户名后,我出现了以下错误: Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics do

尝试在我的java项目上运行服务器和客户端,该项目由CLI和GUI制作的boardgame组成。不幸的是,在添加用户名后,我出现了以下错误:

Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics does not "opens javafx.scene.paint" to module gson
以下是全部错误:

Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics does not "opens javafx.scene.paint" to module gson
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:341)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
    at gson@2.8.5/com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:159)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:926)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:892)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:841)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:813)
    at project/controller.JsonUnwrapper.sendJson(JsonUnwrapper.java:99)
    at project/network.Socket.JsonRouterSocket.run(JsonRouterSocket.java:55)
    at java.base/java.lang.Thread.run(Thread.java:835)
javafx和GSON之间似乎存在冲突。有趣的是,我使用CLI(不需要javafx)而不是GUI来运行服务器和客户端。Gson应该会返回一些信息(包括颜色),但在调用时!我甚至没有执行一个应该返回一些oinfo的命令

可以使用RMI或套接字进行通信,但错误仍然存在于两者上


而且,这个项目是由我和另外两个人共同完成的。其中一个使用Linux,另一个使用Windows10(和我一样),但没有一个有这个问题

发生这种类型的错误是因为java 9中的模块化

错误表示gson模块希望使用反射访问类javafx.scene.paint.Color的字段。在Java8中,这很好,因为反射甚至可以用于将私有字段公开,但在使用Java9时,对refelction有一些新的限制,这些限制会导致类似这样的错误

正如前面所解释的,在Java9中,您不能使用反射来访问一种模块类型,而该类型的模块不是由该模块导出的,因此反射(如gson中使用的反射)将不再工作

此问题的解决方案可以是以下方法之一:

  • 使用Java8且不进行模块化(如果您的项目可能的话)
  • 使用命令行选项
    --addopens
    ,打开模块包,因此反射应该可以再次使用
  • module-info.java文件中打开模块(在您的情况下,这将不起作用,因为您无法访问javafx的module-info.java;刚才提到的是完整性)
  • 将库(javafx和gson)添加到类路径中,而不是MODULEPATH,这将导致一种兼容模式,在这种模式下也可以进行反射

因为您提到的另外两个开发人员没有这个问题,我假设他们使用Java8或将库放在类路径中,因为这只是项目设置中的一个更改,而不是代码中的更改。因此,这可以解释为什么只有你面临这个问题。

我们在远处能做的不多,是吗;)只是猜测一下:试试——添加打开的。。(与错误消息中的相同)将运行时参数设置为java!谢谢你的回复!问题是,我使用的是Java12:/这个问题可能发生在Java9和更高版本中。大多数解决方案也适用于Java12。