Materia: Taller de Programación Orientada a Objetos
Jueves M1-M2
Hola a todos, en esta entrada les explicare un poco sobre el uso de excepciones, errores y eventos dentro de mi proyecto.
Excepciones
Algunas de las excepciones que he agregado a mi proyecto están en la parte de validación de datos por parte del usuario.
package nutrilife.gui; import nutrilife.dieta.*; import java.util.InputMismatchException; /** * * @author Carmen Suarez */ public class Main { public static void main(String[] args) { //Variable that stores that will stream the input from console Dieta D = new Dieta(); boolean control = true; do { try { InputDieta.input(D); control = false; } catch (InputMismatchException inputMismatchException) { inputMismatchException.printStackTrace(); System.out.println("Vuelve a meter los datos"); } }while( control ); } }
package nutrilife.gui; import nutrilife.dieta.*; import java.util.*; /** * * @author Carmen Suarez */ public class InputDieta { static void input(Dieta D) throws InputMismatchException { Scanner scan = new Scanner(System.in); System.out.println("Dame el numero de energia"); D.setEnergia(scan.nextDouble()); System.out.println("Energia: " + D.getEnergia()); boolean c = true; //Variable de control //Entrar porcentajes do { try { System.out.print("Dame el porcenaje de carbohidratos: "); D.setPorcentajeCarbohidrato(scan.nextDouble()); System.out.println("Porcentaje de carbohidratos: " + D.getPorcentajeCarbohidrato()); System.out.print("Dame el porcenaje de proteinas: "); D.setPorcentajeProteina(scan.nextDouble()); System.out.println("Porcentaje de proteinas: " + D.getPorcentajeProteina()); System.out.print("Dame el porcenaje de lipidos: "); D.setPorcentajeLipido(scan.nextDouble()); System.out.println("Porcentaje de lipidos: " + D.getPorcentajeLipido()); D.setPorcentajeTotal(); // Calcula el valor para la variable porcentajeTotal if( D.getPorcentajeTotal() != 100) { throw new MyException(); } c = false; D.setCarbohidratos(); // Calcula el valor para la variable carbohidrato D.setProteina(); // Calcula el valor para la variable proteina D.setLipido(); // Calcula el valor para la variable lipido } catch(MyException myException) { myException.getMessage(); myException.printStackTrace(); } }while(c); // Termina entrada de porcentajes //Entrada de Intercambios //intercambios de grupo: Leche System.out.print("Dame el intercambio de leche descremada: "); D.setIntercambioLecheDescremada(scan.nextInt()); System.out.println("Intercambios para leche descremada: " + D.getIntercambioLecheDescremada()); System.out.print("Dame el intercambio de leche semidescremada: "); D.setIntercambioLecheDescremada(scan.nextInt()); System.out.println("Intercambios para leche semidescremada: " + D.getIntercambioLecheSemidescremada()); System.out.print("Dame el intercambio de leche entera: "); D.setIntercambioLecheEntera(scan.nextInt()); System.out.println("Intercambios para leche entera: " + D.getIntercambioLecheEntera()); System.out.print("Dame el intercambio de leche con azucar: "); D.setIntercambioLecheConAzucar(scan.nextInt()); System.out.println("Intercambios para leche con azucar: " + D.getIntercambioLecheConAzucar()); //Intercambios de grupo: Fruta System.out.print("Dame el intercambio de la fruta: "); D.setIntercambioFruta(scan.nextInt()); System.out.println("Intercambios para la frutar: " + D.getIntercambioFruta()); //Intercambios de grupo: Verdura System.out.print("Dame el intercambio de la verdura: "); D.setIntercambioVerdura(scan.nextInt()); System.out.println("Intercambios para la verdura: " + D.getIntercambioVerdura()); //Intercambios de grupo: Azucar System.out.print("Dame el intercambio de la azucar sin grasa: "); D.setIntercambioAzucarSinGrasa(scan.nextInt()); System.out.println("Intercambios para la azucar sin grasa: " + D.getIntercambioAzucarSinGrasa()); System.out.print("Dame el intercambio la azucar con grasa: "); D.setIntercambioAzucarConGrasa(scan.nextInt()); System.out.println("Intercambios para la azucar con grasa: " + D.getIntercambioAzucarConGrasa()); //Intercambios de grupo: Leguminosas y Cereales System.out.print("Dame el intercambio la leguminosa: "); D.setIntercambioLecheConAzucar(scan.nextInt()); System.out.println("Intercambios para la leguminosa: " + D.getIntercambioLecheConAzucar()); System.out.print("Dame el intercambio del cereal sin grasa: "); D.setIntercambioCerealSinGrasa(scan.nextInt()); System.out.println("Intercambios para del cereal sin grasa: " + D.getIntercambioCerealSinGrasa()); System.out.print("Dame el intercambio del cereal con grasa: "); D.setIntercambioCerealConGrasa(scan.nextInt()); System.out.println("Intercambios para del cereal con grasa: " + D.getIntercambioCerealConGrasa()); //Intercambios de grupo: Alimentos de origen animal System.out.print("Dame el intercambio la carne muy magra: "); D.setIntercambioAlimentoMuyMagro(scan.nextInt()); System.out.println("Intercambios para la carne muy magra: " + D.getIntercambioAlimentoMuyMagro()); System.out.print("Dame el intercambio la carne magra: "); D.setIntercambioAlimentoMagro(scan.nextInt()); System.out.println("Intercambios para la carne magra: " + D.getIntercambioAlimentoMagro()); System.out.print("Dame el intercambio la carne semigrasa: "); D.setIntercambioAlimentoSemigraso(scan.nextInt()); System.out.println("Intercambios para la carne semigrasa: " + D.getIntercambioAlimentoSemigraso()); System.out.print("Dame el intercambio la carne grasa: "); D.setIntercambioAlimentoGraso(scan.nextInt()); System.out.println("Intercambios para la carne grasa: " + D.getIntercambioAlimentoGraso()); //Intercambios de grupo: Aceites System.out.print("Dame el intercambio de aceite sin proteina: "); D.setIntercambioAceiteSinProteina(scan.nextInt()); System.out.println("Intercambios para de aceite sin proteina: " + D.getIntercambioAceiteSinProteina()); System.out.print("Dame el intercambio de aceite con proteina: "); D.setIntercambioAceiteConProteina(scan.nextInt()); System.out.println("Intercambios para de aceite con proteina: " + D.getIntercambioAceiteConProteina()); } }
La clase IOUser lo que hace es crear una dieta con valores default y mandar a llamar a al método estático input de la clase InputDieta para que pueda inicializar los datos de la dieta. Este llamado está dentro de un bloque try, lo que nos permite atrapar cualquier excepción que se arroje dentro de él.
El bloque catch solamente imprime el StactTrace de la excepción que es una descripción de donde se origina el error de la excepción y todos los saltos que dio para llegar al try. Estuve leyendo que esta manera de desplegar, aunque es un tanto gorrosa para el usuario sirve mucho para hacer debugs de los programas y saber exactamente donde se origina el error.
Lo que hice fue meter los bloques try y catch dentro de un do-while para que el usuario vuelva a meter todos los datos desde el principio, ya que no se puede asegurar que ciertos datos estén bien y otros no (Como es en el caso de que la excepción se mande en la validación de porcentajeTotal). Este do-while solamente finaliza cuando el método input retorna el control del programa al método que lo llamo y después la variable booleana que controla el do-while es asignado con un valor falso para que salga. Si ocurre una excepción dentro del método input, no se ejecuta la instrucción de control es falso. Si no ocurre una excepción el programa continuara con la instrucción control es falso y saldrá del do-while.
Error
Los errores, como bien mencione en la entrada pasada, son en su mayoría errores tanto del JVM (memoria llena, errores internos, stak overflow, etc.) como de errores en la lectura de los recursos externos del programa como lo son lecturas de archivos, conexiones a bases de datos, etc.
package nutrilife.gui; import java.sql.*; /** * * @author Carmen Suarez */ public class CreateSQLConnection { static final String DRIVER = "com.mysql.jdbc.Driver"; static final String DATABASE_URL = "jdbc:mysql://localhost/3306/Dieta"; static final String USUARIO = "root"; static final String PASSWORD = ""; public static void connection() { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { Class.forName(DRIVER); connection = DriverManager.getConnection(DATABASE_URL, USUARIO, PASSWORD); statement = connection.createStatement(); resultSet = statement.executeQuery("Select * from FichaIdentificacion"); ResultSetMetaData metaData = resultSet.getMetaData(); int numberOfColumns = metaData.getColumnCount(); for ( int i = 1; i <= numberOfColumns; i++ ) { System.out.printf( "%-8s\t", resultSet.getObject(i)); } System.out.println(); while(resultSet.next()) { for ( int i = 1; i <= numberOfColumns; i++ ) System.out.printf( "%-8s\t", resultSet.getObject(i)); System.out.println(); } } catch (SQLException sqlException) { sqlException.getMessage(); System.out.println(); sqlException.printStackTrace(); throw new Error(); } catch(ClassNotFoundException classNotFoundException) { classNotFoundException.getMessage(); System.out.println(); classNotFoundException.printStackTrace(); } finally { try { resultSet.close(); statement.close(); connection.close(); } catch (Exception exception) { exception.getMessage(); exception.printStackTrace(); } } } }
Por lo tanto decidí que si el programa no puede establecer una conexión con la base de datos, esta finalice ya que el programa no sirve para nada sino tiene los datos de pacientes o dietas.
En la parte
connection = DriverManager.getConnection(DATABASE_URL, USUARIO, PASSWORD);
Si no obtiene una conexión con la base de datos, esta lanza una excepción que la tengo que agarrar porque se trata de una clase que lanza excepciones "checked" que a fuerzas se tienen que manejar. La excepción es agarrada por un catch que imprime su StackTrace y lanza un error para finalizar el programa.
También use los bloques finally porque de esta manera puedo asegurarme que aunque se lance o no se lance una excepción y/o error, el programa liberara los recursos de la base de datos.
La clase todavía le falta bastante para obtener todos los datos, pero necesito ver cómo voy a estructurar las tablas del paciente en la base de datos junto con las tablas de las dietas.
Bueno esto es lo que corresponde a eventos, excepciones y errores de mi proyecto. Espero que hayan entendido, cualquier duda o comentario me lo hacen saber ;) saludos!