2012-06-09 14 views
9

Estoy trabajando en mi primer proyecto Java implementando una clase llamada "HeartRates" que toma la fecha de nacimiento del usuario y devuelve su frecuencia cardíaca máxima y objetivo. Todo en el programa de prueba principal funciona, excepto por una cosa: no puedo encontrar la manera de evitar que el resto del código se imprima después de capturar la excepción.Excepción capturada pero el programa sigue ejecutándose

No estoy seguro de la parte completa del código donde se captura la excepción porque fue copiada y pegada de lo que el profesor nos dio. Si alguien puede decirme cómo finalizar el programa después de que ocurra un error, o imprimir un mensaje de error personalizado y detener la ejecución del programa, lo agradecería.

Aquí está el código:

import java.util.Scanner; 
import java.util.GregorianCalendar; 

import javax.swing.JOptionPane; 

public class HeartRatesTest { 

public static void main(String[] args) { 
    HeartRates test= new HeartRates(); 
    Scanner input = new Scanner(System.in); 
    GregorianCalendar gc = new GregorianCalendar(); 
    gc.setLenient(false); 

     JOptionPane.showMessageDialog(null, "Welcome to the Heart Rate Calculator");; 
     test.setFirstName(JOptionPane.showInputDialog("Please enter your first name: \n")); 
     test.setLastName(JOptionPane.showInputDialog("Please enter your last name: \n")); 
     JOptionPane.showMessageDialog(null, "Now enter your date of birth in Month/Day/Year order (hit enter after each): \n"); 

     try{ 
      String num1= JOptionPane.showInputDialog("Month: \n"); 
      int m= Integer.parseInt(num1); 
      test.setMonth(m); 
       gc.set(GregorianCalendar.MONTH, test.getMonth()); 
      num1= JOptionPane.showInputDialog("Day: \n"); 
      m= Integer.parseInt(num1); 
      test.setDay(m); 
       gc.set(GregorianCalendar.DATE, test.getDay()); 
      num1= JOptionPane.showInputDialog("Year: \n"); 
      m= Integer.parseInt(num1); 
      test.setYear(m); 
       gc.set(GregorianCalendar.YEAR, test.getYear()); 

       gc.getTime(); // exception thrown here 
     } 

     catch (Exception e) { 
      e.printStackTrace(); 
      } 



    String message="Information for "+test.getFirstName()+" "+test.getLastName()+": \n\n"+"DOB: "+ test.getMonth()+"/" +test.getDay()+ "/" 
      +test.getYear()+ "\nAge: "+ test.getAge()+"\nMax Heart Rate: "+test.getMaxHR()+" BPM\nTarget Heart Rate(range): "+test.getTargetHRLow() 
      +" - "+test.getTargetHRHigh()+" BPM"; 
    JOptionPane.showMessageDialog(null, message); 
} 
+0

poner los '' showMessageDialog' dentro try {} 'bloque –

Respuesta

13

No estoy muy seguro de por qué quiere finalizar la aplicación después de capturar la excepción. ¿No sería mejor arreglar lo que salió mal?

En cualquier caso, en el bloque catch:

catch(Exception e) { 
    e.printStackTrace(); //if you want it. 
    //You could always just System.out.println("Exception occurred."); 
    //Though the above is rather unspecific. 
    System.exit(1); 
} 
+0

Gracias, esto hizo exactamente lo que estaba buscando. Entiendo lo que quiere decir y probablemente sería mejor, pero para el propósito de este proyecto no fue necesario permitir una corrección de error, así que lo dejo tal como está. – Mike

9

En el bloque catch, utilice la palabra clave return:

catch(Exception e) 
{ 
    e.printStackTrace(); 
    return; // also you can use System.exit(0); 
} 

o tal vez usted quiere poner el último JOptionPane.showMessageDialog al final del bloque try.

+0

¿cuál es la diferencia entre la salida ... (0) ... y de salida (1)? –

7

Es cierto que el regreso pasaría a detener la ejecución de este programa (estando en primaria). La respuesta más general sería si no puede manejar un tipo particular de excepción en un método, debe declarar que arroja dicha excepción, o debe envolver su excepción con algún tipo de RuntimeException y lanzarla a la capa superior.

System.exit() también funciona técnicamente, pero en el caso de un sistema más complejo es probable que se evite (es posible que la persona que llama pueda manejar la excepción).

tl; dr versión:

catch(Exception e) 
{ 
    throw new RuntimeException(e); 
} 
Cuestiones relacionadas