我的列表一直将它的头部和尾部作为零

时间:2016-07-04 00:55:51

标签: java list nullpointerexception tail head

我是新来的,我目前正在为大学编写一些代码。

我已经为我的项目开发了一个代码但是我的列表的头部和尾部仍然会返回null,即使程序本身读取了它想要从中获取信息的文件。你能帮助我吗?

以下是有问题的代码:

    package projectosalarios;
import java.io.BufferedWriter;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

class Funcionario{
    String Nome;
    String BI;
    int Departamento;
    int Cargo;
    int Salario;
    public Funcionario(String Nome, String BI, int Departamento, int Cargo, int Salario){
        this.Nome = Nome;
        this.BI = BI;
        this.Departamento = Departamento;
        this.Cargo = Cargo;
        this.Salario = Salario;
    }

}

class Lista {
    Node head;
    Node tail;

    public static void add(Lista Lista, Funcionario NovoFuncionario) {
        Node novoNo = new Node (NovoFuncionario);
                if(Lista.head == null){
                    Lista.head = novoNo;
                    Lista.tail = novoNo;
                    }else {
                    novoNo.next = Lista.head;
                Lista.head = novoNo;
        }
    }
}


class Node{
    Funcionario value;
    Node next;
    public Node(Funcionario value){
        this.value = value;
    }
}

public class ProjectoSalarios {


    public static void main(String[] args) throws IOException {

        String NomeFicheiro = "C:\\Users\\Nelson\\Documents\\NetBeansProjects\\ProjectoSalarios\\funcionarios.txt";
        String NomeFicheiro2 = "C:\\Users\\Nelson\\Documents\\NetBeansProjects\\ProjectoSalarios\\salarios.txt";

        Lista ListaFuncionario = new Lista();

        int ArraySalario[];
        ArraySalario = new int[15];

        try{
            File Ficheiro2 = new File(NomeFicheiro2);
            try (Scanner leitorFicheiro = new Scanner (Ficheiro2)) {

                while(leitorFicheiro.hasNextLine()){
                    String linha = leitorFicheiro.nextLine();
                    String dados[] = linha.split(":");
                    int Cargo = Integer.parseInt(dados[0]);
                    int Valor = Integer.parseInt(dados[1]);
                    ArraySalario[Cargo-1]= Valor;

                }
            }

        } catch (FileNotFoundException exception) {
            String mensagem = "Erro: o ficheiro " + NomeFicheiro2 + " não foi encontrado.";
            System.out.println(mensagem);
        }

        try{
            File Ficheiro = new File(NomeFicheiro);
            Scanner leitorFicheiro = new Scanner(Ficheiro);
            Funcionario NovoFuncionario;
            while(leitorFicheiro.hasNextLine()){
                String Linha = leitorFicheiro.nextLine();
                String dados[] = Linha.split(":");
                String Nome = dados[0];
                String BI = dados[1];
                int Departamento = Integer.parseInt(dados[2]);
                int Cargo = Integer.parseInt(dados[3]);


                NovoFuncionario = new Funcionario(Nome, BI, Departamento, Cargo, ArraySalario[Cargo-1]); 
                Lista.add(ListaFuncionario, NovoFuncionario);
            }
        }catch (FileNotFoundException exception) {
            String mensagem = "Erro: o ficheiro " + NomeFicheiro + " não foi encontrado.";
            System.out.println(mensagem);
        }

        try (BufferedWriter Writer = new BufferedWriter ( new FileWriter("C:\\Users\\Nelson\\Documents\\NetBeansProjects\\ProjectoSalarios\\output.txt"))) {
            Writer.write(ProcurarSalario(ListaFuncionario, "12312355"));
            Writer.write(SomaSalario(ListaFuncionario, 1));
            Writer.write(SomaSalarioCargo(ListaFuncionario, 1));
            Writer.write(SalarioAlto(ListaFuncionario, 1000));
            Writer.write(SalarioAltoPessoas(ListaFuncionario, 1000));
            Writer.write(SalarioBaixo(ListaFuncionario, 1000));
            Writer.write(SalarioBaixoPessoas(ListaFuncionario, 1000));
            Writer.write(SalarioAltoDepartamento(ListaFuncionario, 1));
            Writer.write(SalarioBaixoDepartamento(ListaFuncionario, 1));
            Writer.write(Duplicados(ListaFuncionario, "12312355"));
        }

    }

    static int ProcurarSalario(Lista Lista, String BI){ //1
        Node Copy = Lista.head;
        while(Copy!=null){
            if(Copy.value.BI.equals(BI)){
                return Copy.value.Salario;
            }
   Copy = Copy.next;
        }return 0;
    }

    static int SomaSalario(Lista Lista, int Departamento){ //2
        Node Copy = Lista.head;
        int Sum= 0;
        while(Copy !=null){
            if(Copy.value.Departamento == 10){
                Sum+=Copy.value.Salario;
            }
            Copy = Copy.next;
        }return Sum;
    }

    static int SomaSalarioCargo(Lista Lista, int Cargo){ //3
        Node Copy = Lista.head;
        int Sum = 0;
        while (Copy !=null){
            if(Copy.value.Cargo == 3){
                Sum+=Copy.value.Salario;
            }
            Copy = Copy.next;
        }return Sum;
    }

    static int SalarioAlto(Lista Lista, int Salario){ //4
        Node Copy = Lista.head;
        while(Copy !=null && Copy.next != null){ //CHECK HERE
            if(Copy.value.Salario < Copy.next.value.Salario ){
                Copy = Copy.next;
            }else{
                Copy.next = Copy.next.next;
            }
        }return Copy.value.Salario;
    }

    static int SalarioAltoPessoas(Lista Lista, int Salario){ //5
        Node Copy = Lista.head;
        int i = 1;
        while(Copy !=null && Copy.next != null){ //CHECK HERE
            if(Copy.value.Salario < Copy.next.value.Salario ){
                Copy = Copy.next;
                i=1;
            }else if(Copy.value.Salario > Copy.next.value.Salario){
                Copy.next = Copy.next.next;
            }else{
                i++;
                Copy.next = Copy.next.next;
            }
        }return i;
    }

    static int SalarioBaixo(Lista Lista, int Salario){ //6
        Node Copy = Lista.head;
        while(Copy !=null && Copy.next != null){ //CHECK HERE
            if(Copy.value.Salario > Copy.next.value.Salario ){
                Copy = Copy.next;
            }else{
                Copy.next = Copy.next.next;
            }
        }return Copy.value.Salario;
    }



    static int SalarioBaixoPessoas(Lista Lista, int Salario){ //7
        Node Copy = Lista.head;
        int i = 1;
        while(Copy !=null && Copy.next != null){ //CHECK HERE
            if(Copy.value.Salario > Copy.next.value.Salario ){
                Copy = Copy.next;
                i=1;
            }else if(Copy.value.Salario < Copy.next.value.Salario){
                Copy.next = Copy.next.next;
            }else{
                i++;
                Copy.next = Copy.next.next;
            }
        }return i;
    }

    static int SalarioAltoDepartamento(Lista Lista, int Departamento){ //8
        Node Copy = Lista.head;
        int departamento [] = new int [10];
        while(Copy!=null){
            departamento[Copy.value.Departamento-1] += Copy.value.Salario;
            Copy=Copy.next;
        }
        int Maximo=departamento[0];
        int Codigo=0;
        for(int i : departamento) {
            if(departamento [i] > Maximo){
                Maximo = departamento[i];
                Codigo=i+1;
            }
        }return Codigo;
    }

    static int SalarioBaixoDepartamento(Lista Lista, int Departamento){ //9
        Node Copy = Lista.head;
        int departamento [] = new int [10];
        while(Copy!=null){
            departamento[Copy.value.Departamento-1] += Copy.value.Salario;
            Copy=Copy.next;
        }

        int f=0;
        if(departamento[f] == 0){
            f++;
        }
        int Minimo = departamento[f];
        int Codigo=0;
        for(int i : departamento) {
            if(departamento [i] <= Minimo && departamento [i] != 0){
                Minimo = departamento[i];
                Codigo=i+1;
            }
        }return Codigo;
    }

    static String Duplicados(Lista Lista, String BI){
        Node Copy = Lista.head;
        String Escrita =BI;
        while(Copy!=null){
            if(!Copy.value.BI.equals(BI)){
                Copy = Copy.next;
            }else{
                Escrita += ";" + Copy.value.Nome ;
                Copy = Copy.next;
                }
            if(Escrita.equals(BI)){
                Escrita = "Nenhum";
            }
        }return Escrita;
    }





}

*编辑:

在文件中你可以找到:

funcionarios.txt

Victor Valente:12312355:1:1
João Neves:12312777:10:1
Ivo Leite:12343119:10:2
Osvaldo Pires:12312765:2:1
Tiago Santos:12302050:2:2
Joana Cegripe:12999121:2:3
João Almeida:12340050:5:3
Rui Sebastião:12319101:10:3
Miguel Patrocínio:14233000:3:2
Raquel Cunhada:14244111:2:7
Luís Prima:12319101:1:1

salarios.txt

1:1000
2:1050
3:1200
4:1080
5:1700
6:1081
7:1700
8:1010
9:1910
10:890

我也尝试过调试,但没有迹象表明我的代码有什么问题。

*编辑: 代码已更新,但仍未填写我的列表。

1 个答案:

答案 0 :(得分:0)

您必须检查copy.next是否为空。因为您正在访问copy.next.value而不检查copy.next是否为null。

Copy !=null && Copy.next != null

所以你必须添加这个条件才能不抛出nullpointerexception。

class Funcionario {
    String Nome;
    String BI;
    int Departamento;
    int Cargo;
    int Salario;

    public Funcionario(String Nome, String BI, int Departamento, int Cargo,
            int Salario) {
        this.Nome = Nome;
        this.BI = BI;
        this.Departamento = Departamento;
        this.Cargo = Cargo;
        this.Salario = Salario;
    }

}

class Lista {
    Node head;
    Node tail;

    public static void add(Lista Lista, Funcionario NovoFuncionario) {
        Node Novo = new Node(NovoFuncionario);
        if (Lista.head == null) {
            Lista.head = Novo;
            Lista.tail = Novo;
        } else {
            Lista.tail.next = Novo;
            Lista.tail = Novo;
        }
    }

    public static void display(Lista Lista) {
        Node tmp = Lista.head;
        while (tmp != null) {
            System.out.println(tmp.value.Nome);
            tmp = tmp.next;
        }
    }

}

class Node {
    Funcionario value;
    Node next;

    public Node(Funcionario value) {
        this.value = value;
    }
}

public class ProjectoSalarios {

    public static void main(String[] args) {

        String NomeFicheiro = "/home/name/Desktop/funcionarios.txt";
        String NomeFicheiro2 = "/home/name/Desktop/salarios.txt";

        Lista ListaFuncionario = new Lista();

        try {
            File Ficheiro2 = new File(NomeFicheiro2);
            Scanner leitorFicheiro = new Scanner(Ficheiro2);

            int ArraySalario[];
            ArraySalario = new int[15];
            while (leitorFicheiro.hasNextLine()) {
                String linha = leitorFicheiro.nextLine();
                String dados[] = linha.split(":");
                int Cargo = Integer.parseInt(dados[0]);
                int Valor = Integer.parseInt(dados[1]);
                ArraySalario[Cargo - 1] = Valor;

            }
            File Ficheiro = new File(NomeFicheiro);
            leitorFicheiro = new Scanner(Ficheiro);

            while (leitorFicheiro.hasNextLine()) {
                String Linha = leitorFicheiro.nextLine();
                String dados[] = Linha.split(":");
                String Nome = dados[0];
                String BI = dados[1];
                int Departamento = Integer.parseInt(dados[2]);
                int Cargo = Integer.parseInt(dados[3]);

                Funcionario NovoFuncionario = new Funcionario(Nome, BI,
                        Departamento, Cargo, ArraySalario[Cargo - 1]);
                Lista.add(ListaFuncionario, NovoFuncionario);
            }
            Lista.display(ListaFuncionario);
            leitorFicheiro.close();

            /*
             * BufferedWriter Writer = new BufferedWriter ( new
             * FileWriter("/home/name/Desktop/output.txt"));
             * Writer.write(ProcurarSalario(ListaFuncionario, "12312355"));
             * Writer.newLine(); Writer.write(SomaSalario(ListaFuncionario, 1));
             * Writer.newLine(); Writer.write(SomaSalarioCargo(ListaFuncionario,
             * 1)); Writer.newLine(); Writer.write(SalarioAlto(ListaFuncionario,
             * 1000)); Writer.newLine();
             * Writer.write(SalarioAltoPessoas(ListaFuncionario, 1000));
             * Writer.newLine(); Writer.write(SalarioBaixo(ListaFuncionario,
             * 1000)); Writer.newLine();
             * Writer.write(SalarioBaixoPessoas(ListaFuncionario, 1000));
             * Writer.newLine();
             * Writer.write(SalarioAltoDepartamento(ListaFuncionario, 1));
             * Writer.newLine();
             * Writer.write(SalarioBaixoDepartamento(ListaFuncionario, 1));
             * Writer.newLine(); Writer.write(Duplicados(ListaFuncionario,
             * "12312355")); Writer.close();
             */
            System.out.println(ProcurarSalario(ListaFuncionario, "12312355"));
            System.out.println(SomaSalario(ListaFuncionario, 1));
            System.out.println(SomaSalarioCargo(ListaFuncionario, 1));
            System.out.println(SalarioAlto(ListaFuncionario, 1000));
            System.out.println(SalarioAltoPessoas(ListaFuncionario, 1000));
            System.out.println(SalarioBaixo(ListaFuncionario, 1000));
            System.out.println(SalarioBaixoPessoas(ListaFuncionario, 1000));
            System.out.println(SalarioAltoDepartamento(ListaFuncionario, 1));
            System.out.println(SalarioBaixoDepartamento(ListaFuncionario, 1));
            System.out.println(SalarioBaixoDepartamento(ListaFuncionario, 1));
            System.out.println(Duplicados(ListaFuncionario, "12312355"));

        } catch (FileNotFoundException exception) {
            String mensagem = "Erro: o ficheiro " + NomeFicheiro + " ou "
                    + NomeFicheiro2 + " não foi encontrado.";
            System.out.println(mensagem);

        } catch (IOException ex) {
            Logger.getLogger(ProjectoSalarios.class.getName()).log(
                    Level.SEVERE, null, ex);
        }

    }

    static int ProcurarSalario(Lista Lista, String BI) { // 1
        Node Copy = Lista.head;
        while (Copy != null) {
            if (Copy.value.BI.equals(BI)) {
                return Copy.value.Salario;
            }
            Copy = Copy.next;
        }
        return 0;
    }

    static int SomaSalario(Lista Lista, int Departamento) { // 2
        Node Copy = Lista.head;
        int Sum = 0;
        while (Copy != null) {
            if (Copy.value.Departamento == 10) {
                Sum += Copy.value.Salario;
            }
            Copy = Copy.next;
        }
        return Sum;
    }

    static int SomaSalarioCargo(Lista Lista, int Cargo) { // 3
        Node Copy = Lista.head;
        int Sum = 0;
        while (Copy != null) {
            if (Copy.value.Cargo == 3) {
                Sum += Copy.value.Salario;
            }
            Copy = Copy.next;
        }
        return Sum;
    }

    static int SalarioAlto(Lista Lista, int Salario) { // 4
        Node Copy = Lista.head;
        while (Copy != null && Copy.next != null) {
            if (Copy.value.Salario < Copy.next.value.Salario) {
                Copy = Copy.next;
            } else {
                Copy.next = Copy.next.next;
            }
        }
        return Copy.value.Salario;
    }

    static int SalarioAltoPessoas(Lista Lista, int Salario) { // 5
        Node Copy = Lista.head;
        int i = 1;
        while (Copy != null && Copy.next != null) {
            if (Copy.value.Salario < Copy.next.value.Salario) {
                Copy = Copy.next;
                i = 1;
            } else if (Copy.value.Salario > Copy.next.value.Salario) {
                Copy.next = Copy.next.next;
            } else {
                i++;
                Copy.next = Copy.next.next;
            }
        }
        return i;
    }

    static int SalarioBaixo(Lista Lista, int Salario) { // 6
        Node Copy = Lista.head;
        while (Copy != null && Copy.next != null) {
            if (Copy.value.Salario > Copy.next.value.Salario) {
                Copy = Copy.next;
            } else {
                Copy.next = Copy.next.next;
            }
        }
        return Copy.value.Salario;
    }

    static int SalarioBaixoPessoas(Lista Lista, int Salario) { // 7
        Node Copy = Lista.head;
        int i = 1;
        while (Copy != null && Copy.next != null) {
            if (Copy.value.Salario > Copy.next.value.Salario) {
                Copy = Copy.next;
                i = 1;
            } else if (Copy.value.Salario < Copy.next.value.Salario) {
                Copy.next = Copy.next.next;
            } else {
                i++;
                Copy.next = Copy.next.next;
            }
        }
        return i;
    }

    static int SalarioAltoDepartamento(Lista Lista, int Departamento) { // 8
        Node Copy = Lista.head;
        int departamento[] = new int[10];
        while (Copy != null) {
            departamento[Copy.value.Departamento - 1] += Copy.value.Salario;
            Copy = Copy.next;
        }
        int Maximo = departamento[0];
        int Codigo = 0;
        for (int i = 0; i < 10; i++) {
            if (departamento[i] > Maximo) {
                Maximo = departamento[i];
                Codigo = i + 1;
            }
        }
        return Codigo;
    }

    static int SalarioBaixoDepartamento(Lista Lista, int Departamento) { // 9
        Node Copy = Lista.head;
        int departamento[] = new int[10];
        while (Copy != null) {
            departamento[Copy.value.Departamento - 1] += Copy.value.Salario;
            Copy = Copy.next;
        }

        int f = 0;
        if (departamento[f] == 0) {
            f++;
        }
        int Minimo = departamento[f];
        int Codigo = 0;
        for (int i = 0; i < 10; i++) {
            if (departamento[i] <= Minimo && departamento[i] != 0) {
                Minimo = departamento[i];
                Codigo = i + 1;
            }
        }
        return Codigo;
    }

    static String Duplicados(Lista Lista, String BI) {
        Node Copy = Lista.head;
        String Escrita = BI;
        while (Copy != null) {
            if (!Copy.value.BI.equals(BI)) {
                Copy = Copy.next;
            } else {
                Escrita += ";" + Copy.value.Nome;
                Copy = Copy.next;
            }
            if (Escrita.equals(BI)) {
                Escrita = "Nenhum";
            }
        }
        return Escrita;
    }

}