为什么说“不应该由方法来终止程序”?

SilentHunter460 2020-02-12 01:28:57
书上说,不应该让方法来终止程序,应该由调用者决定是否终止。例子如下,书上推荐用throw try catch来捉住错误然后在main方法里决定如何处理。


public static void main(String[] args) {
try {
System.out.println(division(1,1));
System.out.println(division(1,0));
}
catch(ArithmeticException ex) {
System.out.println("被除数不能是0。");
}

}

public static double division(double num1, double num2) {
if(num2 ==0) {
throw new ArithmeticException();
}
return num1/num2;
}




但是,我不明白在方法里终止程序有什么问题?如下,代码还少点。


public static void main(String[] args) {
System.out.println(division(1,1));
System.out.println(division(1,0));
}

public static double division(double num1, double num2) {
if(num2 ==0) {
System.out.println("被除数不能是0。");
System.exit(1);
}
return num1/num2;
}

...全文
373 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
main方法调用子程序,子程序直接终止了,main方法后续就没法继续执行。 程序的开始与结束都应该在main方法里。 即使抛出异常,也应该一层一层往上抛。
CS_草祭先生 2020-02-12
  • 打赏
  • 举报
回复
楼主的思路还是停留在刚学习编程的阶段,小型项目,或者个人项目当然你可以为所欲为,怎么方便怎么来。 但是项目较大,或者人数较多的情况下,最佳的处理方式是把结果或者错误都返回给调用者,让调用者根据实际情况来处理。 比如调用者A调用方法B,方法B返回了一个错误,如果不抛出,那就终止程序或者返回指定的错误信息。 但是如果返回给调用者A,那调用者可以根据错误类型判断如何进行处理。 如果再有一个调用者C调用方法B,他也可以根据错误类型进行他自己的处理。这样就不会限制处理结果了。
qybao 2020-02-12
  • 打赏
  • 举报
回复
LZ的很多问题都是基于自己一个人开发的前提下去考虑的,要多思考一下多人合作开发情况。
自己一个人开发,想怎么做都可以,因为你自己清楚每个方法逻辑,能够一个人协调各个方法把业务处理好。
但是多人的情况下就不一样了,别人调用你的方法,即使你的方法出错了,别人也不想整个程序被终止。方法调用失败业务无法继续,本来别人想打印个日志或者做个事务回滚(有可能事务锁了数据库,需要释放),结果程序被你终止掉了,所有这一个切都做不了。而且调查原因的时候也很难查到是你的方法造成的,无形中增加排查错误的难度。
LZ可以自己想象一下,假如division方法是别人提供的(你不清楚里面的逻辑),你的main方法调用division后程序会自动终止,你自己不觉得莫名其妙吗?我估计那时你会发帖问,有没有人知道为什么division调用不了,一调用程序就停了?
所以,反过来就说明了,为什么division方法不能贸然终止程序。
stacksoverflow 2020-02-12
  • 打赏
  • 举报
回复
别人调用你的代码,num2传个0,整个系统就挂掉了。 你要是抛个异常出去,别人可以根据实际情况判断是忽略,打印出错信息,终止业务或者终止程序。
qybao 2020-02-12
  • 打赏
  • 举报
回复
引用 7 楼 qq_16774199 的回复:
你好,谢谢回复。是的,你一下就看出我的实际水平了。我正在自学java,也不从事编程工作,所以问题层次都比较低。
说到“把结果或者错误都返回给调用者”,java自带的许多方法,书里花了很多篇幅讲这些方法的参数和返回值,给错参数,不也是在eclipse报告错误然后中断吗?

这和你说的不一样,java自带的api不会终止程序的,只会抛出异常,异常如果一直没有被捕捉,jvm才会异常终止。也就是说捕捉不捕捉异常,由调用者自己决定,但至少保证调用api不会终止程序。
SilentHunter460 2020-02-12
  • 打赏
  • 举报
回复
引用 3 楼 aw277866304 的回复:
楼主的思路还是停留在刚学习编程的阶段,小型项目,或者个人项目当然你可以为所欲为,怎么方便怎么来。 但是项目较大,或者人数较多的情况下,最佳的处理方式是把结果或者错误都返回给调用者,让调用者根据实际情况来处理。 比如调用者A调用方法B,方法B返回了一个错误,如果不抛出,那就终止程序或者返回指定的错误信息。 但是如果返回给调用者A,那调用者可以根据错误类型判断如何进行处理。 如果再有一个调用者C调用方法B,他也可以根据错误类型进行他自己的处理。这样就不会限制处理结果了。
你好,谢谢回复。是的,你一下就看出我的实际水平了。我正在自学java,也不从事编程工作,所以问题层次都比较低。 说到“把结果或者错误都返回给调用者”,java自带的许多方法,书里花了很多篇幅讲这些方法的参数和返回值,给错参数,不也是在eclipse报告错误然后中断吗?
qq_39936465 2020-02-12
  • 打赏
  • 举报
回复
引用 楼主 qq_16774199 的回复:
书上说,不应该让方法来终止程序,应该由调用者决定是否终止。例子如下,书上推荐用throw try catch来捉住错误然后在main方法里决定如何处理。
就那你的方法来说明,如果要处理多组数据相除,只要其中一组数据出错就会被终止不是很麻烦?方法中加入终止只适合少量运算。
qybao 2020-02-12
  • 打赏
  • 举报
回复
引用 4 楼 qq_16774199 的回复:
你好,谢谢回复。我的工作和编程毫无关系,只是业余爱好,就像有人的喜欢钓鱼有人喜欢收集邮票。
这里还是有点不明白,division方法里有System.out.println("被除数不能是0。"),不是已经很直观了?即使没写,eclipse也会报告错误原因。再说调用自带的各种方法,参数不对时,eclipse也是那样报告的。

这不是说的很明白了吗?你一个人开发,想怎么做都可以。如果是多个人开发,就不一样了。别人给你写一个方法,你怎么知道别人一定会输入错误信息才会终止程序?比如别人没有打印System.out.println("被除数不能是0。")就直接退出,你能知道是什么错吗?
而且你现在的例子是源代码级别的,出错你还能看到程序,知道哪里处理不对。但如果别人给你的不是源程序,而是个class,甚至是个jar,出错时虽然eclipse告诉你哪一行出错了,但是你看不到源程序,不知道哪里处理不对,那你要调查是不是要花费很大功夫?甚至你根本调查不了,只能咨询程序的提供者,这样不是很花时间吗?
SilentHunter460 2020-02-12
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
LZ的很多问题都是基于自己一个人开发的前提下去考虑的,要多思考一下多人合作开发情况。 自己一个人开发,想怎么做都可以,因为你自己清楚每个方法逻辑,能够一个人协调各个方法把业务处理好。 但是多人的情况下就不一样了,别人调用你的方法,即使你的方法出错了,别人也不想整个程序被终止。方法调用失败业务无法继续,本来别人想打印个日志或者做个事务回滚(有可能事务锁了数据库,需要释放),结果程序被你终止掉了,所有这一个切都做不了。而且调查原因的时候也很难查到是你的方法造成的,无形中增加排查错误的难度。 LZ可以自己想象一下,假如division方法是别人提供的(你不清楚里面的逻辑),你的main方法调用division后程序会自动终止,你自己不觉得莫名其妙吗?我估计那时你会发帖问,有没有人知道为什么division调用不了,一调用程序就停了? 所以,反过来就说明了,为什么division方法不能贸然终止程序。
你好,谢谢回复。我的工作和编程毫无关系,只是业余爱好,就像有人的喜欢钓鱼有人喜欢收集邮票。 这里还是有点不明白,division方法里有System.out.println("被除数不能是0。"),不是已经很直观了?即使没写,eclipse也会报告错误原因。再说调用自带的各种方法,参数不对时,eclipse也是那样报告的。

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧