如何在 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()的顺序应该按照创建的相反顺序更新。 qDocvNav 对象是从 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);
            }
        }