Erro ao usar matriz para salvar valor contido em TextField

5 respostas
sergio-mbj

Pessoal, não sei se postei isso no lugar certo. Fiquei em duvida entre "Java Básico" e "Interface", mas como o erro acredito estar na OO... ...

Seguinte..

Estou percebendo um erro que acontece sempre que instancio uma matriz ao invés de um objeto só.
Criei um programa bem grande, mas pra demostrar o erro vou mostrar um menor.

Criei uma interface simples em Swing e um Jpanel. Coloquei um botão e um textfield...

Em seguida a classe "Pessoa"
public class pessoa {
    String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }



}

...

Depois voltei pra interface e instanciei um objeto da classe pessoa...

public class Interface extends javax.swing.JFrame {
    /** Creates new form Interface */

    pessoa x = new pessoa();

... Não sei se estanciei no lugar certo mas parece que funcionou normal...
Depois coloquei uma ação pro botão...

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    x.setNome(tfNome.getText());
    }

Ou seja, eu mandei salvar o texto contido do textfield na variavel "Nome" do objeto x da classe pessoa..
Executei o programa e aparentemente rodou tudo bem...

O problema..........................

Quando eu tento criar uma matriz de objetos da classe pessoa da erro ao executar..

Eu fiz algo assim:

public class Interface extends javax.swing.JFrame {
    /** Creates new form Interface */

    pessoa x[] = new pessoa[5];

.. E na ação:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    x[3].setNome(tfNome.getText());
    }

... Ao meu ver tudo bem.. Nenhum aviso de erro.. O problema é quando eu executo e aperto no botão...
Aparece o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Interface.jButton1ActionPerformed(Interface.java:106)
at Interface.access$000(Interface.java:16)
at Interface$1.actionPerformed(Interface.java:44)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
at java.awt.Component.processMouseEvent(Component.java:6106)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3276)
at java.awt.Component.processEvent(Component.java:5871)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4467)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4293)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
at java.awt.Container.dispatchEventImpl(Container.java:2149)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4293)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)

Já estou a horas encima num projeto que preciso de uma matriz, mas não da certo... :shock:

Se alguem souber onde estou errado e puder me indicar ficarei grato.. :roll:

5 Respostas

WendersonLP

Bem o erro é bem simples, é que você quando (pensa que está instaciando o vetor) na verdade você está somente limitando a quantidade de indices que o determinado vetor terá, então você deve instanciar cada índice para poder utilizá-lo. Esse é o seu erro.

sergio-mbj

A…
Sem querer ser chato… Como eu faço isso? rsrsrs
Eu estava pesquisando aqui mas não achei nada… Eu pensei que se eu criasse um vePtor da classe pessoa automaticamente estaria instanciando todos os índices… o.O :?

WendersonLP

Logo no seu construtor ou você pede, ao usuário, o tamanho do índice ou você próprio determina.
ex:

public class Interface {

         private Pessoa[] pessoa;

         public Interface(int size) {
                  
                  this.pessoa = new Pessoa[size];

                  for (int i = 0; i < size; i++)
                        this.pessoa[i] = new Pessoa();
         }
}
sergio-mbj

Cara.. Vlw mesmo... =D
Muito obrigado...
Funcionou aqui...

Na verdade eu não consegui fazer o que você disse exatamente, mas você me abriu os olhos pra essa parte de instanciação e eu entendi o que tava acontecendo.. Como sou péssimo em orientação a objeto fiz uma gambiarra... No botão salvar instanciei o objeto...
private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                         
        P[n] = new pessoa();
        P[n].setNome(tfNome.getText());

    }

Agora funcionou finalmente.. =D

WendersonLP

Bem dessa maneira também ficou muito bom, mas tome cuidado com o marcador de índice(n) porque as vezes se não incrementá-lo correntamente pode ocasionar erros!

Criado 27 de novembro de 2009
Ultima resposta 29 de nov. de 2009
Respostas 5
Participantes 2