A variável local pode não ter sido inicializada | Classe

31 respostas Resolvido
java
S

the local variable may not have been initialized

Eu procurei alguns casos, mas nenhum me ajudava, acredito que esse é diferente. A variável não foi iniciada em outra classe.

Classe principal

else if ("Multiplication".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     int nulo = 0;
     System.out.println();
     
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     int numbers = sc.nextInt();
     int alt = numbers;
     
     int result = numbers * alt;
     ent= new entities(result);
 }     

System.out.println();
    System.out.print(ent);
   }

Classe secundária

public class entities {

     private int result;

     public entities(int result){
     this.result = result;
}

     public int getResult(){
     return result;
}

    public void setResult(int result){
    this.result = result;
}
}

Eu fiquei confuso, pois meu professor fez do mesmo jeito e deu certo (foi feito em outro exercício)

Como ele fez:

Classe secundária

private int number;
	private String holder;
	private double balance;
	
	public Account(int number, String holder) {
		this.number = number;
		this.holder = holder;
	}

	public Account(int number, String holder, double initialDeposit) {
		this.number = number;
		this.holder = holder;
		deposit(initialDeposit);
	}

	public int getNumber() {
		return number;
	}

	public String getHolder() {
		return holder;
	}

	public void setHolder(String holder) {
		this.holder = holder;
	}

	public double getBalance() {
		return balance;
	}

	public void deposit(double amount) {
		balance += amount;
	}
	
	public void withdraw(double amount) {
		balance -= amount + 5.0;
	}
	
	public String toString() {
		return "Account "
				+ number
				+ ", Holder: "
				+ holder
				+ ", Balance: $ "
				+ String.format("%.2f", balance);
	}

Classe principal

Account account;

		System.out.print("Enter account number: ");
		int number = sc.nextInt();
		System.out.print("Enter account holder: ");
		sc.nextLine();
		String holder = sc.nextLine();
		System.out.print("Is there an initial deposit (y/n)? ");
		char response = sc.next().charAt(0);
		if (response == 'y') {
			System.out.print("Enter initial deposit value: ");
			double initialDeposit = sc.nextDouble();
			account = new Account(number, holder, initialDeposit);
		}
		else {
			account = new Account(number, holder);
		}
		
		System.out.println();
		System.out.println("Account data:");
		System.out.println(account);
		
		System.out.println();
		System.out.print("Enter a deposit value: ");
		double depositValue = sc.nextDouble();
		account.deposit(depositValue);
		System.out.println("Updated account data:");
		System.out.println(account);
		
		System.out.println();
		System.out.print("Enter a withdraw value: ");
		double withdrawValue = sc.nextDouble();
		account.withdraw(withdrawValue);
		System.out.println("Updated account data:");
		System.out.println(account);
		
		sc.close();

Onde ele iniciou?

Desculpa se o post ficou muito grande. Não pensei num jeito de resumir isso :smiley:

31 Respostas

S

Posta o código completo da classe principal, você só postou um else if.

S
Scanner sc = new Scanner(System.in);
   Locale.setDefault(Locale.US);
   
   entities ent;
  
   System.out.print("U name: ");
   String name = sc.next();
   System.out.println();
   
   System.out.println("Hi: " + name + "!");
   System.out.println();
   
   System.out.println("Sum, Subtraction, Multiplication, Division?");
   
   String choice = sc.next();
   System.out.println();
   
   if ("Sum".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     System.out.println();
     
     int sum = 0;
     
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     int numbers = sc.nextInt();
     sum += numbers;
     }     

    System.out.println();
	System.out.print(sum);
   }
   
   else if ("Multiplication".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     int nulo = 0;
     System.out.println();
     
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     int numbers = sc.nextInt();
     int alt = numbers;
     
     int result = numbers * alt;
     ent= new entities(result);
     }     

    System.out.println();
	System.out.print(ent);
   }
   
   else if ("Multiplication".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     int nulo = 0;
     System.out.println();
     
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     int numbers = sc.nextInt();
     if (i == 0){
       nulo += numbers;
     }
     else{
       nulo -= numbers;
     }
     }     

    System.out.println();
	System.out.print(nulo);
   }
   sc.close();
R

Oi Semprelegit, tudo bem?

Acredito que você possa começar ajustando a sua classe entities renomeando para Entities.
O que pode estar ocorrendo também, é que a variável ent só está sendo inicializada dentro do else if. Tente inicializar antes das validações e utilizar ent.setResult(result) para setar o result no Objeto.

Espero ter ajudado!

S

Isso que você postou não é uma classe, é só um trecho de código.

Todavia o seu problema está aqui:

else if ("Multiplication".equals(choice)) {
    System.out.print("Enther the quantity of the numbers: ");
    byte n = sc.nextByte();
    int nulo = 0;
    System.out.println();

    System.out.println("Enter the numbers: ");
    for (int i = 0; i < n; i++) {
        int numbers = sc.nextInt();
        int alt = numbers;

        int result = numbers * alt;
        ent = new entities(result);  // você  inuicializa a variável ent aqui dentro desse for
    }

    System.out.println();
    System.out.print(ent);  // e aqui você manda imprimir a variável ent, mas se por ventura o código não entrar no for?
}

Variáveis locais precisam ser inicializadas antes de serem utilizadas.

S

Mas fiquei curioso, se eu iniciar fora do for não vai funcionar, pois o result ele é “inserido” dentro for

E dá um erro dizendo que result não pode ser considerado um variável

Então eu teria que iniciar dentro e fora for? Tipo uma sobrecarga?

R

o que tu pode fazer, é mandar 0 ao inicializar o objeto. Ou remover o parâmetro do construtor.

J

E se Multiplication não for igual a choice, qual será o valor de ent? Você deve responder essa pergunta para o compilador, ou seja, inicializando a variável ent antes de usá-la.

S

Não, mas você tem que garantir que você só vá usar ou ler sua variável após ela ter sido inicializada.
Você pode inicializar ela com null na declaração por exemplo.

Sobrecarga é quando você tem métodos de mesmo nome mas com parâmetros diferentes.

S

Pode mostrar um exemplo?

S

Como assim?

S
entities ent = null; // declarando e inicializando com null
S

Obrigado mesmo! Já estou a muito tempo achar a solução disso XD

S

Como assim “Setar” e Validações?

S

Quando ele imprime o valor, sai desse jeito:

Java.entities@4e48af7

Como resolvo isso?

S

O que você deseja imprimir?

S

O ent

S

O que você espera que apareça na tela ao mandar imprimir o ent?

S
System.out.println("Enter the numbers: ");
 for (int i = 0; i<n; i++){
 int numbers = sc.nextInt();
 int alt = numbers;
 
 int result = numbers * alt;
 ent = new entities(result);
 }     
System.out.println();
	System.out.print(ent);
   }

A multiplicação de todos os números que o usuário escreveu

Será que o jeito como eu fiz o result interfere em algo?

S
System.out.print(ent.getResult());
S

Muito obrigado!
Última dúvida

Eu coloquei para ele calcular 2x2x2 = 8, porém ele imprime 4

int numbers = sc.nextInt();
int alt = numbers;

Ele salvou um 2 em numbers, e o outro 2 no alt e depois multiplicou

Como eu posso fazer para ele multiplicar todos os valores dado?

S
Solucao aceita

Você precisa aprender a fazer teste de mesa para aprimorar sua lógica. :wink:

Exemplo de como implementar:

System.out.print("Enther the quantity of the numbers: ");
int quantidade = Integer.parseInt(sc.nextLine());
System.out.println();

int resultado = 1;
for (int i = 1; i <= quantidade; i++) {
    System.out.print("Enter number" + i + ": ");
    int numero = Integer.parseInt(sc.nextLine());
    resultado *= numero;
}
ent = new entities(resultado);
System.out.println();
System.out.print(ent.getResult());

Pergunta:
Qual a necessidade da classe entities?
Ela só tem um atributo e um get e set para o mesmo.

S

Isso é verdade kkk :smile:

Obs:

int quantidade = Integer.parseInt(sc.nextLine());

Você está convertendo um int num int?

---------------------------------------------------------------

Se eu armazenar os números numa variável, e depois multiplicar esse números eu posso “printar” assim?

System.out.print(result);

---------------------------------------------------------------

Qual a necessidade da classe entities ?

Eu pensava que tinha que armazenar eles em uma outra classe, ou criar um vetor.
Parece então que um int pode armazenar vários números, ou um String armazenar vários nomes, certo?

S

Sua pergunta nem faz sentido: Um int é um int, não precisa ser convertido pra ele mesmo.
Essa linha está convertendo para int a String retornada pelo método sc.nextLine().
Evite usar o nextInt() ou nextByte() quando estiver lendo entrada do usuário, pois estes métodos não consomem a quebra de linha que ocorre quando você pressiona ENTER.
O único método da classe Scanner que consome a quebra de linha é o nextLine().
Use a documentação do Java métodos quando você tiver dúvidas sobre o que um método de alguma classe faz.

Testou?

Não, uma variável int pode armazenar um número inteiro de 32 bits.

Não, um objeto do tipo String armazena uma cadeia de caracteres de tamanho fixo, mas nada impede dessa cadeia de caracteres serem vários nomes separados por espaço, por exemplo.

S

Então você me recomenda a usar o nextLine e converter para o tipo que eu quiser?

Porque quando eu coloquei o:

int numbers = Integer.parseInt(sc.nextLine());

Deu esse erro:

java.lang.NumberFormatException: For input string: ""
	at java.lang.Integer.parseInt(Integer.java:627)
	at java.lang.Integer.parseInt(Integer.java:650)
	at Java.app.main(app.java:49)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.duy.android.compiler.java.Java.run(Java.java:115)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.executeDex(ExecuteActivity.java:147)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.exec(ExecuteActivity.java:124)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.access$100(ExecuteActivity.java:45)
	at com.duy.ide.javaide.run.activities.ExecuteActivity$1.run(ExecuteActivity.java:88)
	at java.lang.Thread.run(Thread.java:764)

Eu acho que é algum erro quando converti em int

S

Quando estiver usando o Scanner para ler entrada de dados a partir do teclado, utilize somente o nextLine().
Utilize os outros métodos somente quando estiver usando o Scanner para ler outras fontes de dados como arquivos ou sockets por exemplo.

Provavelmente você chamou o nextLine() depois ter chamado um nextByte() ou nextInt().

Vou me basear no código que você postou no início pra ilustrar o problema:

System.out.print("Enther the quantity of the numbers: ");
/*
 * aqui você chamou o nextByte
 * ELE NÃO CONSUMIU A QUEBRA DE LINHA GERADA AO PRESSIONAR ENTER
 */
byte n = sc.nextByte();
int nulo = 0;
System.out.println();

System.out.println("Enter the numbers: ");
for (int i = 0; i<n; i++) {
    /*
     * aqui você chamou o nextLine
     * só que esse nextLine não vai ler a entrada do usuário, ele vai primeiro
     * CONSUMIR A QUEBRA DE LINHA QUE FOI GERADA LÁ EM CIMA QUANDO VOCÊ USOU O nextByte
     * e vai retornar um String vazio: ""
     */
    int numbers = Integer.parseInt(sc.nextLine());

Por causa dessa característica da quebra de linha, é que é importante utilizar somente o nextLine() quando estiver lendo do teclado.

Você até poderia fazer assim, mas fica muito feio:

System.out.print("Enther the quantity of the numbers: ");
byte n = sc.nextByte();
sc.nextLine(); // consumir a quebra de linha do nextByte
int nulo = 0;
System.out.println();

System.out.println("Enter the numbers: ");
for (int i = 0; i<n; i++) {
    int numbers = sc.nextInt();
    sc.nextLine(); // consumir a quebra de linha do nextInt
S

Olha o que acontece quando eu insiro os números

Eu sei que o nextLine() ele consome a linha, mas às vezes ele dá esses bugs.

Como eu posso fazer isso do jeito certo? Porque meu professor disse para usar o nextLine() dessa forma

S

Posta o código completo de sua classe, não tem como adivinhar a sua implementação.

S
Scanner sc = new Scanner(System.in);
   Locale.setDefault(Locale.US);
  
   System.out.print("U name: ");
   String name = sc.next();
   System.out.println();
   
   System.out.println("Hi: " + name + "!");
   System.out.println();
   
   System.out.println("Sum, Sub, Mult, Div?");
   
   String choice = sc.next();
   System.out.println();
   
   if ("Sum".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     System.out.println();
     
     int sum = 0;
     
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     int numbers = sc.nextInt();
     sum += numbers;
     }     

    System.out.println();
	System.out.print(sum);
   }
   
   else if ("Mult".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     System.out.println();
     
     int a = 1;
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     sc.nextLine();
     int numbers = Integer.parseInt(sc.nextLine());
     
     a *= numbers;
     }     
    System.out.println();
	System.out.print(a);
   } 
   
   else if ("Sub".equals(choice)){
     System.out.print("Enther the quantity of the numbers: ");
     byte n = sc.nextByte();
     int nulo = 0;
     System.out.println();
     
     System.out.println("Enter the numbers: ");
     for (int i = 0; i<n; i++){
     int numbers = sc.nextInt();
     if (i == 0){
       nulo += numbers;
     }
     else{
       nulo -= numbers;
     }
    }     

    System.out.println();
	System.out.print(nulo);
   }
   sc.close();
S

Tenho a impressão que você tem dificuldade em interpretar textos.
Você não postou o código completo da classe.
E você só usou o nextLine() em uma pequena parte de seu código.

Veja os comentários no código abaixo:

Scanner sc = new Scanner(System.in);
Locale.setDefault(Locale.US);

System.out.print("U name: ");
String name = sc.next(); // aqui não está consumindo a quebra de linha
System.out.println();

System.out.println("Hi: " + name + "!");
System.out.println();

System.out.println("Sum, Sub, Mult, Div?");

String choice = sc.next(); // aqui não está consumindo a quebra de linha
System.out.println();

if ("Sum".equals(choice)) {
    System.out.print("Enther the quantity of the numbers: ");
    byte n = sc.nextByte(); // aqui não está consumindo a quebra de linha
    System.out.println();

    int sum = 0;

    System.out.println("Enter the numbers: ");
    for (int i = 0; i < n; i++) {
        int numbers = sc.nextInt(); // aqui não está consumindo a quebra de linha
        sum += numbers;
    }

    System.out.println();
    System.out.print(sum);
}

else if ("Mult".equals(choice)) {
    System.out.print("Enther the quantity of the numbers: ");
    byte n = sc.nextByte(); // aqui não está consumindo a quebra de linha
    System.out.println();

    int a = 1;
    System.out.println("Enter the numbers: ");
    for (int i = 0; i < n; i++) {
        sc.nextLine(); // aqui vai ler uma linha desnecessária quando reiterar o laço
        int numbers = Integer.parseInt(sc.nextLine());

        a *= numbers;
    }
    System.out.println();
    System.out.print(a);
}

else if ("Sub".equals(choice)) {
    System.out.print("Enther the quantity of the numbers: ");
    byte n = sc.nextByte(); // aqui não está consumindo a quebra de linha
    int nulo = 0;
    System.out.println();

    System.out.println("Enter the numbers: ");
    for (int i = 0; i < n; i++) {
        int numbers = sc.nextInt(); // aqui não está consumindo a quebra de linha
        if (i == 0) {
            nulo += numbers;
        } else {
            nulo -= numbers;
        }
    }

    System.out.println();
    System.out.print(nulo);
}
sc.close();
S

Sim, bastante kk
Eu tirei aquela outra classe, e eu não mudei o sc.nextByte, porque quando tentei mudar deu erro

Você quer que eu passe todo o código? Até o pacote?
Sou lento nessas coisas

S

E você interpretou a mensagem de erro?
Ela costuma te dar informações bastante precisas.

Foi o que eu pedi, mas agora não precisa mais.

Se simplesmente copiar o código que você postou, como faz pra compilar e executar?
Você só havia postado o conteúdo de um método (eu acho).

Veja se o código abaixo te ajuda a entender melhor:

import java.io.PrintStream;
import java.util.Locale;
import java.util.Scanner;

public class Programa {

    public static void main(String[] args) {
        try {
            Programa programa = new Programa();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private final Scanner entrada = new Scanner(System.in);
    private final PrintStream saida = System.out;

    public void executar() throws Exception {
        Locale.setDefault(Locale.US);

        String name = lerTexto("U name: ");
        saida.println("Hi: " + name + "!");
        saida.println();

        String choice = lerTexto("Sum, Sub, Mult, Div?\n\n");
        switch (choice) {
            case "Sum":
                executaSoma();
                break;
            case "Mult":
                executaMultiplicacao();
                break;
            case "Sub":
                executaSubtracao();
                break;
        }
    }

    private void executaMultiplicacao() {
        int quantidade = lerInteiro("Enther the quantity of the numbers: ");
        saida.println();

        int a = 1;
        saida.println("Enter the numbers: ");
        for (int i = 0; i < quantidade; i++) {
            int numbers = lerInteiro();

            a *= numbers;
        }
        saida.println();
        saida.print(a);
    }

    private void executaSoma() {
        int quantidade = lerInteiro("Enther the quantity of the numbers: ");
        saida.println();

        int sum = 0;

        saida.println("Enter the numbers: ");
        for (int i = 0; i < quantidade; i++) {
            int numbers = lerInteiro();
            sum += numbers;
        }

        saida.println();
        saida.print(sum);
    }

    private void executaSubtracao() {
        int quantidade = lerInteiro("Enther the quantity of the numbers: ");
        int nulo = 0;
        saida.println();

        saida.println("Enter the numbers: ");
        for (int i = 0; i < quantidade; i++) {
            int numbers = lerInteiro();
            if (i == 0) {
                nulo += numbers;
            } else {
                nulo -= numbers;
            }
        }

        saida.println();
        saida.print(nulo);
    }

    private int lerInteiro() {
        return Integer.parseInt(entrada.nextLine());
    }

    private int lerInteiro(String mensagem) {
        saida.print(mensagem);
        return lerInteiro();
    }

    private String lerTexto() {
        return entrada.nextLine();
    }

    private String lerTexto(String mensagem) {
        saida.print(mensagem);
        return lerTexto();
    }
}
Criado 12 de setembro de 2019
Ultima resposta 13 de set. de 2019
Respostas 31
Participantes 4