IDEA:Caused by: java.lang.NullPointerException: inStream parameter is null

发生缘由

  • 学习如何抽取Jedis连接池工具类

环境

  • redis版本:redis-2.8.9
  • 导入的两个Jar包分别为:
    • commons-pool2-2.3.jar
    • jedis-2.7.0.jar
  • jdk版本:jdk-16.0.2
  • Idea版本:2021.2
  • 电脑系统:win10

问题描述

新建项目

创建一个JavaWeb项目:

  1. 新建一个Moudle。
  2. 右键Moudle名称,点击第二个选框Add frameworks Support…。
  3. 点击Java EE下面的web Application。
  4. 点击OK,这样就创建好了一个web文件夹,里面自带了一个index.jsp。

导入jar包及配置文件

  1. 在web文件夹下面创建一个WEB-INF目录,然后在WEB-INF目录下面创建一个lib文件夹。lib文件夹下面用于存放依赖的jar包。
  2. commons-pool2-2.3.jarjedis-2.7.0.jar两个jar包复制到lib文件夹下面。按住ctrl键选中两个jar包–>右键–>点击add as library。将外部jar包添加到IntelliJ IDEA项目。
  3. 复制配置文件jedis.properties到src目录下面。
  4. 创建utils包,在utils包下面创建一个类:JedisPoolUtils。里面写抽取的Jedis连接池的代码。
  5. main方法运行,结果发现报错。

报错信息

java.lang.ExceptionInInitializerError
	at cn.com.demo01.redis.Demo01Redis.test(Demo01Redis.java:170)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.NullPointerException: inStream parameter is null
	at java.base/java.util.Objects.requireNonNull(Objects.java:233)
	at java.base/java.util.Properties.load(Properties.java:407)
	at cn.com.utils.JedisPoolUtils.<clinit>(JedisPoolUtils.java:37)
	... 26 more

源码

  • jedis.properties配置文件内容如下:
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
  • JedisPoolUtils类代码如下:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class JedisPoolUtils {
    private static JedisPool jedisPool;

    static {
        // 读取配置文件
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");

        //创建Properties对象
        Properties pro = new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));
    }

    /**
     * 获取连接方法
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
  • main方法代码如下:
import cn.com.utils.JedisPoolUtils;
import org.junit.Test;
import redis.clients.jedis.Jedis;

public class Demo01Redis {
    @Test
    public void test(){
        //通过连接池工具类获取
        Jedis jedis = JedisPoolUtils.getJedis();
        //使用
        jedis.set("hello","world");

        //关闭 归还到连接池中
        jedis.close();
    }
}

解决方案

  1. 怀疑是写的代码错误了,一步一步排查,甚至于复制、粘贴,可是一直是没有任何效果,仍然是报错。
  2. 使用搜索引擎搜索inStream parameter is null发现有可能是配置文件没有放对位置,应该在src目录下面。可是打开项目,发现配置文件就是在src目录下面,没有任何的问题。
  3. inStream parameter is null:找不到配置文件错误。怀疑虽然将配置文件导入项目了,可是没有将配置文件导入到电脑本地。打开该项目在本地部署的路径,查看src文件夹下面是否有配置文件。很可惜,怀疑错误,里面有着配置文件。
  4. 这时,突然想到,我以前是遇见过这种情况的。之前是将IDEA重启了一下,重新加载了一下配置文件,然后再运行,就不会报错了。
  5. 重启,运行单元测试。OK,成功了!

碎碎念

  • 有句话说的好:重启解决90%的问题,重装解决99%的问题,换电脑解决100%的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值