【问题标题】:Why would only the prefixing return type of a java method execute?为什么只执行 java 方法的前缀返回类型?
【发布时间】:2010-10-24 22:26:29
【问题描述】:

我试图理解一些 java 代码,由于某种原因,这些代码似乎执行了它的返回类型类(SQLExecutionInfo 类),而在方法中没有其他任何东西。 也许这就是java的工作方式(即不管方法体中的内容是否首先执行返回的类的类型??)

方法是这样开始的:

protected Query.SQLExecutionInfo compileSingleQDB(StatementExpression statement, boolean keyNeeded) throws StatementException, XMLDBCException {

//body of method
System.out.println("body of method");
}



/*****THE REFERENCED SQLExecutionInfo class is a subclassed within Query.java***********/

public static class SQLExecutionInfo {
    public SqlExpression sql = null;
    public StatementInfo sInfo = null;
    public Mapper mapper = null;
    public List childrenQueries = null;
    public int[] idPosition = null;
    public int idCount = -1;

    public SQLExecutionInfo() {
    }

    public SQLExecutionInfo(SqlExpression sql, Mapper mapper) {
        System.out.println("POINT ALPHA2:"+ sql);
        this.sql = sql;
        this.mapper = mapper;
    }

由于某种原因,compileSingleQDB 方法(即主体)中没有任何内容被执行,但是调用了 SQLExecutionInfo 类并调用了 System.out.println("POINT ALPHA2:"+ sql)。

谁能解释一下这是为什么?

谢谢, 巴勃罗

请让我提供更多信息:

这个让我很困惑,

代码执行从这里开始:

     System.out.println("POINT SQL:"+jdbcExecInfo.sql); // Returns null at this stage    
try {
   System.out.println("POINT A");
   jdbcExecInfo = compileSingleQDB(((Variable) Qdb.get(0)).getExpression(), false);
   System.out.println("POINT B");
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
System.out.println("POINT SQL:"+jdbcExecInfo.sql); // Somehow now has a value  ????

不知何故,它仍然到达 POINT B,即使我输入:Thread.dumpStack(); and new Error().printStackTrace();

在 compileSingleQDB 方法中什么也没有出现。

即使我删除了 compileSingleQDB 方法的内部结构并将其替换为:

protected Query.SQLExecutionInfo compileSingleQDB(StatementExpression statement, boolean keyNeeded) throws XQueryException, XMLDBCException {

    return null;
}

字符串 jdbcExecInfo.sql 仍然以某种方式获取值

【问题讨论】:

  • 您声称在任何上下文之外(即作为 main 方法中的唯一语句)调用方法 compileSingleQDB 时没有(有意义的)参数(null 和 false)会导致 SQLExecutionInfo 的构造函数被调用?
  • 我看不出这段代码是如何编译的。 compileSingleQDB 方法不返回任何内容,它是我的签名所必需的。

标签: java static methods protected


【解决方案1】:

编辑问题后,我之前的回答不适用。

我的猜测是这个示例缺少一些相关代码。

【讨论】:

  • 我的编辑并没有改变任何代码,它只是完成了预先格式化的代码(在“thus:”之后添加了一个换行符)。
【解决方案2】:

您发布的代码不足以解释该行为。请注意,类型或类不是“调用”的。 print 语句在构造函数中,所以显然SQLExecutionInfo 的实例是在某处创建的(不,Java 不会自动执行此操作)。在compileSingleQDB() 末尾的打印语句未执行时发生这种情况可能有多种原因:抛出异常、多线程或只是错误的代码。

尝试减少代码以查明问题,直到您自己找到问题,或者您有一个足够小的版本来完全发布,以便我们可以重现该行为。

【讨论】:

  • Thrad.dumpStack();或新的 Error().printStackTrace();构造函数内部将提供有关从何处调用它的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多