Variable resets whenever it passes to a method

1

I'm doing a simple program that inserts in the first possible position of a vector, a String .

Here is the code I have:

import java.util.Formatter;
import java.util.Scanner;

/**
 *
 * @author AmândioMagalhães(115
 */
public class PL7_ex6 {

    private static Scanner input = new Scanner(System.in);
    private static Formatter output = new Formatter(System.out);

    public static void main(String[] args) {
        String[] visitantes = new String[100];
        int nElm = 0;
        menu(visitantes, nElm);

    }

    private static void menu(String[] vec, int nElm) {
        int op;
        output.format("bem-vindo!");
        output.format("\n\nAqui pode:");
        do {
            System.out.println("\n\n1 - Inserir um visitante"
                    + "\n2 - Listar todos os visitantes"
                    + "\n3 - Atualizar um nome dado"
                    + "\n4 - Eliminar um visitante dado"
                    + "\n5- Lisstar os nomes começados por uma dada letra"
                    + "\n6 - Listar nomes repetidos"
                    + "\n0 - para terminar o programa");
            op = input.nextInt();
            if (op < 0 || op > 6) {
                output.format("%sTem de introduzir uma opção válida!");
            }

            if (op == 0) {
                //termina
            } else {
                switch (op) {
                    case 0:

                    case 1:
                        inserirVisitante(vec, nElm);
                        System.out.println(vec[0]);
                        break;
                    case 2:
                        listarVisitantes(vec, nElm);
                        break;
                    case 3:
                        break;
                    default:
                        throw new AssertionError();
                }
            }
        } while (op > 0 || op > 6);

    }


    private static void inserirVisitante(String[] vec, int nElm) {
        int pos = 0;
        int i = 0;
        if (nElm == vec.length) {
            output.format("Não há espaço disponível :(");
        } else {
            do {
                if (i == nElm - 1) {
                    pos = i;
                }
                i++;
            } while (i >= nElm - 1);
            System.out.println("Introduza o nome do visitante");
            input.nextLine();
            vec[pos] = input.nextLine();
            vec[pos].trim();
            nElm = nElm + 1;
            //para testar
            System.out.println("\n" + nElm + "\n");
        }
    }

    //nElem não passa de inserirVisitantes para este método
    private static void listarVisitantes(String[] vec, int nElm) {
        if (nElm == 0) {
            //para testar
            System.out.println("\n" + nElm + "\n");
            output.format("Não há visitantes.");
        } else {
            for (int i = 0; i < nElm; i++) {
                output.format("%n%d", vec[i]);
            }
        }
    }

}

The problem here is that the variable nElm resets to 0 without me setting it to 0

    
asked by anonymous 06.11.2017 / 17:39

2 answers

1

If you want to keep the state of the variable between the methods you need to send and receive. It would look like this:

import java.util.Formatter;
import java.util.Scanner;

/**
 *
 * @author AmândioMagalhães(115
 */
public class PL7_ex6 {

    private static Scanner input = new Scanner(System.in);
    private static Formatter output = new Formatter(System.out);

    public static void main(String[] args) {
        String[] visitantes = new String[100];
        int nElm = 0;
        menu(visitantes, nElm);

    }

    private static void menu(String[] vec, int nElm) {
        int op;
        output.format("bem-vindo!");
        output.format("\n\nAqui pode:");
        do {
            System.out.println("\n\n1 - Inserir um visitante"
                    + "\n2 - Listar todos os visitantes"
                    + "\n3 - Atualizar um nome dado"
                    + "\n4 - Eliminar um visitante dado"
                    + "\n5- Lisstar os nomes começados por uma dada letra"
                    + "\n6 - Listar nomes repetidos"
                    + "\n0 - para terminar o programa");
            op = input.nextInt();
            if (op < 0 || op > 6) {
                output.format("%sTem de introduzir uma opção válida!");
            }

            if (op == 0) {
                //termina
            } else {
                switch (op) {
                    case 0:

                    case 1:
                        nElm = inserirVisitante(vec, nElm);
                        System.out.println(vec[0]);
                        break;
                    case 2:
                        listarVisitantes(vec, nElm);
                        break;
                    case 3:
                        break;
                    default:
                        throw new AssertionError();
                }
            }
        } while (op > 0 || op > 6);

    }


    private static int inserirVisitante(String[] vec, int nElm) {
        int pos = 0;
        int i = 0;
        if (nElm == vec.length) {
            output.format("Não há espaço disponível :(");
        } else {
            do {
                if (i == nElm - 1) {
                    pos = i;
                }
                i++;
            } while (i >= nElm - 1);
            System.out.println("Introduza o nome do visitante");
            input.nextLine();
            vec[pos] = input.nextLine();
            vec[pos].trim();
            nElm = nElm + 1;
            //para testar
            System.out.println("\n" + nElm + "\n");
            return eElm;
        }
    }

    //nElem não passa de inserirVisitantes para este método
    private static void listarVisitantes(String[] vec, int nElm) {
        if (nElm == 0) {
            //para testar
            System.out.println("\n" + nElm + "\n");
            output.format("Não há visitantes.");
        } else {
            for (int i = 0; i < nElm; i++) {
                output.format("%n%d", vec[i]);
            }
        }
    }

}

But the ideal would be to have this information in the class and be able to access it in all methods directly without having to communicate. It is not ideal to do the way you did, but it is an improvement. The code still has other errors. I've fixed several of them, so many shapes that I can not remember the majority, but it helps.

import java.util.Formatter;
import java.util.Scanner;

public class PL7_ex6 {
    private static Scanner input = new Scanner(System.in);
    private static Formatter output = new Formatter(System.out);
    private static String[] visitantes = new String[100];
    private static int nElm = 0;

    public static void main(String[] args) {
        output.format("bem-vindo!");
        output.format("\n\nAqui pode:");
        int op;
        do {
            System.out.println("\n\n1 - Inserir um visitante"
                    + "\n2 - Listar todos os visitantes"
                    + "\n3 - Atualizar um nome dado"
                    + "\n4 - Eliminar um visitante dado"
                    + "\n5- Lisstar os nomes começados por uma dada letra"
                    + "\n6 - Listar nomes repetidos"
                    + "\n0 - para terminar o programa");
            op = input.nextInt();
            if (op < 0 || op > 6) {
                output.format("%sTem de introduzir uma opção válida!");
                continue;
            }
             switch (op) {
                case 1:
                    inserirVisitante();
                    System.out.println(visitantes[0]); //por que tem isso?
                    break;
                case 2:
                    listarVisitantes();
                    break;
                case 3:
                    break;
                default:
                    throw new AssertionError(); //não deveria fazer isso
            }
        } while (op != 0);
    }

    private static void inserirVisitante() {
        int pos = 0;
        int i = 0;
        if (nElm == visitantes.length) {
            output.format("Não há espaço disponível :(");
        } else {
            System.out.println("Introduza o nome do visitante");
            visitantes[nElm++] = input.nextLine().trim();
            //para testar
            System.out.println("\n" + nElm + "\n");
        }
        return;
    }

    private static void listarVisitantes() {
        if (nElm == 0) {
            //para testar
            System.out.println("\n" + nElm + "\n");
            output.format("Não há visitantes.");
        } else {
            for (int i = 0; i < nElm; i++) {
                output.format("%n%d", visitantes[i]);
            }
        }
    }
}

I placed GitHub for future reference .

    
06.11.2017 / 17:53
0

The question is that java loses the reference of the variable, as soon as executed in the method in other words it would be to say that the nElm that you define in the main method is not the same that is processed inside the inserirVisitante , but yes a reference. That's why it's not possible to use.

So the best way is to declare variables as static out of scope

And the fact that the object is not inside the main method, it loses values as soon as the InsertVisitator finishes executing.

So:

import java.util.Formatter;
import java.util.Scanner;

public class PL7_ex6 {
private static Scanner input = new Scanner(System.in);
private static Formatter output = new Formatter(System.out);
private static String[] visitantes;
private static int nElm;

public static void main(String[] args) {
    visitantes = new String[100];
    nElm = 0;
    menu();

}

private static void menu() {
    int op;
    output.format("bem-vindo!");
    output.format("\n\nAqui pode:");
    do {
        System.out.println("\n\n1 - Inserir um visitante"
                + "\n2 - Listar todos os visitantes"
                + "\n3 - Atualizar um nome dado"
                + "\n4 - Eliminar um visitante dado"
                + "\n5- Lisstar os nomes começados por uma dada letra"
                + "\n6 - Listar nomes repetidos"
                + "\n0 - para terminar o programa");
        op = input.nextInt();
        if (op < 0 || op > 6) {
            output.format("%sTem de introduzir uma opção válida!");
        }

        if (op == 0) {
            //termina
        } else {
            switch (op) {
                case 0:

                case 1:
                    inserirVisitante();
                    System.out.println(visitantes[0]);
                    break;
                case 2:
                    listarVisitantes();
                    break;
                case 3:
                    break;
                default:
                    throw new AssertionError();
            }
        }
    } while (op > 0 || op > 6);

}


private static void inserirVisitante() {
    int pos = 0;
    int i = 0;
    if (nElm == visitantes.length) {
        output.format("Não há espaço disponível :(");
    } else {
        do {
            if (i == nElm - 1) {
                pos = i;
            }
            i++;
        } while (i >= nElm - 1);
        System.out.println("Introduza o nome do visitante");
        input.nextLine();
        visitantes[pos] = input.nextLine();
        visitantes[pos].trim();
        nElm = nElm + 1;
        //para testar
        System.out.println("\n" + nElm + "\n");
    }
}

//nElem não passa de inserirVisitantes para este método
private static void listarVisitantes() {
    if (nElm == 0) {
        //para testar
        System.out.println("\n" + nElm + "\n");
        output.format("Não há visitantes.");
    } else {
        for (int i = 0; i < nElm; i++) {
            output.format("%n%d", vec[i]);
        }
    }
}

}

    
06.11.2017 / 17:58