Foro sobre Java SE > Lanzar Excepciones
Deberías controlar en cada iteración el formato de la línea que vas a pintar. Si está mal, lanzas la excepción (al hacerlo saldrías del bucle).
- Exceptions.
Después la capturas (try-catch) y pintas el mensaje.
nada que no me sale
¿Qué es lo que no te sale o no entiendes?
los parametros para que compruebe que el fichero tiene formato correcto y si todas y cada una de las filas tienen 3 columnas
Partiendo de este código:
//Leemos hasta que se termine el archivo
while ((linea = br.readLine()) != null) {
StringTokenizer tokenizer=new StringTokenizer(linea,",");
while (tokenizer.hasMoreTokens()){
System.out.println(tokenizer.nextToken());
}
}
Por cada línea creamos un objeto StringTokenizer. Este objeto contiene el texto que le pasamos como primer parámetro "en trozos". Si vamos a la documentación de este objeto:
...existe un método que te dice en cuántos trozos ha dividido el texto. Si estamos leyendo esta línea:
CARLOS;FERNANDEZ LOPEZ;25
El objeto "tokenizer" tendrá 3 "trozos". Con este dato puedes saber si el formato es correcto o no.
pero lo que me piden es añadir una excepcion:
Lanzar Excepciones:
Modificaremos nuestro programa, comprobando que el
fichero tiene un formato correcto. Se considerará que el
fichero tiene formato correcto si todas y cada una de las filas
tienen 3 columnas (ni más ni menos).
• Si el formato del fichero es correcto, mostrará un mensaje
que ponga: “Formato correcto”
• Si el formato es incorrecto, mostrará un mensaje: "Formato
incorrecto en línea x: la fila tiene yy columnas en lugar de 3".
Donde x es el número de la línea en la que se ha detectado el
error, e yy es el número de columnas de la fila.
El programa debe abortar la ejecución en cuanto encuentre el primer
error de formato, es decir, no se comprueba el fichero completo y se
muestran todos los errores, sino sólo el primero. Por tanto en cuanto
encontremos el primer error, lanzaremos una excepción (no se debe
utilizar la instrucción break).
Con mi mensaje anterior, puedes saber si una línea está mal formada (preguntando cuantos trozos tiene el objeto tokenizer). Si detectas una línea mal formada, deberías lanzar una excepción.
Aquí tienes información sobre Exceptions:
que no soy capaz, que lo dejo ya, ya entregaré el ejercicio como esté
Tendrías que hacer:
1º Crea tu Excepción. Para eso simplemente crea una clase que herede de Exception.
public class MiExcepcion extends Exception {
public MiExcepcion(String mensaje) {
super(mensaje);
}
}
2º
//Leemos hasta que se termine el archivo
int contadorLinea = 0;
while ((linea = br.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(linea, ",");
contadorLinea++;
int numeroDeColumnas = tokenizer.countTokens();
if (numeroDeColumnas == 3) {
System.out.println(linea);
} else {
throw new MiExcepcion("Error en " + contadorLinea + " por tener " + numeroDeColumnas + " columnas");
}
}
- int contadorLinea = 0;
Se usa para saber en qué linea estamos. Al principio vale 0. Nada más entrar en el bucle, como estamos leyendo una línea, le sumamos 1 ("contadorLinea++" es igual que hacer "contadorLinea = contadorLinea + 1").
- int numeroDeColumnas = tokenizer.countTokens();
Con esto sabemos cuántos trozos o columnas tiene esa línea.
- if (numeroDeColumnas == 3) {
Aquí preguntamos cuántos trozos hay. Si son 3, pintamos la línea. Si no son 3, lanzamos nuestra excepción.
cuando lo ejecuto me sale el siguiente error:
non-static variable this cannot be referenced from a static context
throw new FileFormatException("Error en " + contadorLinea + " por tener " + numeroDeColumnas + " columnas");
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
No enclosing instance of type LectorFichero is accessible. Must qualify the allocation with an enclosing instance of type LectorFichero (e.g. x.new A() where x is an instance of LectorFichero).
at LectorFichero.main(LectorFichero.java:41)
non-static variable this cannot be referenced from a static context te está diciendo que en un método estático (el main) no puedes usar variables no estáticas.
static: es un método al cual se puede invocar sin crear ningún objeto de dicha clase. Math.sin() y Math.cos() son dos ejemplos de métodos estáticos. Los métodos estáticos son equivalentes a las funciones de la programación estructurada. Desde un método estático sólo podemos invocar otros métodos que también sean estáticos, y sólo podemos acceder a atributos de la clase que sean estáticos.
Curso de programación Java III - Abraham Otero
¿Puedes poner el código que tienes ahora?
gracias, ya lo he solucionado el error:
import java.io.*;
import java.util.StringTokenizer;
public class LectorFichero {
FileReader fichero;
@SuppressWarnings("serial")
public class FileFormatException extends Exception {
public FileFormatException(String mensaje) {
super(mensaje);
}
}
public static void main(String[] args) {
File lector = null;
FileReader fr = null;
BufferedReader br = null;
String linea = null;
try {
//Cargamos el archivo de la ruta relativa
lector = new File("C:\\eclipse\\workspace\\LectorFichero\\src\\ ejemplo.csv");
//Cargamos el objeto FileReader
fr = new FileReader(lector);
//Creamos un buffer de lectura
br = new BufferedReader(fr);
//Leemos hasta que se termine el archivo
while ((linea = br.readLine()) != null) {
StringTokenizer tokenizer=new StringTokenizer(linea,",");
while (tokenizer.hasMoreTokens()){
System.out.println(tokenizer.nextToken());
}
}
int contadorLinea = 0;
while ((linea = br.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(linea, ",");
contadorLinea++;
int numeroDeColumnas = tokenizer.countTokens();
if (numeroDeColumnas == 3) {
System.out.println(linea);
} else {
throw new LectorFichero().new FileFormatException("Error en " + contadorLinea + " por tener " + numeroDeColumnas + " columnas");
}
}
//Capturamos las posibles excepciones
} catch (Exception e) {
System.out.println("Error al leer el fichero:" + e.getMessage());
} finally {
}
}
}
Por lo que veo, estas creando todo en la misma clase y no es una buena práctica.
Te aconsejo que crees la clase FileFormatException a parte.
Otra cosa, deberías eliminar el primer while:
while ((linea = br.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(linea, ",");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
}
Mi ultimo ejercicio del curso
tengo realizado 2 de las 3 partes que me piden:
import java.io.*;
import java.util.StringTokenizer;
public class LectorFichero {
FileReader fichero;
public static void main(String[] args) {
File lector = null;
FileReader fr = null;
BufferedReader br = null;
String linea = null;
try {
//Cargamos el archivo de la ruta relativa
lector = new File("C:\\eclipse\\workspace\\LectorFichero\\src\\ejemplo.csv");
//Cargamos el objeto FileReader
fr = new FileReader(lector);
//Creamos un buffer de lectura
br = new BufferedReader(fr);
//Leemos hasta que se termine el archivo
while ((linea = br.readLine()) != null) {
StringTokenizer tokenizer=new StringTokenizer(linea,",");
while (tokenizer.hasMoreTokens()){
System.out.println(tokenizer.nextToken());
}
}
//Capturamos las posibles excepciones
} catch (Exception e) {
System.out.println("Error al leer el fichero:" + e.getMessage());
} finally {
}
}
}
el resultado es el siguiente:
NOMBRE;APELLIDOS;EDAD
CARLOS;FERNANDEZ LOPEZ;25
JUAN;MARTINEZ PEREZ;23
MARTIN;RUIZ ALAMO;99
ahora me piden lo siguiente:
Lanzar Excepciones:
Modificaremos nuestro programa, comprobando que el
fichero tiene un formato correcto. Se considerará que el
fichero tiene formato correcto si todas y cada una de las filas
tienen 3 columnas (ni más ni menos).
• Si el formato del fichero es correcto, mostrará un mensaje
que ponga: “Formato correcto”
• Si el formato es incorrecto, mostrará un mensaje: "Formato
incorrecto en línea x: la fila tiene yy columnas en lugar de 3".
Donde x es el número de la línea en la que se ha detectado el
error, e yy es el número de columnas de la fila.
Implementación
• El programa debe abortar la ejecución en cuanto encuentre el primer
error de formato, es decir, no se comprueba el fichero completo y se
muestran todos los errores, sino sólo el primero. Por tanto en cuanto
encontremos el primer error, lanzaremos una excepción (no se debe
utilizar la instrucción break).
• Utilizaremos una excepción definida por nosotros, por ejemplo que se
llame FileFormatException, que debe heredar de Exception. El
constructor de esta excepción tomaría como argumento el texto que
finalmente mostraremos como mensaje de error, invocando al
constructor de la clase padre mediante “super(mensaje)”
• El método countTokens() de la clase StringTokenizer nos indicará el
número de columnas que tiene una fila.
• Capturaremos y trataremos la excepción de forma similar a
IOException, es decir, en el método main. Por tanto el método
leerFichero() ahora lanzará dos tipos de excepciones: IOException y
FileFormatException.