Java - NullPointerException

noitib

Power Member
É assim, pretendo ler um ficheiro de texto , transformar cada linha num vector de 2 elementos, e o 1º elemento pô-lo num vector, e o segundo noutro.
Código:
import java.io.File;
import java.io.FileWriter;
import javax.swing.JOptionPane;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
public class Cficheiro {
    public static void main(String[] args) throws FileNotFoundException{
        Scanner fi=new Scanner(new File("jogadores.txt"));
        String nome="";
        int resp;
        String msg="";
        //Formatter fo=new Formatter(new File("jogadores.txt"));
        String lin;
        String[] pal;
        String[] nomes=null;
        int[] golos = null;
        resp=Integer.parseInt(JOptionPane.showInputDialog("Introduza a sua opção :\n 1-Ler Ficheiro \n 2-Pesquisar \n 3-Marcar"));
        switch (resp){
            
            case 1 : lerFicheiro(fi,nomes,golos); break;
            case 2 : pesquisar(fi); break;
            case 3 : marcar(fi); break;
            
        }
    }
    
    private static void lerFicheiro(Scanner fi, String[] nomes, int[] golos) throws FileNotFoundException{
        String lin;
        String[] pal;
        String msg="";
        
        int cont=0;
        
        while(fi.hasNextLine()){
            lin = fi.nextLine();
            pal = lin.split(":");
            for(int i=0; i<pal.length; i++){
               nomes[i]=pal[0];
               golos[i]=Integer.parseInt(pal[1]);
            }
            cont++;

        }
        fi.close();
        for (int i=0;i<cont;i++)
            msg+=nomes[i]+" : "+golos[i]+" golos.";
        JOptionPane.showMessageDialog(null,msg);
    }
        
        private static void marcar(Scanner fi) throws FileNotFoundException{
            String lin;
            int cont=0;
            int flag=0;
            String[] pal;
            String msg="";
            String nome=JOptionPane.showInputDialog("Insira o nome do jogador a incrementar os golos : ");
            
            while(fi.hasNextLine()){
                cont++;
                lin = fi.nextLine();
                pal = lin.split(":");
                for(int p=0; p<pal.length; p++){
                    if (pal[p].equals(nome)){
                        
                        //MARCA UM GOLO!
                    }
                    flag=1;
                }
                
            }
            if (flag==0)
                JOptionPane.showMessageDialog(null,"Jogador não encontrado");
            
        }
        
        private static void pesquisar(Scanner fi) throws FileNotFoundException{
            int flag=0;
            String lin;
            int cont=0,pos=0;
            String[] pal;
            String msg="";
            String nome=JOptionPane.showInputDialog("Insira o nome do jogador a pesquisar : ");
            while(fi.hasNextLine()){
                cont++;
                lin = fi.nextLine();
                pal = lin.split(":");
                for(int p=0; p<pal.length; p++){
                    if (pal[p].equals(nome)){
                        flag=1;
                        pos=cont;
                    }
                }
                
            }
            if (flag==1)
                JOptionPane.showMessageDialog(null,"O jogador "+nome+" está na posição "+pos+" .");
            else
                JOptionPane.showMessageDialog(null,"Jogador não encontrado");
        }
    }
o ficheiro tem o seguinte txto

Código:
Postiga:20
Lisandro:10
Quaresma:13
Leandro Lima:7

Compilo, e quando carrega o método lerFicheiro, obtenho o seguinte erro :

Exception in thread "main" java.lang.NullPointerException
at Cficheiro.lerFicheiro(Cficheiro.java:39)
at Cficheiro.main(Cficheiro.java:21)
Java Result: 1


Qualquer ajuda será bem-vinda
 
Isso onde? substituí no main, e continua com o mesmo erro. :|

Vê a linha que dá o erro. Não podes aceder a uma referência que aponta para null, vai-te dar sempre excepção. O napalm queria dizer para inicializares o vector de strings "nomes" com um número de posições pré-definido.

Código:
//Formatter fo=new Formatter(new File("jogadores.txt"));
 String lin;
String[] pal;
String[] nomes= new String[10];

Em que "10" é o tamanho do vector. Se queres algo mais dinâmico faz uma ArrayList e vai adicionando :P
 
Bah, que noobice tão grande, não dediquei muito tempo a compreender vectores em java :oops:

Obrigado, daqui a bocado venho cá outra vez pq cheira-me que não vou atinar com a escrita de ficheiro.
 
Novo upadte, desta vez com outro erro :neutral:

Código:
import java.io.File;
import java.io.FileWriter;
import javax.swing.JOptionPane;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
public class Cficheiro {
    public static void main(String[] args) throws FileNotFoundException{
        Scanner fi=new Scanner(new File("jogadores.txt"));
        String nome="";
        int resp;
        String msg="";
        //Formatter fo=new Formatter(new File("jogadores.txt"));
        String lin;
        String[] pal;
        String[] nomes=new String[4];
        int[] golos = new int[4];
        resp=Integer.parseInt(JOptionPane.showInputDialog("Introduza a sua opção :\n 1-Ler Ficheiro \n 2-Pesquisar \n 3-Marcar"));
        switch (resp){
            
            case 1 : lerFicheiro(fi,nomes,golos); break;
            case 2 : pesquisar(fi,nomes,golos); break;
            case 3 : marcar(fi,nomes,golos); break;
            
        }
    }
    
    private static void lerFicheiro(Scanner fi, String[] nomes, int[] golos) throws FileNotFoundException{
        String lin;
        String[] pal;
        String msg="";
        int resp;
        int cont=0;
        
        while(fi.hasNextLine()){
            lin = fi.nextLine();
            pal = lin.split(":");
            for(int i=0; i<pal.length; i++){
                nomes[i]=pal[0];
                if (i==0)
                    msg+=nomes[i]+" : ";
                golos[i]=Integer.parseInt(pal[1]);
                if (i==1)
                    msg+=golos[i]+" golos. \n";
                
            }
            cont++;
            
        }
        fi.close();
        
        JOptionPane.showMessageDialog(null,msg);
        
        resp=Integer.parseInt(JOptionPane.showInputDialog("Introduza a sua opção :\n 1-Ler Ficheiro \n 2-Pesquisar \n 3-Marcar"));
        switch (resp){
            
            case 1 : lerFicheiro(fi,nomes,golos); break;
            case 2 : pesquisar(fi,nomes,golos); break;
            case 3 : marcar(fi,nomes,golos); break;
            
        }
    }
    
    private static void marcar(Scanner fi, String[] nomes, int[] golos) throws FileNotFoundException{
        String lin;
        int cont=0;
        int flag=0;
        String[] pal;
        String msg="";
        String nome=JOptionPane.showInputDialog("Insira o nome do jogador a incrementar os golos : ");
        
        while(fi.hasNextLine()){
            cont++;
            lin = fi.nextLine();
            pal = lin.split(":");
            for(int p=0; p<pal.length; p++){
                if (pal[p].equals(nome)){
                    
                    //MARCA UM GOLO!
                }
                flag=1;
            }
        }
        if (flag==0)
            JOptionPane.showMessageDialog(null,"Jogador não encontrado");
     fi.close();   
    }
    
    private static void pesquisar(Scanner fi, String[] nomes, int[] golos) throws FileNotFoundException{
        int flag=0;
        String lin;
        int cont=0,pos=0;
        String[] pal;
        String msg="";
        String nome=JOptionPane.showInputDialog("Insira o nome do jogador a pesquisar : ");
        while(fi.hasNextLine()){
            cont++;
            lin = fi.nextLine();
            pal = lin.split(":");
            for(int p=0; p<pal.length; p++){
                if (nomes[p].equals(nome)){
                    flag=1;
                    pos=cont;
                }
            }
        }
        if (flag==1)
            JOptionPane.showMessageDialog(null,"O jogador "+nome+" está na posição "+pos+" .");
        else
            JOptionPane.showMessageDialog(null,"Jogador não encontrado");
           
        fi.close(); 
    }

}


Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Scanner.java:1046)
at java.util.Scanner.findWithinHorizon(Scanner.java:1644)
at java.util.Scanner.hasNextLine(Scanner.java:1476)
at Cficheiro.pesquisar(Cficheiro.java:96)
at Cficheiro.lerFicheiro(Cficheiro.java:58)
at Cficheiro.main(Cficheiro.java:21)
Java Result: 1




Para facilitar a quem tiver a amabilidade de me ajudar:

linha 21 : case 1 : lerFicheiro(fi,nomes,golos); break;
linha 58 : case 2 : pesquisar(fi,nomes,golos); break;
linha 96 : while(fi.hasNextLine()){

curiosamente, tudo linhas com fi.
 
Mas não convém fechar o ficheiro de cada vez que é usado?

Sim, mas tu logo a seguir tás a tentar usar o ficheiro quando ele já está fechado.

}
fi.close();

JOptionPane.showMessageDialog(null,msg);

resp=Integer.parseInt(JOptionPane.showInputDialog("Introduza a sua opção :\n 1-Ler Ficheiro \n 2-Pesquisar \n 3-Marcar"));
switch (resp){

case 1 : lerFicheiro(fi,nomes,golos); break;
case 2 : pesquisar(fi,nomes,golos); break;
case 3 : marcar(fi,nomes,golos); break;


}
 
Back
Topo