Puxar vetor de outra classe

15 respostas Resolvido
java
W

olá gente, estou fazendo uma aplicação para a faculdade e queria saber como puxo o vetor que um método de outra classe retorna. código:

import java.util.Scanner;

public class Notas{

Scanner lerMateria = new Scanner (System.in);

Scanner lerNota = new Scanner (System.in);

float notas[][] = new float[6][2];

String materias[] = new String [6];

int contador = 0;

String[] lerMaterias(){

contador = 0;

  while (contador <= 5){

  	System.out.println("");
  	System.out.println ("Insira o nome da materia: ");
  	materias[contador] = lerMateria.nextLine();
  	System.out.println("");

  	contador ++;
  }

  return materias;

}

float[][] lerNotas(){

  	contador = 0;

  	while (contador <= 5){

  		System.out.println("");
  		System.out.printf ("Insira a primeira nota da materia %s: ", materias[contador]);
  		notas[contador][0] = lerNota.nextFloat();
  		System.out.println("");

  		System.out.println("");
  		System.out.printf ("Insira a segunda nota da materia %s: ", materias[contador]);
  		notas[contador][1] = lerNota.nextFloat();
  		System.out.println("");	

  		contador ++;
  	}

  	return notas;
  }

}

15 Respostas

M
Do jeito mais simples, é vc instanciar a sua classe notas e chamar o método .

Ex.:

Public class Média{

private Notas notas = new Notas();
private void buscaNotas(){

float [] [] notas = notas.lerNotas();

}

Lembrando nesse exemplo o objeto Notas foi instanciado na classe media, então é um objeto novo, nesse exemplo vc precisa setar os valores nessa instância.

W

tentei usar isso, porém quando tento instanciar a classe aparece:

cannot find symbol
        private Notas notas = new Notas();
J

Se você instanciar dentro de um método, não precisa (e não pode) indicar a visibilidade já que a visibilidade será a do método. Se instanciação ocorre na classe, mas fora de um método, aí pode.

1 - Dentro de um método

public class Classe1 {
	
}

public class Classe2 {
	private void metodoClasse2(){
		Classe1 classe1 = new Classe1();
	} 
}

2 - Fora de um método

public class Classe1 {
	
}

public class Classe2 {
	private Classe1 classe1 = new Classe1(); 
}
W

Igualmente ele da erro ao compilar, aparenta que não acha a classe, porém as duas estão no mesmo pacote. Código que tentei usar:

public class Medias{

private Notas notas = new Notas();

private void buscaNotas(){

float[][] notas = notas.lerNotas();

}
}

S

Por qual razão você está criando dois objetos do tipo Scanner com o System.in?
O System.in é um só, então basta um único objeto Scanner.

Essas variáveis só são utilizadas dentro dos métodos, então não há motivo para declarar como sendo atributos.
Declare elas dentro dos métodos apenas.

Posta a mensagem exata do erro.

W

Quando eu declarava somente um Scanner, por algum motivo pulava algumas leituras, criando dois consegui resolver.

sobre as variáveis, quando deixo elas somente dentro do método aparece o seguinte erro ao compilar:

error: cannot find symbol

System.out.printf ("Insira a primeira nota da materia %s: ", materias[contador]);

^

symbol:   variable materias

location: class Notas

src\br\edu\principal\Notas.java:44: error: cannot find symbol

System.out.printf ("Insira a segunda nota da materia %s: ", materias[contador]);

^

symbol:   variable materias

location: class Notas

2 errors

Já o erro que dá ao compilar a classe quando tento instanciar a outra dentro dela é:

error: cannot find symbol

Notas notas = new Notas();

^

symbol:   class Notas

location: class Medias

src\br\edu\principal\Medias.java:5: error: cannot find symbol

Notas notas = new Notas();

^

symbol:   class Notas

location: class Medias

src\br\edu\principal\Medias.java:9: error: cannot find symbol

float[][] notas = notas.lerNotas();

^

symbol:   method lerNotas()

location: variable notas of type float[][]

3 errors
S

É que você utiliza o método nextFloat(), esse método não consome a quebra de linha quando você pressiona o ENTER.
O único método do Scanner que consome a quebra de linha é o nextLine().
Então você tem duas alternativas:

  • Chamar o nextLine() imediatamente após o nextFloat();
  • Não chamar o nextFloat() e ao invés disso fazer Float.parseFloat(meuObjetoScanner.nextLine()).

O problema foi a falta de atenção, veja:

public class Medias{

    // aqui tem uma variável chamada 'notas'
    private Notas notas = new Notas();

    private void buscaNotas(){

        // aqui declarou uma variável do tipo 'float[][]' e também chamou de 'notas'
        // aí quando tenta chamar o método 'lerNotas' vai dar erro
        // pois o tipo de dado 'float[][]' não tem um método 'lerNotas'
        float[][] notas = notas.lerNotas();

    }
}

Ou você utiliza o this para referenciar a variável de instância:

public class Medias{

    private Notas notas = new Notas();

    private void buscaNotas(){

        float[][] notas = this.notas.lerNotas();

    }
}

Ou muda o nome da variável local:

public class Medias{

    private Notas notas = new Notas();

    private void buscaNotas(){

        float[][] outroNomePraVariavel= notas.lerNotas();

    }
}
W

tentei fazer as mudanças porém o erro continua o mesmo ao tentar compilar

cannot find symbol

private Notas notas = new Notas();

^

symbol:   class Notas

location: class Medias

src\br\edu\principal\Medias.java:5: error: cannot find symbol

private Notas notas = new Notas();

^

symbol:   class Notas

location: class Medias

2 errors
S

Qual package da classe Medias e qual o package da classe Notas?

W

Ambas estão no package br.edu.principal

S

Como está fazendo para compilar?

Mas está declarando o package no arquivo ou só colocou os arquivos dentro da pasta correspondente?

W

Criei um arquivo .bat que meu professor passou o código para abrir o cmd e compilar automaticamente

“C:\Program Files\Java\jdk-12.0.2\bin\javac.exe” -d bin src\br\edu\principal\Medias.java

Para isso teria que alterar algo nas variáveis de ambiente? eu cheguei a configura-las quando comecei a programar, mas não sei se tem que alterar mais algo quando vou trabalhar com várias classes.

S

Então posta o comando pra gente ver.

Está executando o javac a partir de qual pasta?
Está incluindo a pasta raíz do teu programa no classpath da aplicação usando o parâmetro -classpath?

S
Solucao aceita

Não, para isso você usa o parâmetro -cp ou -classpath ao executar o compilador.

No seu exemplo ficaria assim:

"C:\Program Files\Java\jdk-12.0.2\bin\javac.exe” -d bin -classpath src src\br\edu\principal\Medias.java

W

Consegui compilar, muito obrigado pela ajuda!

Criado 16 de agosto de 2019
Ultima resposta 19 de ago. de 2019
Respostas 15
Participantes 4