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项目:
- 新建一个Moudle。
- 右键Moudle名称,点击第二个选框Add frameworks Support…。
- 点击Java EE下面的web Application。
- 点击OK,这样就创建好了一个web文件夹,里面自带了一个index.jsp。
导入jar包及配置文件
- 在web文件夹下面创建一个WEB-INF目录,然后在WEB-INF目录下面创建一个lib文件夹。lib文件夹下面用于存放依赖的jar包。
- 将 commons-pool2-2.3.jar 和 jedis-2.7.0.jar两个jar包复制到lib文件夹下面。按住ctrl键选中两个jar包–>右键–>点击add as library。将外部jar包添加到IntelliJ IDEA项目。
- 复制配置文件jedis.properties到src目录下面。
- 创建utils包,在utils包下面创建一个类:JedisPoolUtils。里面写抽取的Jedis连接池的代码。
- 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配置文件内容如下:
1 host=127.0.0.1 2 port=6379 3 maxTotal=50 4 maxIdle=10
- JedisPoolUtils类代码如下:
1 import redis.clients.jedis.Jedis; 2 import redis.clients.jedis.JedisPool; 3 import redis.clients.jedis.JedisPoolConfig; 4 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.util.Properties; 8 9 public class JedisPoolUtils { 10 private static JedisPool jedisPool; 11 12 static { 13 // 读取配置文件 14 InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties"); 15 16 //创建Properties对象 17 Properties pro = new Properties(); 18 //关联文件 19 try { 20 pro.load(is); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 //获取数据,设置到JedisPoolConfig中 25 JedisPoolConfig config = new JedisPoolConfig(); 26 config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal"))); 27 config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle"))); 28 29 //初始化JedisPool 30 jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port"))); 31 } 32 33 /** 34 * 获取连接方法 35 */ 36 public static Jedis getJedis(){ 37 return jedisPool.getResource(); 38 } 39 }
- main方法代码如下:
1 import cn.com.utils.JedisPoolUtils; 2 import org.junit.Test; 3 import redis.clients.jedis.Jedis; 4 5 public class Demo01Redis { 6 @Test 7 public void test(){ 8 //通过连接池工具类获取 9 Jedis jedis = JedisPoolUtils.getJedis(); 10 //使用 11 jedis.set("hello","world"); 12 13 //关闭 归还到连接池中 14 jedis.close(); 15 } 16 }
解决方案
- 怀疑是写的代码错误了,一步一步排查,甚至于复制、粘贴,可是一直是没有任何效果,仍然是报错。
- 使用搜索引擎搜索inStream parameter is null发现有可能是配置文件没有放对位置,应该在src目录下面。可是打开项目,发现配置文件就是在src目录下面,没有任何的问题。
- inStream parameter is null:找不到配置文件错误。怀疑虽然将配置文件导入项目了,可是没有将配置文件导入到电脑本地。打开该项目在本地部署的路径,查看src文件夹下面是否有配置文件。很可惜,怀疑错误,里面有着配置文件。
- 这时,突然想到,我以前是遇见过这种情况的。之前是将IDEA重启了一下,重新加载了一下配置文件,然后再运行,就不会报错了。
- 重启,运行单元测试。OK,成功了!
碎碎念
- 有句话说的好:重启解决90%的问题,重装解决99%的问题,换电脑解决100%的问题。