我不理解以下代码部分中的日志:
private InfoBox getInfoBox(Path p)
{
try
{
String path = p.toString();
Log.getLogger().info("getting info box at " + path);
lock.lock();
Log.getLogger().info("got lock" + path);
JAXBContext jaxbContext = JAXBContext.newInstance(InfoBox.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
InfoBox ib = (InfoBox) jaxbUnmarshaller.unmarshal(p.toFile());
Log.getLogger().info("got info box");
return ib;
}
catch (Exception e)
{
Log.getLogger().error(e.getMessage(), e);
return null;
}
finally
{
lock.unlock();
Log.getLogger().info("released lock");
}
}
当一切运行良好时,日志条目如下所示:
[INFO] 2016-07-29 09:58:59,163:PersistenceThread.getInfoBox(PersistenceThread.java:618)PersistenceThread getInfoBox获取信息框位于C:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml
[INFO] 2016-07-29 09:58:59,179:PersistenceThread.getInfoBox(PersistenceThread.java:620)PersistenceThread getInfoBox得到lockC:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml
[INFO] 2016-07-29 09:58:59,203:PersistenceThread.getInfoBox(PersistenceThread.java:627)PersistenceThread getInfoBox获取信息框
[INFO] 2016-07-29 09:58:59,207:PersistenceThread.getInfoBox(PersistenceThread.java:639)PersistenceThread getInfoBox发布锁
但我有一个奇怪的异常
[INFO] 2016-07-29 09:59:16,079:PersistenceThread.getInfoBox(PersistenceThread.java:618)PersistenceThread getInfoBox获取信息框位于C:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407.xml
[INFO] 2016-07-29 09:59:16,084:PersistenceThread.getInfoBox(PersistenceThread.java:620)PersistenceThread getInfoBox get lockC:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407.xml
[INFO] 2016-07-29 10:01:36,926:PersistenceThread.getInfoBox(PersistenceThread.java:639)PersistenceThread getInfoBox发布锁
注 虽然获得了锁, 未检索到InfoBox 不抛出异常 但 锁定在一分钟后释放。
有人可以向我解释允许这种情况发生的基本过程吗?
最后,日志中的异常(上图)是日志文件的最后一行。之后,线程似乎完全挂起。
答案 0 :(得分:1)
来自评论:
如你所述,它没有完成try
块内的所有语句,也没有执行catch
块。这可能意味着抛出的内容不是Exception
- 类错误,例如StackOverflowError
,AssertionError
或OutOfMemoryError
。
如果应用程序没有崩溃并且没有日志,那么Error
可能会在应用程序的某处静默吞下,这将使调试非常困难。