Pergunta

RESPOSTA:

Se você já viu essas linhas e são mistified como eu era, aqui está o que eles significam.

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

Não é que as variáveis ??estão indisponíveis porque eles estão à espreita atrás de um manto de mistério em um úmido em algum lugar biblioteca. Não, não, eles simplesmente saiu do alcance! Ainda é culpa sua, você ainda tem que encontrar o nulo, e não, você não pode culpar a biblioteca. importante lição!

PERGUNTA:

Uma das coisas mais frustrantes para mim, como um iniciante é bibliotecas! É uma relação de amor / ódio: Por um lado, eles deixe-me fazer coisas que normalmente não sabem como fazer com o código que eu entendo, por outro lado, porque eu não entendê-los completamente, eles às vezes jogar um chave no código que é de outra forma funcionando bem! É porque eu não entendo os erros que podem ocorrer ao usar essas bibliotecas, porque eu não escrevê-los, e por causa eclipse não me dá muito para ir com quando uma das importações começa agindo para cima ...

Então, aqui está o problema: Eu tenho trabalhado com java.awt.event para lidar com um monte de JButtons na tela para isso e aquilo. Eu recebo um erro quando eu uso um dos botões que eu fiz. O erro é:

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

O que isso significa? O que poderia estar causando isso? Eu estou envergonhado de código postal, mas se você pode estar a tentar decifrar o meu estilo terrível, aqui é o método que parece causar este erro para ser jogado.

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    String name;

code...

if(cmd.equals("Play")) {
        name = field.getText();
        card = getCard(name);

        if(card != null) {
            if(rules.zoneHasCard(card, rules.hand)) {
                display.updateStatusMessage(rules.play(card));
                field.setText("");
                display.updateHand(rules.zoneList("hand"));
                display.updateDiscard(rules.zoneList("Discard")); // This is the error here! The discard Zone was empty!
            }
            else {
                field.setText("You do not have " + card.getName());
                field.selectAll();
            }
        }
        else {
            field.setText("That cardname is unused");
            field.selectAll();
        }
    }
}
Foi útil?

Solução

Bem-vindo à complexidade de escrever código GUI.

Quando você executa um programa Swing, uma discussão de fundo chamado de Tópico Despacho Evento é criado. Quando o usuário clica em um JButton, por exemplo, JButton cria e dispara um evento usando este Tópico Despacho Evento. Daí o nome: é o segmento que despacha eventos

O seu código:

public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String name;

// more code...
}

é chamado por este Tópico Despacho Evento, assim que seu código pode manipular o evento.

Em algum lugar dentro de seu código que você está tentando fazer algo com uma variável que é atualmente igual a nulo. A mensagem de erro está lhe dizendo, "hey durante a execução de algum código no segmento de eventos expedição, eu encontrei um NullPointerException" em seu código .

Por que você não receber mais informações? Possivelmente você configurou Eclipse não incluir informações de depuração quando compilar?

Por enquanto, eu recomendo adicionar algumas linhas ao seu método actionPerformed para mostrar o estado de variáveis:

System.out.println("field = " + field);
System.out.println("rules = " + rules);
System.out.println("display = " + display);

Veja se isso mostra quaisquer valores nulos.

Mesmo que o NullPointerException vem de uma biblioteca, o rastreamento de pilha irá mostrar qual linha de seu código de chamada que a biblioteca. Mas só se você tiver configurado o Eclipse para gerar informações de depuração.

A longo prazo, o trabalho através do balanço do Sol Tutorial para aprender mais sobre estas questões.

Outras dicas

Qualquer chamada de método em um objeto nulo irá levantar uma exceção de ponteiro nulo.

Em seu código, regras, nome ou o visor pode ser nulo e causar uma exceção.

Use um depurador (como o incluído no IDE Eclipse) e definir um ponto de interrupção no início do método actionPerformed (), então passo através de linha por linha para ver quando uma variável tentar invocar um método em é nulo.

Apenas não pare de ler o rastreamento de pilha depois de duas linhas. Em algum lugar na pilha rastrear você vai reconhecer o nome de uma das classes / métodos que você tenha escrito. Comece a olhar lá. (Aliás, as pessoas gastam maneira de muito tempo dentro depuradores: -))

Você pode ter esquecido de realmente definir um ActionCommand.

Na ActionEvent Doc API há uma nota sobre possíveis resultados nulos de getActionCommand ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top