Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Java 正在引发空指针异常_Java_Dependency Injection_Guice - Fatal编程技术网

Java 正在引发空指针异常

Java 正在引发空指针异常,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正在努力学习谷歌果汁。我有一个InstallConfigurationModule类,它具有创建typeA和TypeB对象所需的所有依赖项。并且,得到了一个类,如下图所示的class Car,我正在尝试进行构造函数注入。当调用run方法时,我在system.out.println行中得到空指针异常。我确信ModuleA,ModuleB在我的 InstallConfigurationModulemodule,如果我说Bind(TypeA.class)或Bind(TypeB.class),我会得到

我正在努力学习谷歌果汁。我有一个InstallConfigurationModule类,它具有创建typeA和TypeB对象所需的所有依赖项。并且,得到了一个类,如下图所示的class Car,我正在尝试进行构造函数注入。当调用run方法时,我在system.out.println行中得到空指针异常。我确信ModuleA,ModuleB在我的 InstallConfigurationModulemodule,如果我说Bind(TypeA.class)或Bind(TypeB.class),我会得到google juice错误,“到TypeA或TypeB的绑定已经配置”

public class InstallConfigurationModule extends AbstractModule {

@Override
    protected void configure() {
        install(new ModuleA());
        install(new ModuleB());
    }
}
public class Car

{
  private Type A;
  private Type B;

@inject
  void SetCar(Type A, Type B)//not the constructor
 {
   this.A=A;
   this.B=B;
}

private void run()
{
  System.out.println(A.toString()) //throw null pointer exception
}
工作内容:

private void run()
    { 
     Injector injector = Guice.createInjector(new 
                         InstallConfigurationModule());

    TypeA typeA =injector.getInstance(TypeA.class);
      System.out.println(A.toString()) //works fine

    }
为什么当我尝试不使用creatingInjector时会得到NPE。谢谢你的帮助


PS:非常新的果汁。

让我们假设我们有以下组件:

  • 类接口
  • 接口实现
  • 配置模块
它不使用安装方法,但您可以使用它;configure方法使用Names.named API将TypeImpl标记为“a”,将另一个标记为“b”

我们必须将@Named和@Inject注释放在Car类中

import com.google.inject.name.Named;

import javax.inject.Inject;

public class Car {
    private Type a;
    private Type b;

    @Inject
    public void setA(@Named("a") Type a) {
        this.a = a;
    }

    @Inject
    public void setB(@Named("b") Type b) {
        this.b = b;
    }

    public void methodIsCalled(){
        run();
    }

    private void run() {
        System.out.println(a.toString());
        System.out.println(b.toString());
    }
}
因此,注入器将知道如何配置类型实例

最后,在main或configuration类中,我们有以下语句

public class MainClass {
    public static void main(String[] args){
        Injector injector = Guice.createInjector(new InstallConfigurationModule());
        Car car = injector.getInstance(Car.class);

        // method that it calss the run method
        car.methodIsCalled();
    }
}
这是输出

a
b

谢谢你的回复。当我使用安装模块时,它知道如何构造ObjectA,ObjectB right?。另外,假设我不需要从main调用Car类的某些方法。我还应该为汽车创建喷油器实例吗?。我不明白我缺少什么来获得NPE有什么意义。这是我的荣幸。是的,框架知道如何在为模块充电时构建新实例。Injector实例是必需的,但它取决于您正在创建的应用程序。注入器创建类的实例,解析注释并初始化类中的字段;如果没有喷油器,则类为空。
import com.google.inject.name.Named;

import javax.inject.Inject;

public class Car {
    private Type a;
    private Type b;

    @Inject
    public void setA(@Named("a") Type a) {
        this.a = a;
    }

    @Inject
    public void setB(@Named("b") Type b) {
        this.b = b;
    }

    public void methodIsCalled(){
        run();
    }

    private void run() {
        System.out.println(a.toString());
        System.out.println(b.toString());
    }
}
public class MainClass {
    public static void main(String[] args){
        Injector injector = Guice.createInjector(new InstallConfigurationModule());
        Car car = injector.getInstance(Car.class);

        // method that it calss the run method
        car.methodIsCalled();
    }
}
a
b