如何在 Domino 代理中的 Java Class 的 finally 子句中防止 NullPointerException
How to prevent NullPointerException in the finally clause in a Java Class in Domino agent
Java 只有调试信息 returns null 没有在 try/catch 的 finally 子句中说明错误的实际原因并且不确定如何摆脱此错误消息或与调用的回收方法有关的原因。
错误日志如下:
Agent Manager: Agent printing: Create Report final insert error: null
Agent Manager: Agent error: java.lang.NullPointerException
Agent Manager: Agent error: at JavaAgent.createReport(Unknown Source)
Agent Manager: Agent error: at JavaAgent.NotesMain(Unknown Source)
Agent Manager: Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
Agent Manager: Agent error: at lotus.domino.NotesThread.run(Unknown Source)
下面是被调用的函数
private void createReport() {
Integer qCount = 0;
Document qDoc = null;
ViewNavigator vNav = null;
try {
qView = currentDatabase.getView("RecsByRNo");
qDoc = qView.getFirstDocument();
vNav = qView.createViewNav();
while (qDoc != null) {
String qNo = qDoc.getItemValueString("RNo");
String qType = qDoc.getItemValueString("EType");
String qStatus = qDoc.getItemValueString("Status");
String qBy = qDoc.getItemValueString("RBy");
Document tmpReqDoc = qView.getNextDocument(qDoc);
qDoc.recycle();
qDoc = tmpReqDoc;
}
} catch (Exception e) {
logErrors("Create Report error: ", e);
} finally {
try {
qView.recycle();
qDoc.recycle();
vNav.recycle();
} catch (Exception e) {
logErrors("Create Report final insert error: ", e);
}
}
agentLogger.LogAction("<<< Count: " + qCount + " >>>");
}
private void logErrors(String t, Exception e) {
agentLogger.LogError(t + " " + e.getMessage());
agentLogger.LogError(t + " " + e.getStackTrace().toString());
System.out.println(t + " " + e.getMessage());
e.printStackTrace();
}
如有任何建议,我们将不胜感激。
recycle()
的顺序应该按照创建的相反顺序更新。 qDoc
和 vNav
对象是从 qView
对象创建的。如果先调用 qView
上的回收,则其他对象也会变为空。在 finally
块中关闭对象之前检查 null
始终是一个好习惯。
finally {
try {
if(vNav != null) vNav.recycle();
if(qDoc != null) qDoc.recycle();
if(qView != null) qView.recycle();
} catch (Exception e) {
logErrors("Create Report final insert error: ", e);
}
}
Java 只有调试信息 returns null 没有在 try/catch 的 finally 子句中说明错误的实际原因并且不确定如何摆脱此错误消息或与调用的回收方法有关的原因。
错误日志如下:
Agent Manager: Agent printing: Create Report final insert error: null
Agent Manager: Agent error: java.lang.NullPointerException
Agent Manager: Agent error: at JavaAgent.createReport(Unknown Source)
Agent Manager: Agent error: at JavaAgent.NotesMain(Unknown Source)
Agent Manager: Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
Agent Manager: Agent error: at lotus.domino.NotesThread.run(Unknown Source)
下面是被调用的函数
private void createReport() {
Integer qCount = 0;
Document qDoc = null;
ViewNavigator vNav = null;
try {
qView = currentDatabase.getView("RecsByRNo");
qDoc = qView.getFirstDocument();
vNav = qView.createViewNav();
while (qDoc != null) {
String qNo = qDoc.getItemValueString("RNo");
String qType = qDoc.getItemValueString("EType");
String qStatus = qDoc.getItemValueString("Status");
String qBy = qDoc.getItemValueString("RBy");
Document tmpReqDoc = qView.getNextDocument(qDoc);
qDoc.recycle();
qDoc = tmpReqDoc;
}
} catch (Exception e) {
logErrors("Create Report error: ", e);
} finally {
try {
qView.recycle();
qDoc.recycle();
vNav.recycle();
} catch (Exception e) {
logErrors("Create Report final insert error: ", e);
}
}
agentLogger.LogAction("<<< Count: " + qCount + " >>>");
}
private void logErrors(String t, Exception e) {
agentLogger.LogError(t + " " + e.getMessage());
agentLogger.LogError(t + " " + e.getStackTrace().toString());
System.out.println(t + " " + e.getMessage());
e.printStackTrace();
}
如有任何建议,我们将不胜感激。
recycle()
的顺序应该按照创建的相反顺序更新。 qDoc
和 vNav
对象是从 qView
对象创建的。如果先调用 qView
上的回收,则其他对象也会变为空。在 finally
块中关闭对象之前检查 null
始终是一个好习惯。
finally {
try {
if(vNav != null) vNav.recycle();
if(qDoc != null) qDoc.recycle();
if(qView != null) qView.recycle();
} catch (Exception e) {
logErrors("Create Report final insert error: ", e);
}
}