当我在Android Studio中以Java正常运行它时,这些代码如何工作,但是当我将其作为应用程序运行时,它立即向我显示NullPointerExcception?

时间:2019-03-08 11:07:03

标签: ibm-mq

当它作为Java代码正常运行时,它工作得很好,但是当它作为应用程序运行时,queueManager显示NULL。所有这些代码都放在onCreate(Bundle savedInstanceState)中。当它作为java运行时,调试器实际上显示出queueManager值。

void init() {


        int openOptions = CMQC.MQOO_INQUIRE | CMQC.MQOO_INPUT_AS_Q_DEF;
        MQEnvironment.hostname = HOST;
        MQEnvironment.channel = CHANNEL;
        MQEnvironment.port = PORT;
        MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
        MQEnvironment.properties.put(CMQC.THREAD_AFFINITY_PROPERTY, new Boolean(true));

        try {
            queueManager = new MQQueueManager(QMGR);
            System.out.println("Successfully connected to " +  queueManager.getName());
            defaultQueue = queueManager.accessQueue(QUEUE_NAME,openOptions);
            System.out.println("Queue size: " + defaultQueue.getCurrentDepth());

        } catch (MQException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(2);
        }
        finally {
            try {
                if (queueManager != null);
                queueManager.disconnect();
            } catch (MQException e) {
                e.printStackTrace();
            }
            try {
                if (defaultQueue != null);
                defaultQueue.close();
            } catch (MQException e) {
                e.printStackTrace();
            }
        }
}

2 个答案:

答案 0 :(得分:0)

MQEnvironment是外部库吗?如果是,您是否已将其导入到Android项目?

答案 1 :(得分:0)

(1)正如我在这里多次张贴的那样,请勿使用MQEnvironment类,因为它不是线程安全的。将连接信息放入Hashtable中,然后将Hastable传递给MQQueueManager类。有关我所讨论内容的示例,请参见here

(2)放入“ System.exit(2);”代码中间的格式错误,这意味着将不会调用finally子句。因此,该代码将使队列保持打开状态并连接到队列管理器。

(3)在您的finally子句中,您具有向后“断开连接”和“关闭”的功能。与队列管理器断开连接之前,必须先 关闭队列。