【问题标题】:Null pointer exception on <cfthread><cfthread> 上的空指针异常
【发布时间】:2013-12-17 03:06:31
【问题描述】:

以下代码适用于 Adob​​e ColdFusion 9.01+,但不适用于 Railo 4.1

此外,这仅在 Post 上失败

此代码在 application.cfc 中的 FW/1 setupRequest() 内部调用

<cfthread name="threadA" action="run"> 

<cftry>

<cfquery>
    INSERT
    INTO    dbo.Traffic (Circuit, Fuseaction, IP_hash)
    VALUES  (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listfirst(variables.rc.fuseaction, '.')#">,
        <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listlast(variables.rc.fuseaction, '.')#">,
        <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#cgi.remote_addr#">
        )
</cfquery>


<cfcatch />
</cftry>

</cfthread>

错误

java.lang.NullPointerException 在 railo.runtime.net.http.HttpUtil.cloneParameters(HttpUtil.java:66):66 在 railo.runtime.net.http.HttpServletRequestDummy.clone(HttpServletRequestDummy.java:677):677 在 railo.runtime.thread.ThreadUtil.cloneHttpServletRequest(ThreadUtil.java:67):67 在 railo.runtime.thread.ThreadUtil.clonePageContext(ThreadUtil.java:29):29 在 railo.runtime.thread.ChildThreadImpl.(ChildThreadImpl.java:101):101 在 railo.runtime.tag.ThreadTag.register(ThreadTag.java:269):269 在 scorecard38.application_cfc$cf.udfCall(D:\railo\webapps\www\Scorecard38\Application.cfc:162):162 在 railo.runtime.type.UDFImpl.implementation(UDFImpl.java:94):94

疯狂猜测

variables.rc 没有被复制到线程中

【问题讨论】:

  • 如果你想测试你的理论,给自己邮寄一份来自该线程的变量范围的转储。
  • 我错过了什么,cfcatch 标记的起点在哪里?
  • &lt;cfcatch /&gt;&lt;cfcatch&gt;&lt;/cfcatch&gt; 相同。基本上它会捕获错误并且从不显示或执行任何操作

标签: coldfusion railo cfml application.cfc fw1


【解决方案1】:

variables.rc 不会被复制到线程中,除非您将其添加为参数。添加rc 作为参数,然后您将通过arguments.rc 访问它而不是variables.rc

<cfthread name="threadA" action="run" rc="#variables.rc#">
  <cftry>

    <cfquery>
    INSERT INTO dbo.Traffic (Circuit, Fuseaction, IP_hash)
    VALUES  (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listfirst(arguments.rc.fuseaction, '.')#">,
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listlast(arguments.rc.fuseaction, '.')#">,
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#cgi.remote_addr#">
    )
    </cfquery>

    <cfcatch />
  </cftry>

</cfthread>

如果这不起作用,您将不得不删除 try/catch 并转储您的 cfthread 以查看错误。下面的代码将输出 'Variable C is undefined'

<cfthread name="threadA" action="run">
  <cfset b = c>
</cfthread>
<cfdump var="#cfthread#"><cfabort>

【讨论】:

  • 其他线程可以访问主线程的变量范围。你确定你指的不是函数吗?
  • 我假设他已经确认他可以在函数中访问rc,然后才走到这一步。
  • 我认为您的回答不正确。 cfthread 上的文档help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/… 没有提及传递参数。但是,它确实声明,“一个页面中的所有线程共享一个变量范围,因此您可以将它用于所有线程共有的数据。如果需要,您必须小心锁定对变量的访问,以防止死锁或线程之间的竞争条件。”我自己的经验证实了这一点。这就是我投票反对这个答案的原因。
【解决方案2】:

我和你有同样的问题。您正在使用 CGI 变量,这就是导致问题的原因

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 2019-07-18
    • 2013-08-12
    • 2015-03-27
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多