Class to generate CPF does not print in the console

3

I can not print the generated CPFs on the console.

I am studying this code and I do not understand the problem, can anyone help me to understand and learn to use this code, please?

package geraCPF;

import java.util.ArrayList;

import javax.swing.text.MaskFormatter;

public class GeraCPF {
    private ArrayList<Integer> listaAleatoria = new ArrayList<Integer>();
    private ArrayList<Integer> listaNumMultiplicados = null;

    //Metodo para geracao de um numero aleatorio entre 0 e 9
    public int geraNumAleatorio(){
        //Note que foi preciso fazer um cast para int, ja que Math.random() retorna um double
        int numero = (int) (Math.random() * 10);

        return numero;
    }   

    //Metodo para geracao de parte do nosso CPF (aqui geramos apenas os 9 primeiros digitos)
    public ArrayList<Integer> geraCPFParcial(){
        for(int i = 0; i < 9; i++){
            listaAleatoria.add(geraNumAleatorio());
        }

        return listaAleatoria;
    }

    //Metodo para geracao do primeiro digito verificador (para isso nos baseamos nos 9 digitos aleatorios gerados anteriormente)
    public ArrayList<Integer> geraPrimeiroDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int primeiroDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 10;

        //Para cada item na lista multiplicamos seu valor pelo seu peso
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o primeiro digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            primeiroDigito = 0;
        } else{
            primeiroDigito = 11 - restoDivisao;
        }

        //Apos gerar o primeiro digito o adicionamos a lista
        listaAleatoria.add(primeiroDigito);

        return listaAleatoria;
    }

    //Metodo para geracao do segundo digito verificador (para isso nos baseamos nos 9 digitos aleatorios + o primeiro digito verificador)
    public ArrayList<Integer> geraSegundoDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int segundoDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 11;

        //Para cada item na lista multiplicamos seu valor pelo seu peso (observe que com o aumento da lista o peso tambem aumenta)
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o segundo digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            segundoDigito = 0;
        } else{
            segundoDigito = 11 - restoDivisao;
        }

        //Apos gerar o segundo digito o adicionamos a lista
        listaAleatoria.add(segundoDigito);

        return listaAleatoria;
    }

    //Agora que temos nossa lista com todos os digitos que precisamos vamos formatar os valores de acordo com a mascara do CPF
    public String geraCPFFinal() {
        //Primeiro executamos os metodos de geracao
        geraCPFParcial();
        geraPrimeiroDigito();
        geraSegundoDigito();

        String cpf = "";
        String texto = "";

        /*Aqui vamos concatenar todos os valores da lista em uma string
          Por que isso? Porque a formatacao que o ArrayList gera me impossibilitaria de usar a mascara,
          pois junto com os numeros gerados ele tambem gera caracteres especias. Ex.: lista com inteiros (de 1 a 5)
          [1 , 2 , 3 , 4 , 5]
          Dessa forma o sistema geraria a excecao ParseException*/
        for(int item : listaAleatoria){
            texto += item;
        }

        //Dentro do bloco try.. catch.. tentaremos adicionar uma mascara ao nosso CPF
        try{
            MaskFormatter mf = new MaskFormatter("###.###.###-##");  
            mf.setValueContainsLiteralCharacters(false);
            cpf = mf.valueToString(texto);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        System.out.println(geraCPFFinal());

        return cpf; 


    }
}
    
asked by anonymous 14.01.2016 / 15:33

1 answer

3

Removing the recursion worked:

import java.util.ArrayList;

import javax.swing.text.MaskFormatter;

class GeraCPF {
    private ArrayList<Integer> listaAleatoria = new ArrayList<Integer>();
    private ArrayList<Integer> listaNumMultiplicados = null;

    //Metodo para geracao de um numero aleatorio entre 0 e 9
    public int geraNumAleatorio(){
        //Note que foi preciso fazer um cast para int, ja que Math.random() retorna um double
        int numero = (int) (Math.random() * 10);

        return numero;
    }   

    //Metodo para geracao de parte do nosso CPF (aqui geramos apenas os 9 primeiros digitos)
    public ArrayList<Integer> geraCPFParcial(){
        for(int i = 0; i < 9; i++){
            listaAleatoria.add(geraNumAleatorio());
        }

        return listaAleatoria;
    }

    //Metodo para geracao do primeiro digito verificador (para isso nos baseamos nos 9 digitos aleatorios gerados anteriormente)
    public ArrayList<Integer> geraPrimeiroDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int primeiroDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 10;

        //Para cada item na lista multiplicamos seu valor pelo seu peso
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o primeiro digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            primeiroDigito = 0;
        } else{
            primeiroDigito = 11 - restoDivisao;
        }

        //Apos gerar o primeiro digito o adicionamos a lista
        listaAleatoria.add(primeiroDigito);

        return listaAleatoria;
    }

    //Metodo para geracao do segundo digito verificador (para isso nos baseamos nos 9 digitos aleatorios + o primeiro digito verificador)
    public ArrayList<Integer> geraSegundoDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int segundoDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 11;

        //Para cada item na lista multiplicamos seu valor pelo seu peso (observe que com o aumento da lista o peso tambem aumenta)
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o segundo digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            segundoDigito = 0;
        } else{
            segundoDigito = 11 - restoDivisao;
        }

        //Apos gerar o segundo digito o adicionamos a lista
        listaAleatoria.add(segundoDigito);

        return listaAleatoria;
    }

    //Agora que temos nossa lista com todos os digitos que precisamos vamos formatar os valores de acordo com a mascara do CPF
    public String geraCPFFinal() {
        //Primeiro executamos os metodos de geracao
        geraCPFParcial();
        geraPrimeiroDigito();
        geraSegundoDigito();

        String cpf = "";
        String texto = "";

        /*Aqui vamos concatenar todos os valores da lista em uma string
          Por que isso? Porque a formatacao que o ArrayList gera me impossibilitaria de usar a mascara,
          pois junto com os numeros gerados ele tambem gera caracteres especias. Ex.: lista com inteiros (de 1 a 5)
          [1 , 2 , 3 , 4 , 5]
          Dessa forma o sistema geraria a excecao ParseException*/
        for(int item : listaAleatoria){
            texto += Integer.toString(item);
        }

        //Dentro do bloco try.. catch.. tentaremos adicionar uma mascara ao nosso CPF
        try {
            MaskFormatter mf = new MaskFormatter("###.###.###-##");  
            mf.setValueContainsLiteralCharacters(false);
            cpf = mf.valueToString(texto);
        } catch (Exception ex){
            ex.printStackTrace();
        }
        return cpf; 
    }
    public static void main (String[] args) {
        System.out.println(new GeraCPF().geraCPFFinal());
    }
}

See running on ideone .

But I would change a lot in this code, it has numerous problems.

    
14.01.2016 / 16:02