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.jar jedis-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
View Code

源码

  • 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 }

解决方案

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

碎碎念

  • 有句话说的好:重启解决90%的问题,重装解决99%的问题,换电脑解决100%的问题。
posted @ 2022-04-06 10:31  炸天帮帮主  阅读(504)  评论(0编辑  收藏  举报