Java推荐用if else还是用try catch?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java推荐用if else还是用try catch?相关的知识,希望对你有一定的参考价值。

写法1:
static public boolean check1();
void main(String args[])
if( check1())
//通过
else
//不通过



写法2
static public void check2() throws FailedException;
void main(String args[])
try
check2();
//通过
catch(FailedException e)
//不通过



在MVC分层上千个类的大型程序中,什么情况用哪种?什么情况推荐用哪种?n哪种效率高?综合效益好?
主要用来验证用户输入的内容呢?每次、各种的用户输入都要检测,怎么看?还有写操作。。
好像IO方面这种要选择的时候最多,怎么选择处理方式呀。。

要看你的意图。
"不通过" 是不是一种正常情况?出现频率高吗?
如果是正常情况、出现频率高,就用if else

否则可以用try catch
try catch的代价比较大,用来处理低概率的异常事件可以,但对于正常选择的处理不能用追问

用来验证用户输入的内容呢?每次、各种的用户输入都要检测,怎么看?还有写操作。。
好像IO方面这种要选择的时候最多,怎么选择处理方式呀。。

追答

用户输入内容的话,肯定if else啊
因为用户输入有误实在是太常见了。

其它情况下具体用什么,你得自己分析一下。处理原则就是对于可预见行为的处理,用if else。
try catch用来处理的是不正常行为,比如写文件过程当中,你怎么预料得到用户会半途把U盘拔出来这种行为?这种情况可以用try catch

追问

先谢谢,"可预见行为用if else。try catch处理不正常行为"我很欣赏这种总结。也让我思考好久也查资料来佐证你这个原则。还是发现该原则不适用于java的try catch。根据官方的java tutorial,try catch的适用情况之一就有“可能会发生一种正确情况和多种错误情况”,对于用户输入,我能预测1种正确情况和9种错误情况,也许有第10种错误情况。如果把可预见的情况写成分支if,将会写非常多的重复代码。tutorial推荐用try catch解决

追答

9种错误情况就不需要多个catch吗?

应用try catch 有个重要的因素是,对出错的处理可以在更上层的位置,而不是在当前函数内就处理。
你需要应对的错误,有可能是你调用的其它函数抛出的,这个你必须try catch。
或者你遇到的错误,是你这个函数一开始设计时候,就不会去处理这种错误的,那也必须throw出去让别人处理。

但对同一个函数内部来说,自己throw,自己catch,这种用法没有任何好处。

就检查用户输入内容是否有效来说,你考虑一下,你准备在哪里处理用户输入错误的问题?
有可能这个错误是你处理不了、而需要交给更上层处理的吗?

追问

高级语言的语法都是针对机器指令的语法糖,9个分支信息能用try实现的,也能用if实现。关键在怎么发挥语法糖的便利性吧!用if和指针或者“引用”一起组合使用也能从内层往外层抛信息出来,等于自己在java之外用if 等组合实现“try catch”。
我现在写成
try
check1(); check2(); check3(); check4(); //check都是void返回
//通过
catch(自定义验证错误异常 e)
//不通过

请你评评这样改写成if更好还是不好?

追答

用if和指针或者“引用”一起组合使用也能从内层往外层抛信息出来,等于自己在java之外用if 等组合实现“try catch”。
---------------------
这个实现起来太麻烦了,而且如果你是在写库,难道还让使用你库的人也写一堆if else来实现try catch啊

try
check1(); check2(); check3(); check4(); //check都是void返回
//通过
catch(自定义验证错误异常 e)
//不通过

---------------------------------------------
这要看你注重什么了。注重效率的话当然不好啊,创建exception对象、捕捉都是有代价的,还得看你说的这种验证错误到底是会有多大概率发生的预期?很低的话也就无所谓了。

但如果check1、2、3、4都是我自己写的,然后可能调用它们的代码也都是我自己写的,再然后这几个函数出错时报告的信息比较简单(exception的话可以塞入一大堆和错误有关的信息),那我宁愿写if else。
而且,你这个exception类是不是只在这个地方用到?如果是的话,那更没有必要去专门建这么一个类

追问

“实现起来太麻烦了”,正因为实现麻烦所以我例子里面才没用“你提倡的if”,想看看你怎么把我的案例的改成你主张的“宁愿写if else”。另,check1/2/3/4/.../n都是自己写的,自定义的exception只在验证时用到,只需要传达是否正确、错误时的错误类型2种信息。。你怎么用if else呢。

追答

你这种又不把问题整个说清楚的,让我来给你改if else?

我知道你check1、2、3、4做什么、调用它们的代码又想做什么吗?
我知道它们为什么一定要这样分成几个函数吗?
我知道它们每一个分别可能返回几种不同的错误信息吗?
我知道它们返回错误信息的概率有多大的预期吗?

追问

把check1,2,3,4理解成接口!写java需要理解接口背后的具体实现吗?
而check接口的2种模式尝试在题首写出了,如果你有用“if else”能更有效的方法,就尝试把想法以代码演示看看?
每种check都会有未知的多种错误情况,比如check1()在失败时可能会因为字数太长、太短、内容太大、太小等未知的n种错误情况,非固定常量,不会具体到“常数”的7个函数8个错误。只有一种正确。用户输入出错的几率就是概率预期。还要得到错误原因。

追答

理解成接口就只好用exception了,至于为什么我早就回复过了。

只需要区分错误和正确,以及不同错误仅仅由不同的错误信息来区分的话,返回字符串就够了,空值表示正确。

如果你认为写几个if else就是“没效”的话,那你直接用exception好了

参考技术A 这。。。。2者有关系嘛
if else 捕捉异常的,只有try里面的出现异常,比如方法出错了,空指针异常等等,catch才会捕捉到。
if else 只是逻辑判断语句,if()如果判断为true执行if里面的语句,判断为false执行else里面的语句。
这2个语句并不是何以相互替代的语句。各有各的作用。追问

看来你都没想过,不仅是预置的异常("比如方法出错了,空指针异常等等"),还可以自定义一些异常。
这里主要是问要不要广泛用自定义异常,有没有对开发的好处。

追答

一个项目里自定义的异常都差不多规范好了,弄一些乱七八糟的干嘛

参考技术B 不是这样的,if/else是用于判断 ,而try/catch是用于控制,如果是在mvc模式中,try/catch可以处理有异常的情况,而if/else更偏向于判断分流,用到try/catch块的话,一般来说的抛出,或者是出现这样的异常的时候你还有别的方案能够解决,用if/else的话,这是进行判断后分流出去,调用方法或者别的什么。比如
if(path.equal("login")
try
..........
catch(...........)
...............

else(path.equal("regist"))
......


这个就是比较标准的J2EE编程,希望能帮到你
参考技术C 你这个问题本身就不对头
及使你要用try catch 但这个也应该存在于check2()这个方法中
外面IF ELSE 只负责是判断 TRUE FALSE
他们都不是一个层面的问题
纯看效率的话
IF 也大于 try 毕竟catch 的时候需要处理一个异常的实例 本身就会多出执行步骤
参考技术D try catch 就是用来捕捉异常的,会有log打出,肯定比ifelse好

python中try。。。 except应该怎么用?与if。。。else有啥差别? print与return又有何差别?

急!!多谢

try,except使用判断异常,try后面的语句发生异常就执行except后的语句,而if,else则只是选择结构。print是输出,return是函数返回某个对象或值,两码事。这些随便找本教程都有讲解的追问

如果 我需要def一个function,从raw_input输入两个日期,判断哪个日期先到, 在这之前还就需要输入的日期是有效的 比如:04-31就是无效的 所以我需要用try。。except,当日期是无效的时候要求user重新输入。 可是我应该怎么写try下面的内容呢?怎样并列当月=2,4,6,9,11的时候 日不可以大于30?

多谢

追答

看来你没懂,这只需要用if,else选择就行了,try和except是代码可能运行异常时候才用的
def test(date):
a,b=date.split('-')
a,b=eval(a),eval(b)
if type(b)!=int or type(a)!=int:
return 0
if a in(1,3,5,7,8,10,12) and 0<b<32:
return 1
elif a in (4,6,9,11) and 0<b<31:
return 1
elif a==2 and 0<b<30:
return 1
else:
return 0
def func():
while True:
a=input('first(%m-%d)')
b=input('second')
if test(a) and test(b):
break
else:
print('false')
有点烦,不过我也是个菜鸟,你将就看看吧

追问

额~好高深~不知道是否方便知道您的QQ或email? 我想请教您一道题

追答

wcnmbfan@qq.com,建议你先找本教程看看吧,那个程序虽然有点烦,但其实是很简单的

参考技术A try

$con = mysql_connect(host, user, pass);
if (!$con)
$CONNECTED = false;
else
$CONNECTED = true;


catch (Exception $e)

echo $e->GetMessage();
追问

谢谢 不过不知道什么原因显示不出来 是否可以留个邮箱或者QQ 请教您一道问题? 多谢

追答

哦,Python?sorry,我发了一段PHP的。
雷神拌柠檬说的基本对的,你问他好了。

以上是关于Java推荐用if else还是用try catch?的主要内容,如果未能解决你的问题,请参考以下文章

Java-用Scanner 认识if...else if语句

handlebars 怎么用else if

0-js判断电脑或手机登录

java,多层for()循环,if()else嵌套分别用啥替代?

使用JDBC

ios do catch 和 if else 的区别