Problema aparentemente simples de lógica, mas que não consigo encontrar solução!

3 respostas
T

Estou fazendo um progrma que monitora linhas VOIP.
Ao receber um Dial Event (um ramal receber chamada), o usuário recebe as devidas informações sobre quem está ligando.
as informações são recebidas de uma vez só e separadas por vígula, para mostrar apenas o necessáio fiz um método que irei mostrar,
até aí tudo certo, o problema é que ao receber uma segunda chamada de um mesmo ramal, as informações não são mostradas na tela,
bem como não são salvas no relatório de chamadas e o erro “java.lang.NullPointerException” é acusado na linha apontada no código abaixo:

while (cont <= arrayDE.length) {
                    for (int i = 0; i < evento.length(); i++) {  //INÍCIO quebra de linha quando encontra uma vírgula
                        if (evento.charAt(i) != ',') {    //grava letra por letra, até achar uma vírgula
                            partes += evento.charAt(i);
                        } else { //quando acha a vírgula armazena todo o conteúdo anterior no vetor, na posição cont

                            arrayDE[cont] = partes; //<<<<< O ERRO ESTÁ AQUI
                            System.out.println(cont);
                            cont++;
                            partes = ""; //String partes é zerada
                        }
                    }//final quebra de linha
                }

arrayDE é um array String de 10 casas, mas por via das dúvias, caso eu não tenha sido claro o suficiente, aqui a classe inteira:

package DialEvent;

import java.io.IOException;
import javax.swing.JOptionPane;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.ManagerEventListener;
import org.asteriskjava.manager.event.DialEvent;
import org.asteriskjava.manager.event.ManagerEvent;

public class EventListener2 extends Thread implements ManagerEventListener {

    //início declaração de variáveis da classe
    String codigo_area_telefone = "";
    String primeira_parte_telefone = "";
    String segunda_parte_telefone = "";
    String telefone_inteiro = "";
    String numero_sem_aspas = "";
    int cont = 0;
    private String arrayDE[] = new String[9];
    private ManagerConnection managerConnection;
    private boolean torun;
    private String channel;
    DataHora dt = new DataHora();
    CriaTxt ct = new CriaTxt();
//final declaração de variáveis da classe

    public EventListener2(String host, String username, String password,
            String channel) throws IOException {
        this.channel = channel;
        ManagerConnectionFactory factory = new ManagerConnectionFactory(
                host, username, password);
        this.managerConnection = factory.createManagerConnection();
    }

    public void run() {

        this.torun = true;
        // register for events
        managerConnection.addEventListener(this);
        try {
            // connect to Asterisk and log in
            managerConnection.login();
        } catch (Exception ex) {
            // Do nothing
        }
        try {
            // wait 10 seconds for events to come in
            while (this.torun) {
                Thread.sleep(100);
            }
        } catch (Exception ex) {
            // Do nothing
        }
        // and finally log off and disconnect
        managerConnection.logoff();
    }

    public void stopListener() {
        this.torun = false;
    }

    public void onManagerEvent(ManagerEvent event) {
        if (event instanceof DialEvent) {
            if (DialEvent.class.cast(event).getDestination().contains(this.channel)) {
                String partes = "";
                String evento = event.toString();


                while (cont <= arrayDE.length) {
                    for (int i = 0; i < evento.length(); i++) {  //INÍCIO quebra de linha quando encontra uma vírgula
                        if (evento.charAt(i) != ',') {    //grava letra por letra, até achar uma vírgula
                            partes += evento.charAt(i);
                        } else { //quando acha a vírgula armazena todo o conteúdo anterior no vetor, na posição cont

                            arrayDE[cont] = partes; //<<<<< O ERRO ESTÁ AQUI
                            System.out.println(cont);
                            cont++;
                            partes = ""; //String partes é zerada
                        }
                    }//final quebra de linha
                }


                //início retira os caracteres desnecessários
                arrayDE[4] = arrayDE[4].substring(13);

                //início define como "desconhecido", caso o nome não esteja cadastrado
                if (arrayDE[4].equals("'<unknown>'")) {
                    arrayDE[4] = "Desconhecido";
                }//final define como "desconhecido", caso o nome não esteja cadastrado

                arrayDE[5] = arrayDE[5].substring(9);//retira caracteres desnecessários

                //início - retirar aspas
                for (int i = 0; i < arrayDE[5].length(); i++) {
                    if (arrayDE[5].charAt(i) != '') {
                        partes += arrayDE[5].charAt(i);
                    } else {
                        numero_sem_aspas = partes;
                        cont++;
                        partes = ""; //String partes é zerada
                        }
                }//final - retirar aspas

                //início - tratar o número caso não seja um ramal
                if (numero_sem_aspas.length() >= 8) {
                    codigo_area_telefone = numero_sem_aspas.substring(numero_sem_aspas.length() - numero_sem_aspas.length(), numero_sem_aspas.length() - 8);
                    primeira_parte_telefone = numero_sem_aspas.substring(numero_sem_aspas.length() - 8, numero_sem_aspas.length() - 4);
                    segunda_parte_telefone = numero_sem_aspas.substring(numero_sem_aspas.length() - 4, numero_sem_aspas.length());
                    telefone_inteiro = "Número: " + codigo_area_telefone + " " + primeira_parte_telefone + "-" + segunda_parte_telefone;
                } //final - tratar o número caso não seja um ramal
                else {
                    for (int i = 0; i < arrayDE[5].length(); i++) {  //INÍCIO quebra de linha quando encontra uma vírgula
                        if (arrayDE[5].charAt(i) != '') {    //retira o caracter '
                            partes += arrayDE[5].charAt(i);
                        } else {
                            numero_sem_aspas = partes;
                            cont++;
                            partes = ""; //String partes é zerada
                        }
                    }//final quebra de linha

                    telefone_inteiro = "Ramal: " + numero_sem_aspas;
                }

                arrayDE[7] = arrayDE[7].substring(5);
                arrayDE[8] = arrayDE[8].substring(13);
                //final

                //início imprime
                JOptionPane.showMessageDialog(null, dt.Datahora() + "\n" + "\n" +
                        "Nome: " + arrayDE[4] + "\n" +
                        telefone_inteiro); //arrayDE[5]
                //final imprime

                //início grava os arquivos em txt
                ct.Gravar(dt.Datahora() + "; " +
                        arrayDE[4] + "; " +
                        telefone_inteiro + "; " +//arrayDE[5]
                        arrayDE[7] + "; " +
                        arrayDE[8]);
                //final grava os arquivos em txt

                for (int i = 0; i >= arrayDE.length; i++) {
                    arrayDE[i] = "";
                }

            }



        }
    }

    public String[] getArrayDE() {
        this.arrayDE[cont] = arrayDE[cont];
        return arrayDE;
    }

    public void setArrayDE(String[] arrayDE) {
        this.arrayDE = arrayDE;
    }
}

3 Respostas

pmlm

Não será mais fácil substituir todo esse while por

arrayDE = evento.split(",");
P

Cara nao tive tempo de analisar seu codigo linha por linha, mais o ideal 'e ja que seu array 'e pequeno e voce ja sabe onde esta dando o NullPoiterException 'e so botar em modo debug e ver as variaveis. Concerteza tem 1 null ae :wink:

T

Em relação a:

valeu cara, foram subtraídas algumas linhas do código :smiley:

e quanto a:

o problema ocorre em uma variável que se auto incrementa (cont), a primeira vez que o ramal monitorado recebe uma ligação, por exemplo, do ramal 4080, tudo ocorre como previsto, mas em uma segunda chamada do 4080 o erro é mostrado como “java.lang.NullPointerException: 14”, imagino eu que esteja procurando a 14 casa do Array, que só possui 10, mas não achei solução para isso :frowning:

Criado 8 de março de 2010
Ultima resposta 8 de mar. de 2010
Respostas 3
Participantes 3