问题点:遇到一个本地不能复现的问题,当时代码记载的日志不多,捕获到异常之后输出的e.getMessage()为null,所以不好定位具体是哪里的问题。
代码大致如下:(try中某处异常,捕获的e.getMessage()为null)
String path = tempFile + File.separator + fileName + ".htm";
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
FileChannel channel=randomAccessFile.getChannel();
FileLock lock=null;
int retry = 300;
while (retry > 0) {
lock = channel.tryLock();
if (null == lock) {
retry --;
Thread.sleep(1000);
} else {
break;
}
}
if (null == lock) {
throw new TapException("文件被锁定");
}
randomAccessFile.setLength(0);
randomAccessFile.write(document.html().getBytes("utf-8"));
if (null != lock)
lock.release();
if (null != channel)
channel.close();
if (null != randomAccessFile)
randomAccessFile.close();
}catch (Exception e) {
logger.error(e.getMessage());
} finally {
}
在eclipse中可以看到高亮的地方就那么几个,如果出现了空指针异常的话, 首先document.html() 不为null是可以确定的;randomAccessFile 是new出来的,也不为null; 那只有是channel对象为null了,就是不不太确认,还有为啥randomAccessFile.getChannel();返回的是null。
这里将e.getMessage()改为e.getStackTrace(),打印出堆栈信息,才能具体到是哪里的问题,由于本地不能复现,只能把日志信息打印详细点,让现场复现然后提供日志再分析,后续解答为什么这里会抛异常…