2015-10-18 2 views
0

Я получаю эту странную ошибку в своем классе. У меня есть этот класс IRNode, где у меня есть 3 строки: op1, op2 и op3. Когда я распечатываю их, прежде чем назначать их различным строкам, а затем распечатывать их, вы получаете разные значения. Он сохраняет их как null.Методы, возвращающие неверные значения

Выходные операторы печати что-то вроде этого:

OP1: 20, OP2: a, OP3: null 

;STOREI 

в то время как он должен быть:

OP1: 20, OP2: a, OP3: null 

;STOREI 20 a 

Мой код:

public IRNode (String op, String o1, String o2, String o3) { 

    opcode = op; 
    op1 = o1; 
    op2 = o2; 
    op3 = o3; 
    //IRNodeNext = null; 

} 

public void printIR() { 
    System.out.format("OP1: %s, OP2: %s, OP3: %s\n",op1, op2,op3); 
    String o1 = this.op1; 
    String o2 = this.op2; 
    String o3 = this.op3; 
    System.out.print(";"+opcode); 
    if (o1 != null) System.out.format(" ",o1); 
    if (o2 != null) System.out.format(" ",o2); 
    if (o3 != null) System.out.format(" ",o3); 
    System.out.format("\n"); 
} 

PS. это для моего проекта компиляторов. Это происходит после создания списка AST и IRNode.

***** EDIT ****** Фактически выяснилось, что это была глупая ошибка. Но теперь я сталкиваюсь с другой странной ошибкой.

op1 = thisNode.returnOP1(); 
op2 = thisNode.returnOP2(); 
op3 = thisNode.returnOP3(); 

Здесь я получаю op1, op2 и op3, как раньше. При возврате, я проверил, я возвращаю правильные значения. Например, Для STOREI 20а Я возвращаю ОР1 = 20 и op2 = а

, но когда я получаю это только после того, как эти 3 строки кода, я получаю неправильные значения. Я получаю op1 = 20, op2 = $ s, op3 = a

Почему это происходит?

+0

Что вы имеете в виду под «перед тем, как назначить их различным строкам, а затем распечатать их, дает разные значения, сохраняя их как null»? Единственная проблема, которую я вижу здесь, это то, что у вас есть '' '' где ''% s'' должно быть. Может быть? – nihilon

+0

Это изменение должно быть новым вопросом, так как на исходный вопрос был дан ответ. Честно говоря, учитывая, какова была ваша первая проблема, я не удивлюсь, если эта проблема будет другой подобной ошибкой. Я воздержусь назвать это тем, что вы сделали, просто чтобы быть вежливым. Что такое код для методов «returnOP»? Он не похож на 'returnOP2()' или 'returnOP3()' возвращает то, что вы ожидаете от них. – nihilon

+0

Эй, ты был прав. Это была аналогичная ошибка, из-за заявлений печати я получал неправильные значения. В моих функциях returnOP я просто возвращаю соответствующую строку OP. – Aditya

ответ

3

Единственная проблема, которую я вижу в этом примере это:

if (o1 != null) System.out.format(" ",o1); 

Каждая из этих линий должны иметь %s в пустую строку:

if (o1 != null) System.out.format(" %s",o1); 
if (o2 != null) System.out.format(" %s",o2); 
if (o3 != null) System.out.format(" %s",o3); 

Без него, вы не собираетесь получить что-нибудь распечатанное.

Выход:

OP1: 20, OP2: a, OP3: null 
;STOREI 20 a 

Вы также можете рассмотреть этот вопрос:

System.out.format("%n"); 

Вместо использования \n используйте %n для переноса строк в ваших форматных строк. Это агностика платформы.

***** EDIT ****** Фактически выяснилось, что это была глупая ошибка. Но теперь я сталкиваюсь с другой странной ошибкой.

op1 = thisNode.returnOP1(); op2 = thisNode.returnOP2(); op3 = thisNode.returnOP3(); Здесь я получаю op1, op2 и op3, как раньше. Когда вернувшись, я проверил, я возвращаю правильные значения. Например, Для STOREI 20 a я возвращаю op1 = 20 и op2 = a

, но когда я получаю его сразу после этих трех строк кода, я получаю неправильные значения .Я получаю op1 = 20, op2 = $ s, op3 = a

Почему это происходит?

Без кода для ваших методов returnOP трудно сказать, но, основываясь на предыдущем выпуске, я готов поспорить, что проблема аналогична.

Учитывая это:

public String returnOP1() { return op1; } 
public String returnOP2() { return op2; } 
public String returnOP3() { return op3; } 

И это:

System.out.println(irNode.returnOP1()); 
    System.out.println(irNode.returnOP2()); 
    System.out.println(irNode.returnOP3()); 

я получаю это:

20 
a 
null 

Это говорит мне, что для вас, returnOP2() написано, чтобы вернуться $s вместо от op2 или op2 устанавливается в $s и returnOP3() записано для возврата op2.

Но без кода, нет способа быть уверенным.

Смежные вопросы