RandomAccessFile的使用,对文件的操作

本文探讨了一个在尝试获取文件锁时遇到的异常问题,通过分析代码片段,发现异常信息缺失导致问题定位困难。通过修改错误处理策略,使用e.getStackTrace()替代e.getMessage(),成功在日志中记录详细堆栈信息,为远程问题诊断提供了关键线索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题点:遇到一个本地不能复现的问题,当时代码记载的日志不多,捕获到异常之后输出的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(),打印出堆栈信息,才能具体到是哪里的问题,由于本地不能复现,只能把日志信息打印详细点,让现场复现然后提供日志再分析,后续解答为什么这里会抛异常…