Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-如何使用Java单例对象_Java_Scala_Singleton_Sbt_Scala 2.11 - Fatal编程技术网

Scala-如何使用Java单例对象

Scala-如何使用Java单例对象,java,scala,singleton,sbt,scala-2.11,Java,Scala,Singleton,Sbt,Scala 2.11,我已经成功地将现有Java项目用于Scala项目,但在使用Java单例时遇到NoClassDefFoundError: public class SpecificUser extends BasicUser { private static SpecificUser INSTANCE = new SpecificUser(); protected SpecificUser() { } public static SpecificUser getInstance()

我已经成功地将现有Java项目用于Scala项目,但在使用Java单例时遇到NoClassDefFoundError:

public class SpecificUser extends BasicUser {

    private static SpecificUser INSTANCE = new SpecificUser();

    protected SpecificUser() { }

    public static SpecificUser getInstance() {
        return INSTANCE;
    }
    ...
}
下面是确切的错误:

play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class SpecificUser]]
    at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.5.jar:2.3.5]
    at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.5.jar:2.3.5]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:205) [play_2.11-2.3.5.jar:2.3.5]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:202) [play_2.11-2.3.5.jar:2.3.5]
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36) [scala-library-2.11.1.jar:na]
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class SpecificUser
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:523) ~[play_2.11-2.3.5.jar:2.3.5]
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) ~[play_2.11-2.3.5.jar:2.3.5]
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) ~[play_2.11-2.3.5.jar:2.3.5]
    at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.3.5.jar:2.3.5]
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:129) ~[play_2.11-2.3.5.jar:2.3.5]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class SpecificUser
    at controllers.UsersController$$anonfun$usersDatatable$1.apply(UsersController.scala:36) ~[classes/:na]
    at controllers.UsersController$$anonfun$usersDatatable$1.apply(UsersController.scala:34) ~[classes/:na]
    at controllers.security.Authentication$$anonfun$AuthenticatedAction$1.apply(AuthenticatedController.scala:21) ~[classes/:na]
    at controllers.security.Authentication$$anonfun$AuthenticatedAction$1.apply(AuthenticatedController.scala:19) ~[classes/:na]
    at play.api.mvc.ActionBuilder$$anonfun$apply$16.apply(Action.scala:433) ~[play_2.11-2.3.5.jar:2.3.5]
这些问题可能有助于确定在Scala中访问静态方法可能不可访问,但无助于确定可行的解决方案:

如何在Scala中使用我的单例对象

更新


我在使用的java依赖项目中创建了一个singleton,它工作得很好。问题是当singleton从BasicUser继承时,它位于我正在使用的另一个java依赖项项目中。

如果有问题的类具有静态字段,而这些字段的初始化由于异常而失败,则可能会发生NoClassDefFoundError。 查找时的问题是导致类初始化失败的异常不会显示在任何stacktrace或日志中。 在这种情况下,如果将所有静态字段的初始化移到静态初始值设定项,则会有所帮助。在这种情况下,您至少会得到一个stacktrace,它显示了有问题的字段。 即代替

class A {
  static B b = new B(....);
}
你写

class A {
    static B b;
    static {
        b=new B(...);
    }
}

确切的错误是什么?您如何编译和运行该项目?这是一个混合的Java/Scala项目,还是Java代码在依赖项中?我使用activator编译并运行该项目。它不是一个java/scala混合项目,java项目被用作scala Play项目的依赖项。请尝试使用java类中的相同配置。问题是,SpecificUser类在静态块中有异常(在超类中为on)。在调试模式下检查所有未捕获的异常。@AndrzejJozwik-尝试使用java类中的相同配置是什么意思?我将java类与它的原始配置一起使用。我曾尝试在调试模式下检查未捕获的异常,但问题是,当我尝试介入并使用getInstance()方法时,调试器会转到scala类文件,如Action.scala,然后播放Threads@jwill如果所有静态块的初始化成功完成,则类将加载到虚拟机。如果至少有一个失败,则不会加载该类。