Почему должен выполняться только префиксный тип возврата метода java? - PullRequest
0 голосов
/ 09 мая 2009

Я пытаюсь понять некоторый код 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).

Может ли кто-нибудь объяснить мне, почему это так?

Спасибо, Pablo

Пожалуйста, позвольте мне предоставить больше информации:

Это меня озадачило,

Выполнение кода начинается здесь:

     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  ????

Каким-то образом оно все еще достигает ТОЧКИ Б, и даже если я поставлю: Thread.dumpStack(); and new Error().printStackTrace();

в методе compileSingleQDB ничего не появляется.

Также, даже если я вырву внутренние компоненты метода compileSingleQDB и заменим его на:

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

    return null;
}

строка jdbcExecInfo.sql все равно каким-то образом получает значение

Ответы [ 2 ]

3 голосов
/ 09 мая 2009

Код, который вы разместили, недостаточен для объяснения поведения. Обратите внимание, что типы или классы не являются «вызываемыми». Оператор print находится в конструкторе, поэтому, очевидно, где-то создается экземпляр SQLExecutionInfo (и нет, Java не делает этого автоматически). То, что это происходит, когда оператор print в конце compileSingleQDB() не выполняется, может иметь ряд причин: выбрасываемое исключение, многопоточность или просто неправильный код.

Попробуйте уменьшить код, чтобы точно определить проблему, пока вы либо сами не найдете его, либо у вас будет достаточно маленькая версия для публикации полностью, чтобы мы могли воспроизвести поведение.

1 голос
/ 09 мая 2009

Мой предыдущий ответ не применялся после редактирования вопроса.

Я предполагаю, что в этом образце отсутствует соответствующий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...