Variable matriz might not have been initialized

Olá, estou finalizando um programa porém não sei o que colocar no erro das matrizes dos casos 3 e 4. Ocorre o erro do título.

public class Jogador {

int codigo;
String nome;
String posicao;

//Sets e Gets já fiz também só irá ficar muito longo...

public class Time {

int codigoTime;
String nomeTime;
String tecnico;
Jogador jogadores [];

//Sets e Gets...




public class MenuInterativo {

public static void main (String args []) {

    String formato = "%-25s %35s %20s\n";

    Scanner scanner = new Scanner(System.in);

    

    while(true){

    System.out.println ("Bem vindo ao Meu Esporte virtual!");

    System.out.println (" Escolha uma das opções para continuar:");

    System.out.println ("1- Para cadastro de novo jogador.");

    System.out.println ("2- Para cadastro de novo time.");

    System.out.println ("3- Para listar jogadores cadastrados.");

    System.out.println ("4- Para listar nomes de times cadastrados.");

    System.out.println ("5- Para listar dados completos de um time.");

    System.out.println ("6- Para vincular um jogador a um time.");

    System.out.println ("7- Sair.");

    int x = scanner.nextInt();

    

    switch (x){

        

        case 1:

            

            String[][] matriz = new String[20][3];

            

            System.out.println("Digite a quantidade de jogadores a cadastrar: ");

         int a = scanner.nextInt();   

         Jogador jogadores[] = new Jogador [a];

         System.out.println ("Digite os dados do jogador: ");

	for (int i = 0; i < jogadores.length; i++)

	{

                jogadores[i] = new Jogador ();

		

		System.out.println ("Jogador " +(i+1));

                    matriz[i][0] = scanner.nextLine();

                    

                    

                    System.out.println("Digite o nome do jogador: " );

                    matriz[i][1] = scanner.nextLine();

                    

                    System.out.println("Digite sua posição: ");

                    matriz[i][2] = scanner.nextLine();

                    

                    

                   

                    }

            break;

            

        case 2:

            String[][] matrizTime = new String[20][3];

            

            System.out.println("Digite a quantidade de times a cadastrar: ");

         int b = scanner.nextInt();   

         Time times[] = new Time [b];

         System.out.println ("Digite os dados do time: ");

	for (int i = 0; i < times.length; i++)

	{

                times[i] = new Time ();

		

		System.out.println ("Time " +(i+1));

                    matrizTime[i][0] = scanner.nextLine();

                    

                    

                    System.out.println("Digite o nome do time: " );

                    matrizTime[i][1] = scanner.nextLine();

                    

                    System.out.println("Digite o nome do técnico: ");

                    matrizTime[i][2] = scanner.nextLine();

                    

                    

                   

                    }

            break;

            

        case 3:

                            

            

System.out.printf(formato, "Codigo jogador", "Nome", "Posição");

for (int i = 0; i < 20; i++)

    

  System.out.format(formato, matriz[i][0], matriz[i][1], matriz[i][2]); // aqui a primeira matriz apresenta: variable matriz might not have been initialized.


System.out.println();

            break;

            

        case 4:

            

            

System.out.printf(formato, "Codigo Time", "Nome Time", "Técnico");

for (int i = 0; i < 20; i++)

    

  System.out.format(formato, matrizTime[i][0], matrizTime[i][1], matrizTime[i][2]); // aqui a primeira matrizTime apresenta: variable matriz might not have been initialized.


System.out.println();

            break;

            

        case 5:

            //Ainda estou terminando

            break;

            

        case 6:

             //Ainda estou terminando mas se quiser dar uma luz agradeço.

            break;

            

        case 7:

            System.out.println("Saindo...");

            System.exit(0);

            

            break;

            

            

            

    }

} 

}

}

Olha! No case 1: você criou e inicializou a matriz:
String[][] matriz = new String[20][3];
E tentou usar no case 3. Aqui está o problema pois no caso 3 a matriz ainda não foi criarda e inicializada!

A saída é você criar essa matriz antes, de preferência antes do loop já que você vai usar ela em outros casos. O mesmo com a matrizTime:

Um exemplo:

String[][] matriz;
String[][] matrizTime;

while(true){
  
    [...]
   
   case 1:
    // aqui você inicializar
       matriz = new String[20][3];
    [...]
     //Faça  o mesmo para a outra matriz no case 2

   case 3:
    // aqui antes de tentar acessar a primeira matriz você  testa se ela já  foi inicializada!
   if(matriz == null){
     System.out.println("Ops! Essa matriz não foi criada"); // ou outra coisa
   }
   else{
      //Sua matriz existe! Faz o que você tem que fazer!
   }
}

Continua dando o erro…

A mesma matriz? Como você fez?

Como você escreveu, porém o programa pediu pra mim dar valor nulo no inicio assim tira o erro. posso deixa-lo assim?

  ...
 String[][] matriz = null;
 String[][] matrizTime = null;

  while(true){
...
case 3:
                            
 if(matriz == null){
 System.out.println("Ops! Essa matriz não foi criada"); 
}
else{           
System.out.printf(formato, "Codigo jogador", "Nome", "Posição");
for (int i = 0; i < 20; i++)
    
  System.out.format(formato, matriz[i][0], matriz[i][1], matriz[i][2]);
System.out.println();
 }
            break;
            
        case 4:
            
    if(matrizTime == null){
 System.out.println("Ops! Essa matriz não foi criada"); // ou outra coisa
   }
  else{        
System.out.printf(formato, "Codigo Time", "Nome Time", "Técnico");
for (int i = 0; i < 20; i++)
    
  System.out.format(formato, matrizTime[i][0], matrizTime[i][1], matrizTime[i][2]);
System.out.println();
    }
            break;

Sim! Faz sentindo já que a matriz só vai ser inicializada no caso 1 e não a garantias de que ele vai ser executado já que existes outras opções então você tem que inicializar a mesma como null. Ainda tem algum erro?

Erros não agora está certinho, só tenho dúvida nos dois últimos métodos que tenho que criar podes me ajudar já que está nessa jornada? ha ha

Olha! vendo seu código agora, notei algumas coisas estranhas. Você criou uma matriz de string, matrizTime, para guardar as informações como nome, nome do tecnico, etc. Sendo que você tinha criado uma classe Time, justamente com essa propriedades. Então você tinha quer ter criado uma matriz de Time!

Você vai ter que fazer umas pequenas alterações, que vai ajudar a criar os casos 5 e 6! Vou tidar um exemplo e você faz as outras alterações, certo? Acredito que seu código vai ficar menor e mais simples!

Você vai começa trocando matrizTime:

Time[] matrizTimes = null; // no lugar de String[][] matrizTimes
//

while(true){
     [...]
     case 2:
        System.out.println(" digite a quantidades de time:");
        int b = scanner.nextInt();
        matrizTimes = new Time[b];
        
         System.out.println("Digite os dados:");

         for(int i = 0; i<matrizTimes.length; i++){
           
           system.out.println("Time " +(i-1));
           Time time = new Time();
           time.setCodigoTime(i); // aqui eu botei o valor de i você pode pegar a entrada do usuário

           system.out.println("Digite o nome do time:");
           String nome = scanner.nextLine();
           system.out.println("Tecnico:");
           String tecnico = scanner.nextLine();

           time.setNomeTime(nome);
           time.setNomeTecnico(tecnico);

          // aqui eu adiciona o Time a matriz
          matrizTmatriz[i] = time;
       }
       break;
   }
     
}

No case 4:

for (int i = 0; i < matrizTimes.length; i++)
     ....

   // na hora de pegar os valores:
  System.out.format(formato, matrizTime[i].getCodigo(), matrizTime[i].getNomeTime(), matrizTime[i].getNomeTecnico());

Eu tô usando os método getter e setter que você criou, então verifique se eu chamei o nome correto!

Eu estou digitando pelo celular por isso demorei :grin:
Mas queria ti perguntar porque não usou esses métodos antes e porque da matriz String[][], existe algum motivo? Você não acha que assim fica melhor?

Se a classe time tiver um construtor você pode fazer assim:

int codigoTime = pego o codigo;
String nomeTime = nome do time;
String nomeTecnico = nome do tecnico;

Time time = new Time(códigoTime,nomeTime,nomeTecnico);

Isso é apenas uma sugestão se você achar que vale apena fazer as modificações! Você faz!

Bom… Estou iniciando em java eu era da manutenção e agora quero programar… Mas creio que não só a minha faculdade mas a grande maioria torna este mundo muito confuso e a internet não colabora em todos os casos de dúvidas. Então assisto vídeo aulas e tento juntar tudo, porém está bem complicado a falta de explicação. Agradeço por ter tirado seu tempo e me ajudar.

Isso é apenas um projetos para treinar? Ou é um trabalho?

Bom se você está iniciando, então talvez seja confuso esse lance de classe, construtor e você pode acabar se complicando ao tentar fazer as mundaça que te falei! Se for apenas um projetos pessoal, vale apena você tentar dá uma pesquisada sobre isso! Eu tidaria um exemplo melhor, mas como eu tô pelo celular fica um pouco complicado!
Mas se quiser dá uma estudada em orientação a objeto em Java tem essa apostila Aqui

Bom, eu me lembro do dia que eu achava complicado, quando eu deveria colocar as { } e ; , mas hoje com a prática isso se tornou uma coisa simples para mim. Eu ainda tenho muito para aprender, percebo isso quando entro no GUJ. Mas acredito que com a pratica eu chego lá e o lance da faculdade eu sei como é!
Boa sorte! Espero que eu não tenha te complicado com a minha tentativa de explicação!!!

Bom eu não sei se você já conseguiu! mas segue um exemplo:
Sua classe Time deve ser algo assim.

import java.util.ArrayList;
import java.util.Scanner;

public class Time{
	
	private int codigo;
	private String nome;
	private String tecnico;
	
	// Eu tô usando uma Lista em vez de Array[]
	private ArrayList<Jogador> jogadores;
	
	//Construtor
	public Time(int codigo, String nome, String tecnico){
		
		this.codigo = codigo;
		this.nome = nome;
		this.tecnico = tecnico;
		
		jogadores = new  ArrayList<>(); //crio a lista;
	}
	
	//retorna a lista de jogadores desse time
	public ArrayList<Jogador> getJogadores(){
		return this.jogadores;
	}
	
	// No item 6 uso esse metodo para vincular um jogador ao time!
	public vincularJogador(Jogador jogador){
		this.jogadores.add(jogador); // jogador adicionado a lista de jogadores desse time;
	}
	
	public int getCodigo(){
		return this.codigo;
	}
	public String getNome(){
		return this.nome;
	}
	public String getTecnico(){
		return this.tecnico;
	}
	
	
	public setCodigo(int codigo){
		this.codigo = codigo;
	}
	public setNome(String nome){
		this.codigo = nome;
	}
	public setTecnico(String tecnico){
		this.tecnico = tecnico;
	}
}

sua classe principal:

// [...]
//Lista são mais faceis para adicionar novos elementos do que Array[]
ArrayList<Time> listaTime = new ArrayLista<>();
ArrayList<Jogador> listaJogador = new ArrayLista<>();


while(true){
	
	//restos do seu codigo
	
	case 1:
	  system.out.println("Digite a quantidade de Jogadores:");
	  int total = scanner.nextInt();
      scanner.nextLine();
	  
	  system.out.println("Digite os Dados:");
	  for(int i = 0; i < total; i++){
		  system.out.println("Jogador "+(i+1));
		  
		  int codigo = i; // Eu to usando como o codigo o valor de i 
		  String nome;
		  String posicao;
		  
		  //pego as entradas do usuario
		  system.out.println("Digite o nome:");
		  nome = scanner.nextLine();
		  system.out.println("Digite a posicao:");
		  posicao = scanner.nextLine();
		  
		  // crio o jogador e adiciono a lista de jogadores
		  listaJogador.add(new Jogador(codigo,nome,posicao));
	  }
	  break;
	  
	case 2:
	  system.out.println("Digite a quantidade de times:");
	  int total = scanner.nextInt();
	  
	  system.out.println("Digite os Dados:");
	  for(int i = 0; i < total; i++){
		  system.out.println("Time "+(i+1));
		  
		  int codigo = i; // Eu to usando como o codigo o valor de i 
		  String nome;
		  String tecnico;
		  
		  //pego as entradas do usuario
		  system.out.println("Digite o nome:");
		  nome = scanner.nextLine();
		  system.out.println("Digite o nome do Tecnico:");
		  tecnico = scanner.nextLine();
		  
		  // crio o time e adiciono a lista de times
		  listaTime.add(new Time(codigo,nome,tecnico));
	  }
	  break;
	
	  //
	  // resto do seu codigo
	  //
	  
	  //No seu menu:"4 - Para lista nomes de times cadastrados"
	  case 4:
	    system.out.println("Times cadastrados:");
		
		for(int i = 0; i<listaTime.size(); i++){
			
			//pego o time da lista
			Time meuTime = listaTime.get(i);
			
			// pego o nome e mostro no console
			system.out.println(meuTime.getNome());
		}
		
	  break;
	
	 //
	 //resto do seu codigo
	 //
	
	 
	 //no seu Menu:"vincular um jogador a um time"
	 //acredito que seja assim!
	  case 6:
	   system.out.println("---------------Jogadores:--------------");
		
		//listo todos os jogadores para vincula!
		for(int i = 0; i<listaJogador.size(); i++){
			
			Jogador jogador = listaJogador.get(i);
			
			// pego o nome e o indice e mostro no console
			system.out.println("indice: "+i+" nome: "+jogador.getNome());
		}
		
		system.out.println("---------------Times:--------------");
		
		// todos os times disponiveis:
		for(int i = 0; i<listaTime.size(); i++){
			
			Time time = listaTime.get(i);
			
			system.out.println("indice: "+i+" nome: "+time.getNome());
		}
		
		system.out.println("Digite o indice do jogado e do time para vincular:");
		
          scanner.nextLine();
		int idJogador = scanner.nextInt();
		int idTime = scanner.nextInt();
		
		Time time = listaTime.get(idTime);
		Jogador j = lista.get(idJogador);
		
		//add o jogador ao time;
		time.vincularJogador(j);
		
		break;
}

/*OBS: verifique se eu digitei o nome e os atributos das classe corretamente
 * como está no seu código!
 *
 * Você  também deve criar os métodos sets e gets para a classe jogador com as suas
 * propriedades: código, nome e posição e o construtor.
*/

É um trabalho, mas os exemplos é como ensinar 2 + 2 e pedir para o aluno resolver uma equação de 2º.

Eu entendi super bem sobre classes, getters e setters, porém só não entendo como chamar as vezes em outras classes, assim como vetores e matrizes.

Obrigada, me ajudou pra c******. Desculpe a demora para responder… Estava no trabalho.

1 curtida