自定义InputStream搭建HTTP服务器时遇InputStream.available()空指针异常
解决自定义InputStream调用
available()触发空指针异常的问题 Hey 伙计,咱们来捋捋你搭建HTTP服务器时遇到的这个空指针问题——调用in.available()时炸了,这事儿大概率是你的自定义InputStream里的in引用没正确初始化导致的,我给你拆解下可能的原因和解决方向:
1. 核心原因:in变量是null
空指针异常的直接触发点就是你调用in.available()时,in这个对象根本没指向任何实例。结合你提到的构造方法super(is),咱们从两个方向排查:
情况一:传入自定义流的原始输入流本身就是null
你主类testServer里是从request.txt获取输入流的对吧?这里很可能出问题:
- 比如
request.txt路径写错了,导致创建FileInputStream时抛出异常,如果你没正确捕获处理,可能会把null传给自定义流的构造方法; - 或者你捕获了异常,但还是错误地把null传进去了。
排查小技巧:在创建自定义流前加个校验:
// testServer里的代码片段 InputStream fileInputStream = null; try { fileInputStream = new FileInputStream("request.txt"); } catch (FileNotFoundException e) { System.err.println("找不到request.txt文件!路径是否正确?"); e.printStackTrace(); return; // 直接终止,避免传入null } // 加个判断确保流不为null if (fileInputStream == null) { System.err.println("输入流初始化失败,为null!"); return; } // 再创建自定义流实例 YourCustomInputStream customIn = new YourCustomInputStream(fileInputStream);
情况二:自定义流内部没正确维护输入流引用
你提到自定义类实现了某接口(大概率是继承FilterInputStream?因为它的构造就是接收一个InputStream),如果你的自定义类里自己声明了private InputStream in,但构造方法里只调用了super(is)却没给自己的in赋值,那in自然是null。
错误示例:
public class YourCustomInputStream extends FilterInputStream { private InputStream in; // 自己声明的变量 public YourCustomInputStream(InputStream is) { super(is); // 父类接收了流,但自己的in没赋值 } @Override public int available() throws IOException { return in.available(); // 这里in是null,直接炸空指针 } }
正确写法:
要么直接复用父类的引用(FilterInputStream本身就维护了in成员变量),直接调用父类的方法:
public class YourCustomInputStream extends FilterInputStream { public YourCustomInputStream(InputStream is) { super(is); } @Override public int available() throws IOException { // 如果你需要自定义逻辑,先调用父类的available() int parentAvailable = super.available(); // 这里加你的自定义处理逻辑 return parentAvailable; } }
要么在构造里给自己的in变量赋值:
public class YourCustomInputStream extends FilterInputStream { private InputStream in; public YourCustomInputStream(InputStream is) { super(is); this.in = is; // 把传入的流赋值给自己的成员变量 } @Override public int available() throws IOException { return in.available(); // 现在in就有值了 } }
2. 额外排查点:输入流是否被提前关闭
检查你的代码中,有没有在调用customIn.available()之前,不小心关闭了原始的fileInputStream或者自定义流?如果流已经被关闭,也可能导致内部引用失效触发异常。
内容的提问来源于stack exchange,提问作者mx88
相关产品推荐
相关产品推荐

