Java - Problemas con un parser

 
Vista:

Problemas con un parser

Publicado por Alejandro Frasch (2 intervenciones) el 26/03/2007 16:16:38
Hola gente,
Tengo que hacer un pequenio test en java y recien lo estoy aprendiendo. Entre todo lo que he leido (Java in a Nutshell, otro libraco de 1500 paginas, el tutorial de Sun y alguno mas) no he encontrado algo que me indique como solucionar mi problemas.

El codigo que he escrito me da un NullPointerException en un for que les pego a continuacion:

for (User aUser: userArray) {
System.out.println(aUser.toString());
}

No se si el error esta justo aqui, o en el ultimo return de la class. Alguno de Uds. me podria dar una manito?
A continuacion todo el codigo de parser.java...el de User.java, que es tan solo un objeto, esta bien
Desde ya muy agradecido por cualquier ayuda.

Aca va el codigo:

/**
* @author alefra_2
*
*/

public class Parser{

static String[] linesToParse = { "#Special Users", "[user:sam]", "real_name=Sam Knight", "character_name=coolsam", "character_age=45", "#Normal Users", "[user:tom]", "real_name=Tom Flowers", "character_name=tomtom", "character_age=8"};

static int lineNbrBeingProcessed; // puntero al lines

static int currentUser = 0; // puntero a los users

/**
* @param userArray
* @param newUser
* @return
*/
public static User[] addUserToArray (User[] userArray, User newUser) {
User[] newUserArraya = new User[userArray.length + 1];
for(int i =0 ; i < userArray.length ; i ++) {
newUserArraya[i] = userArray[i];
}
newUserArraya[userArray.length] = newUser;

return newUserArraya;
} /* End of User[] addUserToArray */
/**
* @param args
*/
public static void main(String[] args){
User[] userArray =parse(linesToParse);

for (User aUser: userArray) {
System.out.println(aUser.toString());
}

} /* End of main */
/**
* @param linesToParse
* @return
*/

static User[] parse(String[] linesToParse) {
User[] userArray = new User[0];
while(lineNbrBeingProcessed < linesToParse.length){
User user = parseUser();
if(user == null){
return null;
}else{
userArray = addUserToArray(userArray, user);
}
}
return userArray;

} /* End of User[] parse(String linesToParse) */

/**
* @return
*/
public static User parseUser(){

// parsing linesToParse finding the line with #
// at the beginning. This marks the beginning of each user
// Then advance lins one by one, extract whatever is after
// the #, the :, or the =, pack it in a new user object
// return this new user.

if(linesToParse[lineNbrBeingProcessed].length() == 0){
System.out.println("Line Nr. "+lineNbrBeingProcessed+" is empty.");
System.out.println("Please correct the input file");
}else{
if(linesToParse[lineNbrBeingProcessed].indexOf( '#' ) == 0){
User usuario = new User();
int index = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
String userType = linesToParse[lineNbrBeingProcessed].substring( index+2, linesToParse[lineNbrBeingProcessed].length());
usuario.setUserType(userType);
lineNbrBeingProcessed++;
int index1 = linesToParse[lineNbrBeingProcessed].indexOf( ":" );
String userId = linesToParse[lineNbrBeingProcessed].substring( index1+1, linesToParse[lineNbrBeingProcessed].length()-1 );
usuario.setUserId(userId);
lineNbrBeingProcessed++;
int index2 = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
String userName = linesToParse[lineNbrBeingProcessed].substring( index2+1, linesToParse[lineNbrBeingProcessed].length() );
usuario.setRealName(userName);
lineNbrBeingProcessed++;
int index3 = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
String userCharacter = linesToParse[lineNbrBeingProcessed].substring( index3+1, linesToParse[lineNbrBeingProcessed].length() );
usuario.setCharacterName(userCharacter);
lineNbrBeingProcessed++;
int index4 = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
int userAge = Integer.parseInt(linesToParse[lineNbrBeingProcessed].substring( index4+1));
usuario.setCharacterAge(userAge);
return usuario;
}

}


lineNbrBeingProcessed++;
return null;
} /* End of parseUser() */
} /* End of class */
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas con un parser

Publicado por angel (537 intervenciones) el 26/03/2007 16:26:07
Esta sentencia la has escrito mal o la tienes asi:
for (User aUser: userArray) {
System.out.println(aUser.toString());
}

Nunca habia visto un for asi escrito....es cierto qu puedes tenr un for(;;)..pero con ":"....

D todas formas el nullpointer sabes que t salta por que tiens un valor nulo antes de un punto....fijate en que linea t salta y comprueba que el objeto qu intentas usar no tenga como valor null.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas con un parser

Publicado por Alejandro Frasch (2 intervenciones) el 26/03/2007 16:53:35
OK Angel,

He cambiado el ultimo return del codigo y ahora no me da error, pero me da dos lineas que no deseo y no se como evitarlas.

Aca el codigo:

/**
* @author alefra_2
*
*/

public class Parser{

static String[] linesToParse = { "#Special Users", "[user:sam]", "real_name=Sam Knight", "character_name=coolsam", "character_age=45", "#Normal Users", "[user:tom]", "real_name=Tom Flowers", "character_name=tomtom", "character_age=8"};

static int lineNbrBeingProcessed; // puntero al lines

static int currentUser = 0; // puntero a los users

/**
* @param userArray
* @param newUser
* @return
*/
public static User[] addUserToArray (User[] userArray, User newUser) {
User[] newUserArraya = new User[userArray.length + 1];
for(int i =0 ; i < userArray.length ; i ++) {
newUserArraya[i] = userArray[i];
}
newUserArraya[userArray.length] = newUser;

return newUserArraya;
} /* End of User[] addUserToArray */
/**
* @param args
*/
public static void main(String[] args){
User[] userArray =parse(linesToParse);

for (User aUser: userArray) {
System.out.println(aUser.toString());
}

} /* End of main */
/**
* @param linesToParse
* @return
*/

static User[] parse(String[] linesToParse) {
User[] userArray = new User[0];
while(lineNbrBeingProcessed < linesToParse.length){
User user = parseUser();
if(user == null){
return null;
}else{
userArray = addUserToArray(userArray, user);
}
}
return userArray;

} /* End of User[] parse(String linesToParse) */

/**
* @return
*/
public static User parseUser(){

// parsing linesToParse finding the line with #
// at the beginning. This marks the beginning of each user
// Then advance lins one by one, extract whatever is after
// the #, the :, or the =, pack it in a new user object
// return this new user.

if(linesToParse[lineNbrBeingProcessed].length() == 0){
System.out.println("Line Nr. "+lineNbrBeingProcessed+" is empty.");
System.out.println("Please correct the input file");
}else{
if(linesToParse[lineNbrBeingProcessed].indexOf( '#' ) == 0){
User usuario = new User();
int index = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
String userType = linesToParse[lineNbrBeingProcessed].substring( index+2, linesToParse[lineNbrBeingProcessed].length());
usuario.setUserType(userType);
lineNbrBeingProcessed++;
int index1 = linesToParse[lineNbrBeingProcessed].indexOf( ":" );
String userId = linesToParse[lineNbrBeingProcessed].substring( index1+1, linesToParse[lineNbrBeingProcessed].length()-1 );
usuario.setUserId(userId);
lineNbrBeingProcessed++;
int index2 = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
String userName = linesToParse[lineNbrBeingProcessed].substring( index2+1, linesToParse[lineNbrBeingProcessed].length() );
usuario.setRealName(userName);
lineNbrBeingProcessed++;
int index3 = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
String userCharacter = linesToParse[lineNbrBeingProcessed].substring( index3+1, linesToParse[lineNbrBeingProcessed].length() );
usuario.setCharacterName(userCharacter);
lineNbrBeingProcessed++;
int index4 = linesToParse[lineNbrBeingProcessed].indexOf( "=" );
int userAge = Integer.parseInt(linesToParse[lineNbrBeingProcessed].substring( index4+1));
usuario.setCharacterAge(userAge);
return usuario;
}

}


lineNbrBeingProcessed++;
return new User();
} /* End of parseUser() */
} /* End of class */

Aca el resultado:

user Type = Special Users | User Id = sam | Real Name = Sam Knight | Character Name = coolsam | Character Age = 45
user Type = null | User Id = null | Real Name = null | Character Name = null | Character Age = 0
user Type = Normal Users | User Id = tom | Real Name = Tom Flowers | Character Name = tomtom | Character Age = 8
user Type = null | User Id = null | Real Name = null | Character Name = null | Character Age = 0

Las lineas que dicen = null quisiera evitarlas. Donde me he equivocado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas con un parser

Publicado por angel (537 intervenciones) el 26/03/2007 17:37:15
Hola, quizas esas ultimas lineas que t salen como null, sean de los ultimo obejetos qu has añadido a tu array.
Si añades un nuevo objeto de la clase User, aunk hagas un new User() antes de introducirlo en el array, si en el constructor no inicalizas los valores de la variables que pertenezzcan a esa clase, sus valores seran los valores por defecto, para numero 0 y para objeto y String null.

Comprueba que los elementos de la clase User que añadas al array se inicializan con algun valor.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar