当前位置: 首页 > 知识库问答 >
问题:

自动投掷空指针[重复]

姚煜
2023-03-14

我得到一个空指针异常,而自动布线我的类之一。

我尝试过使用不同的注释,比如@Component@ComponentScan

public class ClassA {
    public final String str = "String";

    public ClassA(){
        System.out.println("Class A initiated");
    }
}


public class ClassB {

    @Autowired
    public ClassA classA;

    public ClassB(){
     System.out.println(classA.str);
    }


}

@Configuration
public class Config {

    @Bean
    public ClassA classA(){
        return new ClassA();
    }

    @Bean
    public ClassB classB(){
        return new ClassB();
    }
}

Stacktrace:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'classB' defined in class path resource [com/test/demo/Config.class]: Bean instantiation via factory method failed;
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.test.demo.ClassB]: Factory method 'classB' threw exception; nested exception is java.lang.NullPointerException

共有3个答案

秦诚
2023-03-14

如果您希望在构造函数本身中提取值,可以使用构造函数注入而不是字段注入,例如:

public class ClassB {
    public ClassA classA;

    @Autowired
    public ClassB(ClassA classA){
     this.classA = classA;
     System.out.println(classA.str);
    }
}

从Spring 4.3开始,具有单个构造函数的类可以省略@autowed注释。Spring在进行包扫描时会遇到我们的ClassB类,并通过调用带注释的构造函数来初始化它的实例。

在代码中,自动连接发生在调用no args构造函数之后。因此,当您尝试使用classA对象访问“str”时,会导致空指针异常,因为classA尚未自动连接。

丁鸿信
2023-03-14

构造函数在Spring注入自动连接字段之前运行,因此classA字段仍然为空。

将代码移到构造函数(和字段初始值设定项)之外,就会看到正确的值。

云宜人
2023-03-14

而不是使用@autowmed。通过ClassB的构造函数注入ClassA。

public class ClassB {
private final ClassA classA;

public ClassB(ClassA classA){
     this.classA = classA;
     System.out.println(classA.str);
}

然后将ClassB的Bean配置更改为使用ClassA。

 类似资料:
  • 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位编译器指针大小为4字节,64位编译器指针大小为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。 int a = 100; int *p; p = a; //把a的值赋值给指针变量p

  • 问题内容: 我正在学习Spring,在尝试建立一个相对基本的Spring项目时遇到了一些问题。我正在创建一个应用程序以简单地从数据库中读取数据,但是我在自动装配方面遇到问题,或者缺少该问题。我的类在方法中引发了空指针异常,因为尚未初始化变量。有人可以在这里指出正确的方向吗? 应用程序类 CustomerService.class GetCustomerEvent.class 问题答案: 您没有初始

  • 有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出? 我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。 然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗

  • 问题内容: 我正在尝试启动一个IntentService。当我这样做时,它会吐出: 我已经用谷歌搜索过,并查看了尽可能多的类似StackOverflow问题。但是,有一些细微的区别,我无法解决。首先,没有任何异常引用我的类。其次,通过更改上下文或再次检查以确保其不为null来解决类似的问题。 我有代码来检查情况并非如此: 我的IntentService是根据Google文档建模的。只是一个带有on

  • 我在活动onCreate()中初始化列表,如下所示: 编辑:我的活动的launchmode是SingleTask 编辑2: 我无法发送更多有用的日志,因为这次崩溃是在生产中。我只有一些布料日志。 谢谢你的帮助,但我不能粘贴整个代码,因为隐私。 我想我在SingleTask-OnCreate-OnNewIntent用法上有问题。简单地说,我试图打开我的应用程序从通知与参数决定哪个片段将打开时,用户导

  • 本文向大家介绍Java自动拆箱空指针异常的解决,包括了Java自动拆箱空指针异常的解决的使用技巧和注意事项,需要的朋友参考一下 公司搬迁,临时充当装修工,提前两个小时到公司忙着拆卸设备。结果接到客户反映,某部分功能偶尔不能用。于是参与救火,与写这段代码的小伙伴一起排查原因。 最终发现导致业务偶尔不能使用是由Long类型自动拆箱导致空指针异常引起的。下面就带大家分析一下Java中基础类型的包装类在拆