【问题标题】:Java NullPointerException in Java AgentJava 代理中的 Java NullPointerException
【发布时间】:2013-12-20 04:23:47
【问题描述】:

我正在开发一个 java 代理。我有一个我认为不应该发生的 NullPointerException 错误。

这是调试控制台消息:

java.lang.NullPointerException
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:719)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:646)
    at COM.ibm.JEmpower.applet.http.HttpURLConnection.getInputStream(HttpURLConnection.java:411)
    at COM.ibm.JEmpower.applet.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:703)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:399)
    at JavaAgent.NotesMain(JavaAgent.java:16)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)

这是java代理中的代码

import lotus.domino.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
public class JavaAgent extends AgentBase {

    public void NotesMain() {
      String strAux = "[A Working URL]";
      try {
          Session session = getSession();
          AgentContext agentContext = session.getAgentContext();

          // (Your code goes here)

          HttpURLConnection httpCon = (HttpURLConnection) new URL(strAux).openConnection();

          httpCon.setRequestMethod("HEAD");
          httpCon.setConnectTimeout(20000);  
          httpCon.setReadTimeout(20000);

          httpCon.connect();

          System.out.println(HttpCon.getURL().toString());

          int responsecode = httpCon.getResponseCode();
          System.out.println("Response code is " + responsecode + " - " + httpCon.getResponseMessage());
      } catch(Exception e) {
          e.printStackTrace();
      }
    }

}

基本上错误指向System.out.println("Response code is " + httpCon.getResponseCode() + " - " + httpCon.getResponseMessage());

问题是该 URL 是一个有效的链接,因为我已经通过在浏览器中访问它进行了尝试。

此错误的可能原因是什么?它在我为测试创建的本地笔记数据库上效果不佳。但是,在非注释中开发的普通 java 程序中,它可以工作。

【问题讨论】:

  • 调试,看看httpCongetResponseCode()getResponseMessage()哪个是null
  • 好的。马上回来。将尝试查看其中一个是否为空
  • 它们可能都为空......
  • 也许来自 Sun 软件包的错误消息可能比 NPE 更具描述性。

标签: java lotus-domino


【解决方案1】:

在您发送任何内容之前获取响应代码是没有意义的。您应该先发送请求,然后获取响应代码,然后在需要时获取响应

【讨论】:

  • 我已经尝试添加 HttpCon.setRequestMethod("HEAD");HttpCon.connect(); 但我仍然遇到同样的错误...
  • 我正在关注这个 stackoverflow 问题stackoverflow.com/questions/3584210/… 的指南。我正在 Pinging an HTTP url 中测试代码并获取响应代码。还是一样的错误。
  • @Jigs,你检查过httpCon是否不为空吗?
  • 我不确定如何检查它。我尝试了一个条件if connection != null { "connection okay" },它根本没有返回任何东西。我也试过输出connection.getURL().toString(),它输出google.com。所以我猜它不是空的?
  • @Jigs,您的网址是以 www 还是 http:// 开头的?我认为它应该以 http:// 开头,但不确定 100% 你能检查将 http:// 添加到你的 url 吗?
【解决方案2】:

您可能仍有代码问题,但也可能存在权限问题。

您的代码在 IBM Lotus Domino 服务器上作为 Java 代理运行。这意味着它的功能受到限制。控制分为三个级别:Domino 的 AMGR 任务施加的限制、分配给代理的限制以及 JVM 施加的限制。假设您是代理的签名者,您是否确定您有权运行不受限制的代理(Domiono 目录中服务器文档的安全选项卡)?您是否检查了代理上的设置(代理属性对话框的安全选项卡)?如果您正确设置了所有这些,那么您可能需要查看 Domino 服务器安装中的文件 jvm/lib/security/java.policy。

【讨论】:

  • ...have you made sure that you have permission to run unrestricted agents 。关于这一点。有一个由我的团队成员之一签名的原始 java 代理,其中包含与我发布的代码类似的代码,我确信他有权运行不受限制的代理。但是,我目前正在调查同样的错误。 Under security tab of the agent。选中 Run As Web User 复选框,禁止不受限制的操作,在默认访问中,站点管理员和开发人员被选中。 (我是开发者组/角色的成员)
  • 嗯...您写了“禁止无限制”,但我相信选择是“不允许受限操作”、“允许受限操作”或“允许具有完全访问管理权限的受限操作”。如果您想做网络访问,我认为您需要“允许受限操作”或“允许具有完全访问权限的受限操作......”。
  • 对不起,我的意思是Do not allow restricted operations。我已将其更改为allow restricted operations with full access,但错误仍然相同。
  • Hmmm... 我的下一个建议是服务器上的 Java 策略文件,但是如果另一个具有类似代码的代理在同一台服务器上运行没有问题,那么它似乎不会是问题。如果错误仍然指向 System.out.println,并且仍然是 NullPointerException,那么唯一的可能是 getResponseMessage 返回 null。根据文档,getResponseCode 永远不会这样做,但如果没有实际消息,getResponseMessage 会这样做。
  • 所以我的建议是将该行分成两个对 println 的调用。在第一个中,只需打印 getResponseCode 的结果。我的猜测是,它不是一个普通的 200 代码,无论你在那里看到什么值,都会强烈暗示你接下来需要做什么。
【解决方案3】:
  1. 关闭笔记/设计师
  2. 在 Windows 中打开任务管理器
  3. 查找并终止所有 IBM Lotus Notes/Domino 进程
  4. 再试一次

为我工作

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 2013-07-04
    • 2016-05-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多