Java使用pcap4j读取pcap文件时出现EOFException未抛出的编译错误
问题根因
你遇到的编译错误是因为PcapHandle提供的getNextPacket()方法本身不会抛出EOFException:该方法读取到pcap文件末尾时会直接返回null,方法签名未声明抛出任何EOF相关异常,Java编译器检测到catch语句捕获了一个try代码块中永远不会抛出的异常,因此直接报错。
pcap4j库中对应两种读取离线数据包的逻辑:
- 无异常抛出版本:
getNextPacket(),EOF返回null - 异常跳出版本:
getNextPacketEx(),EOF抛出EOFException,符合你最初的设计逻辑
另外你现有代码还存在空指针风险:如果数据包不是IPv4协议,packet.get(IpV4Packet.class)会返回null,直接调用getHeader()会触发空指针异常崩溃。
修正方案
方案1:保留异常跳出逻辑,替换调用方法
将getNextPacket()替换为getNextPacketEx(),同时补全非IPv4包的兼容逻辑:
import java.io.EOFException; import org.pcap4j.core.PcapHandle; import org.pcap4j.core.Pcaps; import org.pcap4j.packet.IpV4Packet; import org.pcap4j.packet.Packet; import org.pcap4j.packet.namednumber.IpNumber; public class PcapStat { public static void main(String[] args) throws Exception { int udp = 0, tcp = 0, all = 0, tot = 0; PcapHandle handle = Pcaps.openOffline("final-name.pcap"); for(;;) { try { Packet packet = handle.getNextPacketEx(); IpV4Packet ipv4 = packet.get(IpV4Packet.class); // 过滤非IPv4协议的数据包 if (ipv4 == null) { all++; continue; } IpNumber prot = ipv4.getHeader().getProtocol(); String comp = prot.toString(); if(comp.contains("UDP")) { udp++; } else if (comp.contains("TCP")) { tcp++; } else { all++; } } catch (EOFException e) { System.out.println("End of file"); break; } } handle.close(); tot = udp + tcp + all; System.out.println("TCP: " + tcp); System.out.println("UDP: " + udp); System.out.println("其他协议: " + all); System.out.println("总包数: " + tot); } }
方案2:直接判断返回值,无需捕获异常
保留getNextPacket()调用,判断返回值为null时跳出循环:
// 其余代码和方案1一致,仅替换循环部分 PcapHandle handle = Pcaps.openOffline("final-name.pcap"); Packet packet = null; while ((packet = handle.getNextPacket()) != null) { IpV4Packet ipv4 = packet.get(IpV4Packet.class); if (ipv4 == null) { all++; continue; } IpNumber prot = ipv4.getHeader().getProtocol(); String comp = prot.toString(); if(comp.contains("UDP")) { udp++; } else if (comp.contains("TCP")) { tcp++; } else { all++; } } System.out.println("End of file"); handle.close(); // 其余统计输出代码不变
内容的提问来源于stack exchange,提问作者Daniel Larson
相关产品推荐
相关产品推荐

