0

我试图理解一些 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  ????

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

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

即使我撕掉 compileSingleQDB 方法的内部结构并将其替换为:

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

    return null;
}

字符串 jdbcExecInfo.sql 仍然以某种方式获得一个值

4

2 回答 2

3

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

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

于 2009-05-08T22:59:09.357 回答
1

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

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

于 2009-05-08T22:40:43.677 回答