Java:我需要抛出异常吗?

时间:2017-03-07 23:05:45

标签: java exception setter

所以我必须创建一个名为setSeconds(int seconds)的setter,整数秒需要小于60.这就是我所做的:

public void setSeconds(int seconds){
    if (seconds<60) {
        this.seconds = seconds;
    }else {
        System.out.println("Invalid seconds");
    }
}

但是,我不确定是否必须抛出异常而不是打印"Invalid Seconds"。如果是,我是否必须使用try/catchthrows

2 个答案:

答案 0 :(得分:3)

我认为您的问题实际上是检查异常和未经检查的异常之间的区别,以及每个异常的不同用例。

什么是已检查的例外以及何时使用它?

已检查的异常是直接或间接扩展Exception但不是RuntimeException的子类的任何异常。当您调用抛出已检查异常的方法时,编译器将强制执行以下两项操作之一:

  • 您需要在方法中添加throws子句
  • 或者您需要捕获异常

这是为了强制开发人员明确处理一些可能需要手动步骤来解决问题的异常。典型的用例是IO操作可能会失败,即使操作失败,我们也希望关闭所有打开的资源。

什么是未经检查的例外以及何时使用它?

对于编程错误或数据损坏,我们通常使用未经检查的异常(扩展RuntimeException的任何异常,因此不进行编译检查)。不需要抓住它或任何东西。一个典型的例子是一个字符串,它不能被解析为一个整数,一个指针null,而它预计不会是等等......

尝试从这种类型的异常中恢复是非常罕见的,它们主要用于防止坏事发生,并告诉开发人员需要修复某些事情。

现在,你的情况怎么办?

在您的情况下,seconds参数可以来自调用您方法的其他代码,也可以来自您正在阅读的某些数据。如果秒数无效,您就不想做任何事情,这只是意味着某人误用了您的程序而您应该结束它以安全地失败(尝试从编程错误中恢复可能会导致其他问题或长时间隐藏bug。)

此外,请始终考虑使您的异常消息尽可能有用且尽可能完整。将要获得异常的开发人员将感谢您在消息中添加错误的输入以帮助他进行调试。

public void setSeconds(int seconds){
    if (seconds < 0 || 60 < seconds) {
        throw new IllegalArgumentException("Invalid seconds: " + seconds);
    }
    this.seconds = seconds;
}

答案 1 :(得分:2)

  

我不确定是否必须抛出异常而不是打印&#34;无效秒&#34;。

如果您希望此方法的调用者能够在传递seconds >= 60的基础上执行某些操作,则需要执行调用者可以拦截的操作:

  • 抛出异常
  • 返回一个值(例如,如果参数为OK,则返回true,否则返回false
  • (或设置一些可变状态以表示失败;但那太可怕了。)

打印到System.out仅对恰好正在查看控制台(或标准输出所用的外部程序)的人有用。

  

如果是这样,我是否必须使用try / catch或throws?

既不:

throw new IllegalArgumentException("Invalid seconds");