Erro java.lang.NullPointerException

4 respostas
T

Pessoas… se acaso não for a área própria para essa publicação me desculpem. Sou novo por aqui e também no Java. Estou com um grande problema. Assumi um projeto em andamento e está difícil acompanhar o andamento das coisas. Possuo uma aplicação que quando eu executo encontro o erro [System Exception] java.lang.NullPointerException. Já sei que é devido ao acesso à uma variável nula. Porém não estou conseguindo encontrar o motivo pelo qual ela está recebendo valor nulo. Minha classe é essa:

[i]@RuntimeClass(label=“SIMCardElement”)
public class SIMCardElement extends MessageElement {

// numero sim card
@RuntimeDescription(label="SimCard")
@RuntimeManaged(type=EType.CHAR_ARRAY, arraysize=20, dialogEditor=DefaultEditors.CHAR_ARRAY)
public String simcard;

/**
 * construtor
 */
public SIMCardElement() {
    super.ie = PACKED_DECIMAL;
    super.moreflag = 0x00;
    super.length = 0x00;
    super.length = 0;
}

/**
 * decodifica elemento
 * @param buffer
 * @throws continental.protocol.acp.base.ACPParserException
 */
@Override
public void parse(ByteBuffer buffer) throws ACPParserException {
    
    super.parseSubHeader(buffer);
    
    if (length > 0) {
        
        byte[] binsimcard = new byte[super.length];
        buffer.get(binsimcard);
            
        simcard = BitHandler.getString(binsimcard, StringFormatOutput.Hex);
    }
}

/**
 * retorna bytes do elemento
 * @param buffer
 */
@Override
public void toBytes(ByteBuffer buffer) {
    
    byte[] bindata = BitHandler.getBytes(simcard, BytesFormatInput.Hex);
    
    length = (int)bindata.length;
    if (length > 0x1F)
        moreflag = 0x01;
    
    super.toBytesSubHeader(buffer);
    buffer.put(bindata);
}

@Override
public int length() {
    [b]return simcard.length() / 2;[/b]
}

}[/i]

O erro está justamente nesse return em destaque, pois como a variável simcard tem valor null, a divisão não ocorre. Qualquer ideia é bem vinda. Obrigado.

4 Respostas

L

Cara , não querendo ser chato, formata seu codigo.

http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

abrxx

T

Claro lokit"s.. desculpe-me pelo inconveniente. Como mencionei, sou novo por aqui. Aí vai.. epero que esteja mais claro.

@RuntimeClass(label="SIMCardElement")
public class SIMCardElement extends MessageElement {

  // numero sim card
  @RuntimeDescription(label="SimCard")
  @RuntimeManaged(type=EType.CHAR_ARRAY, arraysize=20, dialogEditor=DefaultEditors.CHAR_ARRAY)
  public String simcard;

  /**
  * construtor
  */
  public SIMCardElement() {
    super.ie = PACKED_DECIMAL;
    super.moreflag = 0x00;
    super.length = 0x00;
    super.length = 0;
  }

  /**
  * decodifica elemento
  * @param buffer
  * @throws continental.protocol.acp.base.ACPParserException
  */
  @Override
  public void parse(ByteBuffer buffer) throws ACPParserException {
    super.parseSubHeader(buffer);

    if (length > 0) {
      byte[] binsimcard = new byte[super.length];
      buffer.get(binsimcard);
      simcard = BitHandler.getString(binsimcard, StringFormatOutput.Hex);
    }
  }

  /**
  * retorna bytes do elemento
  * @param buffer
  */
  @Override
  public void toBytes(ByteBuffer buffer) {
    byte[] bindata = BitHandler.getBytes(simcard, BytesFormatInput.Hex);
    length = (int)bindata.length;

    if (length > 0x1F)
      moreflag = 0x01;

    super.toBytesSubHeader(buffer);
    buffer.put(bindata);
  }

  @Override
  public int length() {
    return simcard.length() / 2;
  }
}

O erro está ocorrendo na linha 53 do código acima, porém a atribuição da variável simcard acontece na linha 31, como pode ser observado. Eu consigo acompanhar o caminho que a execução do programa percorre entre os outros códigos, porém não sei exatamente como "caçar" o erro. Obrigado novamente..

drsmachado

Apenas ressaltando o camarada anterior http://www.guj.com.br/java/50115-voce-e-novo-no-gu...onte-leia-aqui-antes-por-favor
fica mais fácil de entender e te ajudar.

O problema é o seguinte, você cria a variável simcard como String

public String simcard;

Porém, condiciona a instância dela ao fato de length ser maior que zero

if (length > 0) { 

byte[] binsimcard = new byte[super.length]; 
buffer.get(binsimcard); 

simcard = BitHandler.getString(binsimcard, StringFormatOutput.Hex); 
}

Se essa condição não for satisfeita, a variável simcard é nula.
Sendo assim, quando você chama

public int length() { 
return simcard.length() / 2; 
}

A JVM não tem idéia de quem seja simcard nem o que ela possui ou o que ela pode retornar…
Então o erro NPE é jogado para ti…

T

drsmachado na prática é isso mesmo. Eu recompilei o código pra ter certeza de que ele estava “zerado”, porém o erro persiste. Ele está vindo de algum outro canto e parando aí ainda. Como uso um “parser” pra decodificar a mensagem de resposta que o sistema me envia, percebi que essa mensagem está sendo truncada. O sistema está se perdendo e chegando o valor ‘null’ na variável simcard. Mas quanto ao que você postou é isso mesmo. Obrigado.

Criado 21 de setembro de 2011
Ultima resposta 21 de set. de 2011
Respostas 4
Participantes 3