Muy buenas, soy nuevo en este foro así que como primer tema, me presento.
Soy Carlos, 19 años, estudio ingeniería informática en Sevilla, estoy en mi segundo año aunque estoy repitiendo primero.
Bien, pues en primero estamos dando Java, y el objetivo durante el curso es hacer un trabajo práctico que consiste en crear una especie de base de datos para los alumnos, asignaturas, profesores, departamentos y un largo etc.
El trabajo hay que ir entregandolo durante el curso dividido en 4 entregas. La primera entrega fue el 1 de diciembre, entrega que consta de 5 boletines.
Bien, pues para esa entrega, los profesores han creado un test para ver tus fallos y así corregirlos. Tenía más de 700 fallos en esa entrega y llevo tooodas las navidades tratando de corregir todos los fallos, ya que el 7 es la segunda entrega, para la cual tenemos que tener esos fallos corregidos y además tenemos que haberle añadido al trabajo otros 3 boletines nuevos.
Mi objetivo por ahora era corregiro todos los fallos, porque siendo tantos ni de coña iba a poder hacer los 3 nuevos boletines correctamente si ni si quiera se corregir lo anterior.
El tema, y aquí es donde necesito ayuda, es que he conseguido resolver unos cuantos fallos, preguntando a compañeros y mandando correos a mis profesores de la asignatura. Ahora me he quedado en 500 fallos, los cuales cada dia tras unas cuantas horas quizás resulevo 1. Hay muchos del mismo tipo que no se resolver y ahí es donde me como la cabeza, no entiendo dónde tengo el fallo, me gustaría que, si sabéis como va el JUnit que es por donde pasamos los test, si me podéis más o menos explicar a qué se refiere con los fallos para así poder solucionarlo yo me sería de gran ayuda. Os dejo por ahora una sola clase y sus fallos, a ver si a partir de ahí puedo sacar yo solo lo demás. Me encanta programar y me gustaría saber mucho sobre ello, pero ahora necesito un cable o una gran cuerda más bien.
CÓDIGO ALUMNO:
package fp.grados.tipos;
import java.util.Set;
public interface Alumno extends Persona {
Set<Asignatura> getAsignaturas();
void matriculaAsignatura(Asignatura asig);
void eliminaAsignatura(Asignatura asig);
Boolean estaMatriculadoEn(Asignatura asig);
Integer getCurso();
}
CÓDIGO AlumnoImpl:
package fp.grados.tipos;
import java.time.LocalDate;
import java.util.HashSet;
import java.util.Set;
import fp.grados.excepciones.ExcepcionAlumnoNoValido;
import fp.grados.excepciones.ExcepcionAlumnoOperacionNoPermitida;
public class AlumnoImpl extends PersonaImpl implements Alumno {
HashSet<Asignatura> Asignaturas = new HashSet<Asignatura>();
private Integer Curso;
public AlumnoImpl(String dni, String nombre, String apellidos,
LocalDate fechaNacimiento, String email) {
super(dni,nombre,apellidos,fechaNacimiento,email);
checkEmailUniversidad(email);
};
public void checkEmailUniversidad(String email){
boolean esCorrecto = email.endsWith("@alum.us.es");
if(email.isEmpty() || !esCorrecto)
{
throw new ExcepcionAlumnoNoValido("El email de un alumno debe terminar en @alum.us.es.");
}
}
public void setEmail(String email){
checkEmailUniversidad(email);
super.setEmail(email);
}
public Set<Asignatura> getAsignaturas(){
return Asignaturas;
}
public Integer getCurso() {
return Curso;
}
public Boolean estaMatriculadoEn (Asignatura asig){
return Asignaturas.contains(asig);
}
public void matriculaAsignatura(Asignatura asig){
if (estaMatriculadoEn(asig)){
throw new ExcepcionAlumnoOperacionNoPermitida("El alumno ya está matriculado en esta asignatura");
}
Asignaturas.add(asig);
}
public void eliminaAsignatura(Asignatura asig){
Boolean EsCorrecto = estaMatriculadoEn(asig);
if(!EsCorrecto){
throw new ExcepcionAlumnoOperacionNoPermitida("El alumno no está matriculado en esta asignatura.");
}
Asignaturas.remove(asig);
}
public int compareTo(Alumno a) {
int result= getApellidos().compareTo(a.getApellidos());
if (result == 0){
result = getNombre().compareTo(a.getNombre());
if (result == 0){
result = getDNI().compareTo(a.getDNI());
}
}
return result;
}
public boolean equals(Object obj){
boolean result = true;
if (obj instanceof Alumno){
Alumno a = (Alumno)obj;
result = getDNI().equals(a.getDNI()) && getNombre().equals(a.getNombre()) && getApellidos().equals(a.getApellidos());
;
}
return result;
}
public String toString(){
return "("+getCurso()+"º) "+ super.toString();
}
}
Ha de decir que con el Asignaturas tenía un error, me salía un NullPointerException con el que me comí muchísimo la cabeza, mandé correos y me decían que era porque tenía que inicializar Asignaturas para poder añadir o eliminar asig, y la única solución a la que he llegado hace un ratillo es ponerla HashSet, y así me he quitado un error, aunque no sé si es correcto.
Aquí los herrores de AsignaturaImpl :
error toString : http://gyazo.com/811ebd781842884ed4ddcc740e963393
error eliminAsignatura1 : http://gyazo.com/dc9683ada390920442b9b36f75763b11
error eliminAsignatura2 : http://gyazo.com/820ede1284c2a290cff4c41791cf7ee8
error eliminAsignatura3 : http://gyazo.com/781b12b80bfd749f2eedf5b109ddc388
error getedad1 : http://gyazo.com/96cc3192ea6c5324f4ed53a4f9c7db32
(hay 3 como este,pero diferentes edades, será por la misma causa)
error MatriculaAsignaturaExcepcion 1 : http://gyazo.com/db662d03b644245b2d0416e679c0fc7c
(2 como este)
error EstaMatriculadoEn : http://gyazo.com/b594ad001ea249f5929b46bef0823ea9
(5 como este)
error EliminaAsignatura : http://gyazo.com/6e03a8bb9823096b57ca47a7a9cc0042
(2 como este)
error MatriculaAsignatura : http://gyazo.com/c8f0b1b54dc187dfd84fce7f2464f245
(2 como este)
error Nulidad : http://gyazo.com/1ee09dd14f7aede9629be30c6e5499f1
ese es el último de AlumnoImpl
Viendo los errores me ha dado mucho que pensar, y se me ocurría que alomejor tenía que añadir algo al constructor o nose, he buscado mucho sobre los métodos pero no doy con la solución o soy muy torpe.
Como podéis ver en los gyazos, para DNI y demás tipos si funcionan los métodos, pero comparo y no encuentro nada, no entiendo qué me falla...
Me gustaría saber que tengo que hacer, no busco que nadie me haga el trabajo, pero reconozco que necesito mucha ayuda para dar con los problemas y así ya poder resolverlos yo mismo.
Muchas gracias
PD: Añado la clase PersonaImpl ya que Alumno hereda los métodos de ella.
CÓDIGO PersonaImpl:
package fp.grados.tipos;
import java.time.LocalDate;
import fp.grados.excepciones.ExcepcionPersonaNoValida;
public class PersonaImpl implements Persona {
private String DNI;
private String Nombre;
private String Apellidos;
private LocalDate FechaNacimiento;
private String Email;
private Integer Edad;
public PersonaImpl(String dni, String nombre, String apellidos,
LocalDate fechanacimiento, String email) {
checkDNI(dni);
checkEmail(email);
this.DNI = dni;
this.Nombre = nombre;
this.Apellidos = apellidos;
this.FechaNacimiento = fechanacimiento;
this.Email = email;
}
public void checkDNI(String dni){
Boolean esDniCorrecto = checkDniTipoCaracteres(dni)&&checkDniLetra(dni);
if (!esDniCorrecto){
throw new ExcepcionPersonaNoValida("El dni debe estar formado por 8 numeros seguidos de 1 letra de una lista.");
}
}
private Boolean checkDniTipoCaracteres(String dni){
return dni.length()==9&&
Character.isDigit(dni.charAt(0))&&
Character.isDigit(dni.charAt(1))&&
Character.isDigit(dni.charAt(2))&&
Character.isDigit(dni.charAt(3))&&
Character.isDigit(dni.charAt(4))&&
Character.isDigit(dni.charAt(5))&&
Character.isDigit(dni.charAt(6))&&
Character.isDigit(dni.charAt(7))&&
Character.isLetter(dni.charAt(8));
}
private Boolean checkDniLetra(String dni){
//Precondición: se ha comprobado previamente que dni tiene 8 digitos y una letra.
String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
Integer numeroDni = new Integer(dni.substring(0, 8));
return dni.charAt(8)==letras.charAt(numeroDni%23);
}
public void checkEmail(String email){
if (!(email.isEmpty() || email.contains("@"))){
throw new ExcepcionPersonaNoValida("El email debe estar vacio o tener el caracter '@' ");
}
}
@Override
public String getDNI() {
// TODO Auto-generated method stub
return DNI;
}
@Override
public String getNombre() {
// TODO Auto-generated method stub
return Nombre;
}
@Override
public String getApellidos() {
// TODO Auto-generated method stub
return Apellidos;
}
@Override
public LocalDate getFechaNacimiento() {
// TODO Auto-generated method stub
return FechaNacimiento;
}
@Override
public String getEmail() {
// TODO Auto-generated method stub
return Email;
}
@Override
public Integer getEdad() {
// TODO Auto-generated method stub
return Edad;
}
@Override
public void setDNI(String dni) {
checkDNI(dni);
this.DNI = dni;
}
@Override
public void setNombre(String nombre) {
// TODO Auto-generated method stub
this.Nombre = nombre;
}
@Override
public void setApellidos(String apellidos) {
// TODO Auto-generated method stub
this.Apellidos = apellidos;
}
@Override
public void setFechaNacimiento(LocalDate fechanacimiento) {
// TODO Auto-generated method stub
this.FechaNacimiento = fechanacimiento;
}
@Override
public void setEmail(String email) {
checkEmail(email);
this.Email = email;
}
@Override
public void setEdad(Integer edad) {
this.Edad = edad;
}
public String toString(){
return DNI+"-"+Apellidos+", "+Nombre+"-"+FechaNacimiento;
}
public int compareTo(Persona p) {
int result= getApellidos().compareTo(p.getApellidos());
if (result == 0){
result = getNombre().compareTo(p.getNombre());
if (result == 0){
result = getDNI().compareTo(p.getDNI());
}
}
return result;
}
public boolean equals(Object obj){
boolean result = true;
if (obj instanceof Persona){
Persona p = (Persona)obj;
result = getDNI().equals(p.getDNI()) && getNombre().equals(p.getNombre()) && getApellidos().equals(p.getApellidos());
}
return result;
}
public int hashCode(){
return getDNI().hashCode() + 31*getNombre().hashCode() + 31*31*getApellidos().hashCode();
}
}