Errores Java Que No Entiendo

SrRive

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();
}



}
TicTaK
Tienes el tag "code" para poner el código de esta forma, nadie te va a depurar nada de eso teniendo que leerlo así.
1 respuesta
SrRive

#2 Gracias, lo edito, no lo sabia :)

Fyn4r

Estaba bien poder echar un ojo al enunciado, en todo caso, esas interfaces (salvo que las pidan porque si) fuera. Para metodos como checkear emails (que tanto la persona como el alumno van a tener el suyo) la cosa seria que el alumno sobreescriba el de la clase padre.

1 respuesta
SrRive

#4 Gracias por responder, las interfaces me las piden :) te dejo el enunciado de Alumno.

1: http://gyazo.com/0a8b3d1e7abdc67ad4a077c2c2c8d731
2: http://gyazo.com/65de52f81d35f86dd69209755986b023

Saludos

gonya707

Antes de preguntar cualquier cosa deberias pensar un poco en nosotros y preguntarnos cumpliendo estas tres cosas:

-Codigo bien tabulado, sino no hay quien lo lea
-Codigo bien espaciado. Que son esos huecos de +5 lineas en blanco...? lo que te ocupa 15 lineas te podria ocupar 50
-Intentar detectar en que parte del codigo peta y pegarnos solo esa parte... Ahora mismo no es un proyecto enorme, pero si tienes 20 ficheros .java de mas de 500 lineas nos los habrias pegado todos?

Comprende que para nosotros es muchisimo mas trabajo para meternos en el problema, y nosotros no tenemos el aliciente motivacional de que nos pueden suspender ;)

Dejando ese tema aparte... si tienes 500 errores al compilar esto es que hay algo muy chungo detrás.

1 respuesta
B

#1 Eres de mi calse jejejejeje.

Yo soy del g1 computadores y tu?

PD: No te puedo ayudar porque no hice la entrega anterior.

1 respuesta
SrRive

#6 lo sé, por eso solo he puesto una clase, porque probablemente si resolvemos esa, con la información puedo resolver las demás, gracias por responder.

#7 Yo estoy en TI jajajaj

2 respuestas
B

#8 TI?

PD: Esto es lo poco que hice de mi código

cabron

#8

Como norma general, nadie se va leer todo eso para ayudarte, no es imposible, pero sí improbable, pero no en este foro, si no en ninguno de todo Internet.

Cuando tengas un problema con código intenta aislar el problema y reducirlo todo lo posible a unas pocas líneas, y pon solo lo que sea relevante, si no nadie se va a molestar en mirarlo.

Gleim

No colgaste la clase que probablemente te esté dando más problemas, que es AsignaturaImpl. Igualmente deberías olvidarte de los testcases ahora mismo, y hacer que funcione la aplicación de manera básica, ya que con eso vas a corregir la mitad de ellos, y la otra mitad son métodos de consulta/comprobación de excepciones.

Lecherito

http://sscce.org/

Siempre que vayas a pedir ayuda, además de:

perez_chuck

Me parece un poco fuerte que te pidan "tanto" en una asignatura de 1º en el primer cuatrimestre encima

Lo de los tests lo he utilizado como en 4º y en una asignatura, que sí utilizábamos JAVA, pero era de procesos y métodos de desarrollo...

Yo me centraría en que funcionara todo, a la perfección.

Lo de los tests es un coñazo de pm, y a veces te tiras horas por chorradas que no vienen ni a cuento, como declarar una variable y testear que esa variable tiene el valor que le asignaste... en la siguiente línea de código!!
Sin sentido totalmente vamos.

2 respuestas
SrRive

#13 lo sé , el caso es que corrigen con esos test, segun tus fallos va la nota :(

1 respuesta
m4andg4

Tabula plssss :f5:

perez_chuck

#14 ya decía yo... vamos que se la sopla enseñar, o enseñan bien?

yo haría eso, que funcione todo y luego ya te preocupas de los tests, porque ambas al mismo tiempo no x)

2 respuestas
SrRive

#16 pues regular la verdad... dan test para las clases por separados que me van perfectos, aun asi en el JUnit me salen 500 errores así que.. del tipo del de los gyazos

BeerSerk

Personalmente, para el Primer Error intentaría con esto, porque parece el código correcto:

public String toString(){
return getDNI()+"-"+getApellidos()+", "+getNombre()+"-"+getFechaNacimiento();
}

PD: Todo lo que no sea una clase, en minúsculas. Asignaturas es una variable de tipo HashSet y te hace pensar que es un clase como si lo es Asignatura ;)

1 respuesta
SrRive

#18 Gracias amigo, el toString lo he progado así antes y tampoco, ni idea de porque :(

1 respuesta
BeerSerk

#19 intenta ver la linea que te indicael error, a nosotros noa sale de otra manera.

Indica la linea 166.

Intenta llamar primero al super.tostring y guardarlo en una variable y despues concatenarlo al string completo de salida.

1 respuesta
SrRive

#20 si, indica la linea 166 de TestAlumnoImpl, pero no le encuentro sentido ya que es esta :

http://gyazo.com/ac0b048a96bf6480b40cb7acae5ccc6f

1 respuesta
Scottie

#21 es porque estas imprimiendo una coleccion. Si a.getAsignaturas() devolviese un String si podria imprimirlo.

B

#13 #16 No nos explican una mierda, almenos en mi facul, que no se exactamente lo que hace el, pero los test y los problemas son los mismos. Ademas la entrega es el día 7, osea hoy y si no la entregas con 0 fallos no puedes hacer la defensa del proyecto

Usuarios habituales