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

自动加载类方法的空指针异常

田巴英
2023-03-14

我是Apache Camel的新手,正在尝试构建api。它有三个类。

A类-这是为了读取下面application.properties文件

@Configuration
@ConfigurationProperties(prefix="api")
public class A{

private String username;

public String getUsername(){
    return username
}

B类-阿帕奇骆驼路线。

类C-Bean类,其中类A是自动连接的。

@Component
public class b extends RouteBuilder{
    @Autowired
    ClassC customC;

    public void configure{
        from("direct:start")
            .bean(customC)
            .to("log:first-timer")
    }
}

@Component
class C{
    @Autowired
    ClassA config;

    String username=config.getUsername();
}

每当IDE执行api时,它都会在行中抛出Null指针异常。getUsername() 。我已经验证了spring boot能够加载应用程序。属性。

我不确定为什么调用自动加载类的方法会抛出空指针异常。

共有1个答案

井洲
2023-03-14

问题出在你的C类中。

@Component
class C{
    @Autowired
    A config;

    String username = config.gtUsername();
}

Spring初始化期间的顺序如下:

  1. 创建C
    的实例(通过调用new C()
    此构造函数调用username=config.gtUsername()并使用NullPointerException失败,因为config仍然null
  2. 处理@Autowire
    (初始化您的config属性)
    但当然不会走到这一步,因为异常已经发生在步骤1中。

您可以通过从构造函数中删除用户名属性的初始化来解决这个问题,而不是将其放入一个单独的方法(我们称之为init())中,并用PostConstruct对其进行注释。另请参见Spring PostConstruct和PreDestroy注释。

@Component
class C{
    @Autowired
    A config;

    String username;
    
    @PostConstruct
    void init() {
        username = config.getUsername();
    }
}

然后,Spring初始化期间的顺序如下:

  1. 创建一个实例(通过调用新的C())
  2. 处理@Autowired
    (这将初始化您的配置属性)
  3. 调用带注释的方法
    (这将使用已初始化的配置属性初始化您的用户名属性)

解决问题的另一个更简单的方法是使用构造函数注入(正如@Ferry在他的评论中已经建议的那样):

您不依赖隐式默认构造函数,而是提供了一个@Autowared注释构造函数,它可以采用A config参数。此外:通过这样做,您将不再需要A config属性。

@Component
class C{ 
    String username;

    @Autowired
    C(A config) {
        username = config.getUsername();
    }
}

然后,Spring初始化期间的序列将如下所示:

  1. 处理@Autowire
    (通过调用new C(config)创建C的实例,其中config是之前在自动装配过程中创建的A实例)
    这使用构造函数接收到的config初始化您的用户名属性。
 类似资料:
  • 问题内容: 我正在学习Spring,在尝试建立一个相对基本的Spring项目时遇到了一些问题。我正在创建一个应用程序以简单地从数据库中读取数据,但是我在自动装配方面遇到问题,或者缺少该问题。我的类在方法中引发了空指针异常,因为尚未初始化变量。有人可以在这里指出正确的方向吗? 应用程序类 CustomerService.class GetCustomerEvent.class 问题答案: 您没有初始

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

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

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

  • 本文向大家介绍Java中避免空指针异常的方法,包括了Java中避免空指针异常的方法的使用技巧和注意事项,需要的朋友参考一下 没人会喜欢空指针异常!有什么方法可以避免它们吗?或许吧。。 本文将讨论到以下几种技术 1.Optional类型(Java 8中新引入的) 2.Objects类(Java 7中原有的) Java 8中的Optional类 它是什么? 1.Java 8中新引入的类型 2.它是作为

  • 问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于