异常被捕获但程序仍在运行。

13
我正在开发我的第一个Java项目,实现了一个名为“心率(HeartRates)”的类,该类获取用户的出生日期并返回其最大和目标心率。主测试程序中的所有内容都有效,但有一个问题,我无法强制在捕获异常后停止代码的其余部分的运行。
我对捕获异常的整个代码部分不太确定,因为它是从教授给我们的复制粘贴而来。如果有人能告诉我如何在发生错误后终止程序或打印自定义错误消息并停止程序继续执行,我将不胜感激。
以下为代码:
 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);
}

showMessageDialog 放到 try {} 块内。 - Marek Sebera
3个回答

17

不太确定为什么你想在捕获异常后终止应用程序 - 修复出现问题的地方不是更好吗?

无论如何,在你的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);
}

1
谢谢,这正是我想要的。我明白你的意思,也许更好,但为了这个项目的目的,不需要允许错误修复,所以我将其保留原样。 - Mike

13

确实,return语句会中止程序执行(在main函数中)。更一般的回答是,如果你不能在一个方法中处理特定类型的异常,你应该声明抛出该异常,或者将你的异常包装为某种RuntimeException并将其抛到更高的层次。

System.exit()技术上也可以工作,但在一个更复杂的系统中应该避免使用它(你的调用方可能能够处理异常)。

简短版:

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

12
catch 块中,使用关键字 return
catch(Exception e)
{
    e.printStackTrace();
    return; // also you can use System.exit(0);
}

或许您希望将最后一个 JOptionPane.showMessageDialog 放置于 try 块的末尾。


1
"...exit(0)"和"...exit(1)"有什么区别? - T.Todua
1
通常情况下,exit 0 表示您的程序正常结束。任何其他退出代码都表示错误。 - Dmitry Zagorulkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接