Erro na criação de relacionamentos entre objetos e classes

Estou desenvolvendo uma atividade escolar, mas não estou conseguindo realizar o que está sendo pedido. Fazem 8 dias que estou tentando encontrar a melhor forma de realizar as relações pedidas, pesquisei no material que tenho disponível. Analisei códigos com funções semelhantes, mas não tive sucesso. Agradeço desde já a quem puder me ajudar, e se possível me mostrar um exemplo de como consigo realizar…

  1. Implemente, em java, um sistema para o controle acadêmico simplificado. O
    sistema deve informar:
  • a) Quais disciplinas um professor está ministrando;
  • b) Qual o horário de um professor;
  • c) Quais os alunos de uma dada disciplina;
  • d) Quais as disciplinas de um aluno;
  • e) Qual o horário de um aluno;
  • f) Qual o número de alunos de uma disciplina.

Sugestões pré-implementação (atividade de análise):

  • Identifique as entidades do sistema
  • Identifique as características de cada uma das entidades
  • Elabore um diagrama para definir os relacionamentos entre as entidades
  • Analise quem é o expert para cada situação listada acima e acrescente as
    responsabilidades ao diagrama
// Classe que testa Controle Academico Simplificado
public class TesteControleAcademico {
  
  public static void main(String[] args) {
    Aluno aluno1 = new Aluno("Pedro", 123456, "Computação");
    Disciplina disciplina1 = new Disciplina("11:00-13:00", "Metodos Avançados em Programação", 101, aluno1);
    
    ControleAcademico.realizaMatricula(aluno1, disciplina1);
    ControleAcademico.printInformacoes();
  }
}
//Classe Controle Academico
@SuppressWarnings("serial")
public class ControleAcademico extends Exception {
  static int numAlunos = 100;
  static int numDisciplinas = 50;
  
  private static Aluno [] alunos = new Aluno [numAlunos];
  private static Disciplina [] disciplinas = new Disciplina [numDisciplinas];
  
  static int countAluno = 0;
  static int countDisciplina = 0;
  
  public static void realizaMatricula(Aluno aluno, Disciplina disciplina) {
    alunos[countAluno]= aluno;		
    disciplinas[countDisciplina] = disciplina;
    countAluno++;
    countDisciplina++;
  }
  
  public static String printInformacoes() {
    String str = "";
    int count = 0;		    
    
    while (numAlunos != alunos.length) {
      str += "Disciplina: " + disciplinas[count].getAluno() + "\n";
      count++;
    }
    
    if (alunos.length == 0) {
      str += "Nenhum aluno matriculado!\n";
    }
    
    return str;
  }
}
//Classe Aluno
public class Aluno {
  
  private String nome;
  private int matAluno;
  private Disciplina curso;
  
  public Aluno() { }
  
  public Aluno(String nome, int matAluno, Disciplina disciplina) {
    this.setNome(nome);
    this.setMatAluno(matAluno);
    this.setDisciplina(disciplina);		
  }

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

  public int getMatAluno() {
    return matAluno;
  }

  public void setMatAluno(int matricula) {
    this.matAluno = matricula;
  }

  public Disciplina getDisciplina() {
    return disciplina;
  }

  public void setDisciplina(Disciplina disciplina) {
    this.disciplina = disciplina;
  }
}
//Classe Professor
public class Professor {
  
  private String nome;
  private String departamento;
  private int matProfessor;
  private Disciplina disciplina;
  
  public Professor() { }
  
  public Professor(String nome, String departamento, int matProfessor, Disciplina disciplina) {
    this.setNome(nome);
    this.setDepartamento(departamento);
    this.setMatProfessor(matProfessor);	
    this.setDisciplina(disciplina);
  }

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

  public String getDepartamento() {
    return departamento;
  }

  public void setDepartamento(String departamento) {
    this.departamento = departamento;
  }

  public int getMatProfessor() {
    return matProfessor;
  }

  public void setMatProfessor(int matProfessor) {
    this.matProfessor = matProfessor;
  }

  public Disciplina getDisciplina() {
    return disciplina;
  }

  public void setDisciplina(Disciplina disciplina) {
    this.disciplina = disciplina;
  }
}
//Classe disciplina
public class Disciplina {
  
  private String horario;
  private String nome;	
  private int sala;
  private Aluno[] aluno;
  
  public Disciplina() { }
  
  public Disciplina(String horario, String nome, int sala, Aluno aluno) {
    this.setHorario(horario);
    this.setNome(nome);
    this.setSala(sala);	
    this.setAluno(aluno);
  }

  public String getHorario() {
    return horario;
  }

  public void setHorario(String horario) {
    this.horario = horario;
  }

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

  public int getSala() {
    return sala;
  }

  public void setSala(int sala) {
    this.sala = sala;
  }

  public Aluno getAluno() {
    return aluno;
  }

  public void setAluno(Aluno aluno) {
    this.aluno = aluno;
  }
}

ControleAcademico não deve estender Exception seus membros não devem ser static.

Não faz sentido Disciplina ter um get e set aluno pois ela contém um array de alunos e não um único aluno.

Eu acredito que entendi, vou estudar melhor…
Programação direcionada a objeto eu acho confuso, programo a mais de 20 anos com linguagem imperativa.

Olá, acho que consegui fazer o que está pedindo nos itens. Mas, está dando erro dizendo que os métodos da classe ControleAcademico devem ser static. Que teoricamente estaria errado…
Não entendi porque não pode estender Exception? Neste caso eu só posso lançar a exceção?

Segue em anexo meu código…

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// Classe que testa Controle Academico Simplificado
public class TesteControleAcademico {

	public Boolean validaCodigo(Aluno aluno) throws Exception {
		if (aluno.getMatAluno() <= 0) {
			throw new IllegalArgumentException("Codigo Invalido ...Nao pode ser Nulo ou Negativo");
		}
		return true;
	}

	public Boolean validaNome(Aluno aluno) {
		if (aluno.getNome() == null) {
			throw new IllegalArgumentException("Nome nao pode ser NULL ...");
		}
		if (aluno.getNome().length() == 0) {
			throw new IllegalArgumentException("Nome nao pode ser vazio ...");
		}
		Pattern p = Pattern.compile("[A-Z a-z]{2,35}");
		Matcher m = p.matcher(aluno.getNome());
		if (!m.matches()) {
			throw new IllegalArgumentException("Nome Invalido ...");
		}
		return true;
	}

	public static void main(String[] args) {
		Disciplina disciplinas; 
		Aluno aluno1 = new Aluno(123456, "Paulo", "computação");
		Disciplina MAP = new Disciplina("11:00-13:00", "Metodos Avançados em Programação", 007, 101);
		aluno1.getDisciplinas().add(MAP);
		
		ControleAcademico.realizaMatricula(aluno1);

		ControleAcademico.printInformacoes();

	}

}


import java.util.List;

//Classe Controle Academico
public class ControleAcademico {
	private List<Aluno> alunos;
	private List<Professor> professores;
	private List<Disciplina> disciplinas;
	
	
	public void realizaMatricula(Aluno aluno) {
		alunos.add(aluno);		
	}

	public String printInformacoes() {
		String str = "";
		int count = 0;

		while (count < alunos.size()) {
			str += "Aluno: " + alunos.get(count) + "\n";
			for (int i = 0; i < alunos.get(count).getDisciplinas().size(); i++)
				str += "Disciplina: " + alunos.get(count).getDisciplinas() + "\n";
			count++;
		}

		if (alunos.size() == 0) {
			str += "Nenhum aluno matriculado!\n";
		}

		return str;
	}
}


import java.util.List;

//Classe Aluno
public class Aluno {
	
	private String nome;
	private int matAluno;
	private String curso;
	private List<Disciplina> disciplinas;
		
	public Aluno() {
			
	}
	
	public Aluno(int matAluno, String nome, String curso) {
		this.setNome(nome);
		this.setMatAluno(matAluno);
		this.setCurso(curso);
	}
	public Aluno(int matAluno, String nome, List<Disciplina> disciplinas) {
		this.setNome(nome);
		this.setMatAluno(matAluno);
		this.setDisciplinas(disciplinas);
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getMatAluno() {
		return matAluno;
	}

	public void setMatAluno(int matricula) {
		this.matAluno = matricula;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}

	public String getCurso() {
		return curso;
	}

	public void setCurso(String curso) {
		this.curso = curso;
	}

}

import java.util.List;

//Classe Professor
public class Professor {

	private String nome;
	private String departamento;
	private int matProfessor;
	private List<Disciplina> disciplinas;
	
	public Professor() {

	}

	public Professor(String nome, String departamento, int matProfessor, List<Disciplina> disciplinas) {
		this.setNome(nome);
		this.setDepartamento(departamento);
		this.setMatProfessor(matProfessor);	
		this.setDisciplinas(disciplinas);
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDepartamento() {
		return departamento;
	}

	public void setDepartamento(String departamento) {
		this.departamento = departamento;
	}

	public int getMatProfessor() {
		return matProfessor;
	}

	public void setMatProfessor(int matProfessor) {
		this.matProfessor = matProfessor;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}



}

import java.util.List;
//Classe disciplina
public class Disciplina {
	private String horario;
	private String nome;
	private int codigo;
	private int sala;
	private List<Aluno> alunos;
	
	public Disciplina() {
		
	}
	
	public Disciplina(String horario, String nome, int codigo, int sala) {
		this.setHorario(horario);
		this.setNome(nome);
		this.setCodigo(codigo);
		this.setSala(sala);		
	}
	
	public Disciplina(String horario, String nome, int sala, List<Aluno> alunos ) {
		this.setHorario(horario);
		this.setNome(nome);
		this.setSala(sala);	
		this.setAlunos(alunos);
	}
	
	public String getHorario() {
		return horario;
	}

	public void setHorario(String horario) {
		this.horario = horario;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getSala() {
		return sala;
	}

	public void setSala(int sala) {
		this.sala = sala;
	}

	public List<Aluno> getAlunos() {
		return alunos;
	}

	public void setAlunos(List<Aluno> alunos) {
		this.alunos = alunos;
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
}


Não pode estender pois um “Controle Acadêmico” não é uma exceção.

A IDE está sugerindo isso pois você digitou “NomeDaClasse.nomeDoMetodo()”, essa é a sintaxe para acessar métodos estáticos.
O que você precisa é criar um objeto da classe ControleAcademico e aí chamar os métodos a partir do objeto, da mesma forma como faz com objetos da classe Aluno e da classe Disciplina.

Agora entendi como fazer, vai dar certo…
Muito obrigado pela atenção e disponibilidade!