Não consigo acessar uma variável!

3 respostas
knop

Tô com um pequeno problema galera... Criei uma classe que chamei de MyFile. Bastante intuitiva, ela "cria" um arquivo cujo nome é passado como parêmtro e possui 2 métodos. Um para gravar neste arquivo e um para ler deste arquivo. Como sou novo no Java, sai procurando métodos que poderiam exercer essa funções e encontrei aqui no GUJ. Tive que dar uma adaptada, pra não dizer "mangueada", pra fazer o que eu queria.
Resumindo... Meu método de ler o arquivo pega cada linha do arquivo e armazena numa String bidimensional. Faço isso para posterior inserção numa JTable. Poderiam dar uma olhada no meu código?

public class MyFile {
    
    String filepath = new String("data\");
    File arquivo ;
    String[][] data;
    
    public MyFile (String nomeArquivo){
        
        arquivo = new File(filepath + nomeArquivo);    
        if (arquivo.exists()){
            System.out.println("Arquivo encontrado!!!");                
        }
        else{
            System.out.println("Arquivo nao encontrado!!!");
        }
    }
    
    public void leArquivo(String nomeArquivo, int cont) {
        
        FileInputStream   fileInputStream;
        InputStreamReader inputStreamReader;
        LineNumberReader  lineNumberReader;
                                        
        // ABRIR ARQUIVO 
        try {
            
            int i=0;
                
            fileInputStream   = new FileInputStream(arquivo);
            inputStreamReader = new InputStreamReader(fileInputStream);
            lineNumberReader  = new LineNumberReader(inputStreamReader);
                
            String linha;
                
            linha = lineNumberReader.readLine();                                       
            StringTokenizer tk = new StringTokenizer(linha, "*");  
                
            String[][] data = new String[cont][tk.countTokens()];               
            data[i][0] = tk.nextToken();
                
            int j=1;
            while (tk.hasMoreTokens()){                   
                data[i][j] = tk.nextToken();
                j++;
                }
            i++;
            
            while(lineNumberReader.ready()) {
                
                linha = lineNumberReader.readLine();                                       
                tk = new StringTokenizer(linha, "*");
                data[i][0] = tk.nextToken();
                                        
                j=1;
                while (tk.hasMoreTokens()){                  
                    data[i][j] = tk.nextToken();
                    j++;
                    }
                i++;                    
                }      
        }
        catch (FileNotFoundException fileNotFoundException) {
            System.out.println(fileNotFoundException);
        }
        catch (IOException ioException) {
            System.out.println(ioException);
        }
    }
}

Já executei esse código e chequei a construção da String. Está tudo OK! Consigo acessar a string data de dentro desse método perfeitamente. Os dados estão todos armazenados na string. O problema é quando chamo no main a minha classe. Dêem uma olhada de como fiz:

public static void main(String[] args) {
        // TODO code application logic here 
        
        MyFile file = new MyFile("clientes.txt");
        file.leArquivo("clientes.txt",5);
        System.out.println(file.data[0][0]);
}

Quando faço isso o seguinte erro ocorre: Exception in thread "main" java.lang.NullPointerException

Pelo que entendi, não to conseguindo acessar a variável data pois ela aponta para null. É isso mesmo? Aguardo pela ajuda de vocês! Abraços.

3 Respostas

leonardom

knop, vc possui duas variaves data um pertence a classe e uma outra vc esta declarando dentro do metodo. Os dados q vc esta lendo estam ficando armazenados na variavel data do seu metodo, essa variavel é local e deixa de existir assim q o metodo termina de executar. Para funcionar de forma corrente tire a declaração da variavel data de dentro do seu metodo ficando dessa maneira:

this.data = new String[cont][tk.countTokens()];

Assim vc somente está inicializando a variaves data e não declarando uma nova

knop

Meu deus! Ainda não me acostumei com essas coisas do Java… tal praticidade nãi tenho no C! hehehe. Valeu pela ajuda! :smiley: :smiley: :smiley:

F
String[][] data = new String[cont][tk.countTokens()];               
             data[i][0] = tk.nextToken();

Voce esta declarando novamente uma variavel data[][] mas com o escopo local.

dica meio burra mas acho que vai funcionar.
Ma se vc quiser ficar trabalhando assim mesmo, ai vai:

String[][] data_aux = new String[cont][tk.countTokens()];               
             data_aux[i][0] = tk.nextToken();

// depois de feito todas a operações com o data_aux[][]
// armazene-o na variavel data[][]
data = data_aux;
Criado 27 de julho de 2005
Ultima resposta 27 de jul. de 2005
Respostas 3
Participantes 3