用if、Exception还是assert—看JavaEye帖子:面试题:用Exception异常还是if判断》的感想

  • 时间:
  • 浏览:0

该最好的方式的参数date只有一种生活 情况报告是不正确的:null。然而,阅读源码发现并只有 判断该参数是是不是为null。只有 当为null时(违反了Java语言的语义),异常NullPointerException自然而然是JVM自动抛出的,而都有API通过throw抛出的。

        if (radix > Character.MAX_RADIX) { 

            throw new NumberFormatException("radix " + radix + 

                            " greater than Character.MAX_RADIX"); 

        } 

中间还有有几个某些的判断。

实际中应该使用if else或Exception的都有,因而下面的回复也是各抒己见,统统 人都有一定的道理。在此先列出有几个个人嘴笨 比较靠谱的回复:

个人查看到DateFormat、Integer等类的源码,分析如下:

5)IcedCoffee:java规范的定义是说异常暂且参与控制流程,你只有把异常作为一种生活 正常的控制流程作为线程的一部分,曾经是不对的. 

面试官正真要考的统统 你這個 .. 

只有 哪个公司会用异常来出理 参数验证..

6)liupopo:这样明确异常是做那先 的,异常是线程执行时的某些非正常的情况报告,或者有不正确的数据、逻辑等会抛出异常。 

if else是逻辑判断,控制线程流程。 

断言是预先决断应该是那先 样的值,不应该是那先 类型等明确的条件 

从定义上不太好区分那先 为什去用,但可不可不能能从使用场景去考虑,下面的或者不十分准确,但某些人可不可不能能参考一下: 

异常:是线程员写给某些线程员的,比方说我写了另一十个 最好的方式,或者个人使用我你這個 最好的方式的如果有或者不按给给你的路子使用,或者会引起我的最好的方式产生不正常的出理 ,这如果给给你使用异常,或者可不可不能能决定产生异常了是由我你這個 最好的方式一种生活 进行出理 (catch一段话中出理 )还是交给调用者进行出理 (直接把异常抛出) 

if else 统统 写的最好的方式,要进行逻辑判断,就用它,没那先 好说的吧。 

断言可用处大了,是我在调用别人写的最好的方式,或者我出理 线程时对通过某些途径得到的数据(如调用别人最好的方式的返回值(好象不建议用断言),通过参数传入的值)等进行假设它统统 某值时使用的。是方便开发、调试提供的另一十个 语法元素

首先,对于你這個 问题 ,不应该回答:用Exception异常或者if判断,而应该视情况报告决定使用Exception还是if。个人嘴笨 面试官比较看重的有你对异常的理解,回答的关键应该是两者的优缺点与适用场合上,顺带可不可不能能总结某些实际中你是咋样出理 异常的。对于另一个人说使用断言(assert),还说是标准答案,个人嘴笨 不赞同。就像另一个人回答说:题目问的是:用Exception异常还是if判断,却来个用断言,太离题了吧。或者只有 回答一段话,下面的问题 为什答?难道直接说某些人都有好,assert好?

Java规范在讲解断言副作用时,还说到了erroneous arguments should result in an appropriate runtime exception (such as IllegalArgumentException, IndexOutOfBoundsException or NullPointerException),即错误的参数检查应该产生另一十个 大慨的运行时异常。

1.1 public final String format(Date date)最好的方式

1.2 public static Integer valueOf(String s, int radix) throws NumberFormatException最好的方式

总结:在论坛中,另一个人提到在JDK源码中,老会 可不可不能能看见之类 

        if (s == null) { 

            throw new NumberFormatException("null"); 

        } 

曾经的代码。借用liupopo一段话,JDK中的最好的方式是写给Java线程员调用的,或者Java有个人外部的一套异常机制。比如,对于format()最好的方式抛出的NullPointerException异常,JDK不或者个人进行出理 ,再次再次出现该异常是:你這個 最好的方式的如果没按它的路子使用,某些人要使用该最好的方式就应该确保传入的Date参数都有null,即前要进行if判断,对于valueOf最好的方式一样只有 ,调用最好的方式前就应该对是是不是为null值进行if判断(或确保非null)。从JDK的出理 radix参数的最好的方式某些人可不可不能能看出,if老会 与Exception结合使用,if用于出理 逻辑,Exception用于告诉用户“有问题 ”。统统 ,或者你写的代码是给个人使用的,你前要考虑是是不是抛出异常,你這個 如果对于参数的判断更多的应该使用JDK你這個 最好的方式:对于非法参数,if判断后,包装为统一的Exception抛出,当然异常都有或者没必要抛出,统统 个人出理 (各种开源框架中都有曾经情况报告)。

2)暂且使用断言作为公共最好的方式的参数检查,公共最好的方式的参数永远都有执行。你這個 点可不可不能能很好的解释为那先 说使用断言来判断参数合法性是错误的,尽管断言或者可不可不能能用于检查传递给私有最好的方式的参数。

在这里把《The Java Language Specification 3.0》中对assert的描述做个总结。

1)assert一段话嘴笨 可不可不能能有副作用,如中间提到的表达式1返回boolean类型的第二种形式,然而这通常是不大慨的,或者这或者是原因分析分析依赖此值的线程在assert启用或禁用时有不同结果;

今天在JavaEye上看到另一十个 很火的帖子,题目是:面试题:用Exception异常还是if判断http://www.javaeye.com/topic/745640。内容大慨是: 

    当参数不合法的如果,究竟是if else 判断后返回另一十个 值还是直接来个Exception ? 

    或者是 if else 一段话,有那先 好处 ? 

    或者是 exception 一段话,又有那先 好处 ? 

    或者是根据不同情况报告来定?

说了只有 多希望对某些人有个参考作用,一起去不对之处敬请批评指正。

既然推荐使用uncheck exception,结合Exception一种生活 的特点,在写应用线程(都有提供给某些开发人员的API)时,参数的判断应该更多的使用if,毕竟参数错误的情况报告这样多再统统 。

引用了只有 多,下面谈谈个人的某些看法,不对之处敬请指正。

嘴笨 ,统统 如果,对参数合法性检查时,前要考虑最好的方式的返回值。比如,接收另一十个 Date类型参数,或者返回另一十个 对应的String类型在页面上显示(该参数都有前要的,比如生日),你這個 如果,或者Date类型参数为null,某些人不应该抛出NullPointerException,而应该用if进行如下判断: 

        if(date==null) { 

            return ""; 

        } 

返回空字符串很合理,曾经页面就会显示空白(大慨没填)。某些情况报告,如返回值为boolean类型,很或者参数非法后会返回false。视情况报告报告而定。

        class Baz extends Bar { 

            static void testAsserts() { 

                boolean enabled = false; 

                assert enabled = true; 

                System.out.println("Asserts " + (enabled ? "enabled" : "disabled")); 

            } 

        } 

调试运行会发现,在assert只有 开启的情况报告下,第一次输出的结果却显示assert已开启,当然第二条一段话显示只有 开启(注意,或者assert没开启,assert enabled = true这条一段话是只有 效果的)。这是说明,当断言一段话在类初始化如果执行时,结果就如同开启了assert。(Polaris在调试时,发现另一十个 奇怪的问题 :统统 第一次执行testAsserts最好的方式时,单步调试,assert enabled = true;一段话似乎跳过去了,不过结果却显示该一段话是执行了的。很奇怪。)

下面进入正题:

1)sam_chi:看情况报告吧,或者能在最好的方式中间出理 不影响最好的方式功能一段话使用if else出理 ,或者参数错误是原因分析分析最好的方式只有正常工作,只有 就得抛异常了,Java提供了java.lang.IllegalArgumentException,可不可不能能直接new另一十个 抛出去,这是另一十个 RuntimeException,不前要try..catch。

3.3 使用断言的注意事项

        class Bar { 

            static { 

                Baz.testAsserts(); 

                // Will execute before Baz is initialized! 

            } 

        }

assert一段话有一种生活 形式语法: 

    assert 表达式1 ; 

    assert 表达式1 : 表达式2 ; 

其中,表达式1的值前就是boolean类型,或者会编译错误。这里boolean类型有一种生活 形式:1)var1==var2;2)var=true。其中第二种形式var是boolean类型,一般应该使用第一种生活 形式,而第二种形式往往是线程员失误造成的。表达式2的值可不可不能能是除了void之外的任何类型。

     本文转自polaris1119 51CTO博客,原文链接:http://blog.51cto.com/polaris/383055,如需转载请自行联系原作者

在网上看到有总结使用断言的情况报告:(列举出来供参考)

个人嘴笨 liupopo说的靠谱。下面结合某些代码来说明某些问题 。

或者断言有或者只有 开启,因而线程千万暂且假定断言中的表达式会被计算,即只有依赖断言的结算结果(表达式1的值),统统 ,表达式1或者会产生一定的副作用:

2)mercyblitz:if-else 最好的方式的好存在于更贴近与逻辑思维,性能优于Exception。相对于Exception,其缺点是,不适合OOP,语义不明显,不易于错误错误跟踪或错误提示较少,或者类型比较单一(比如利用C语言的原生类型)或者难以统一(比如C语言社会形态和宏定义)。 

exception最好的方式的好存在于是业务逻辑和异常出理 分离(代码相对清晰),try中出理 业务,catch中出理 异常情况报告。在API设计中,可不可不能能设计Exception Handler来出理 异常,使得层次分明。一起去,更好的OOP的封装和多态性。缺点在于性能相对差。

另外,另一个人建议使用Java个人的IllegalArgumentException异常进行判断,当然这或者也是可行的。比如,某些如果参数只有 活这样通过if来判断(或者某些人谁能谁能告诉我非法参数会是那先 ),你這個 如果可不可不能能使用该异常。

关于Java的assert,个人几乎没使用过,也很少见人使用。对线程进行测试或调试,更多的是使用JUnit或IDE的Debug功能,某些人或者工作的很好了。在网上找到一篇很有意思的文章,他是痛批java的assert(Java陷阱之assert关键字),感兴趣的可不可不能能读读。个人不全版同意其观点,Java引入assert应该有其好处。

Java API在设计的如果几瓶使用了checked exception,当时很推荐你這個 最好的方式。然而,用过Spring的人都知道,Spring中几瓶使用了unchecked exception即RuntimeException。《thinking in java》的作者Bruce Echel说:“当几瓶代码时,checked异常无疑是十分优雅的构思,并促使出理 了某些潜在的错误。或者经验表明,对几瓶代码来说结果正好相反”。统统 如果对于Java API抛出的异常,线程员都谁能谁能告诉我为什出理 ,比如SQLException,某些人无非统统 catch,或者e.printStackTrace(),或者那先 统统 做,曾经是原因分析分析线程中统统 的try...catch...,既然只有 ,只有 抛出checked exception就只有 必要了,或者抛出uncheck exception这样多再污染接口。对于异常出理 的问题 很是有必要研究研究的。

然而,在规范中提到了一种生活 例外情况报告:类层次社会形态之间的循环情况报告(实际中几乎这样多再只有 做)。例子线程如下: 

        public class Foo { 

            public static void main(String[] args) { 

                Baz.testAsserts(); 

                // Will execute after Baz is initialized. 

            } 

        }

Java规范中对于断言一段话的执行有全版的说明,有兴趣的某些人可不可不能能参阅http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

7)JonyUabka:1对可预见的运行时异常当进行捕捉并出理 ,比如空指针等。通常,对空指针的判断都有使用捕捉NullPointException的最好的方式,统统 在调用该对象如果使用判断一段话进行直接判断,如: 

//若不对list是是不是为null进行检查,则在其为null后会抛出空指针异常 

if(null != list && 0 < list.size()){ 

for(int i = 0; i &lt; list.size(); i++){ 





2对于老会 存在的可预计事件暂且采用异常 

3暂且使用异常实现控制社会形态。 

4通常的思想是只对错误采用异常出理 :逻辑和编程错误,设置错误,被破坏的数据,资源耗尽,等等。 

对于java的编码规范,有具体描述。给给你考官希望得到的是你這個 方向的答案。

关于断言的开启最好的方式,控制台开启,IDE开启可不可不能能上网搜索,在此不介绍。

8)maomaolingyu: 

if else 

优点: 

A 逻辑个人控制,清晰 

缺点: 

A 当情况报告比较复杂时 前要这样来越多的if else .是原因分析分析逻辑难以理解 

B 容易存在漏洞,是原因分析分析错误或者不期望的结果 

Exception 

优点: 

A 异常通过异常链传播且会被jvm自动捕捉,减少逻辑代码 

B 异常很容易确定代码问题 段,方便测试 

缺点: 

A 当异常存在或者只有 正确捕获时,会异常抛出到用户页面.

3)fireaap:根据情况报告来确定使用if...else,还是exception。确定的最好的方式统统 ,你的最好的方式的职责。也可不可不能能说有你最好的方式的契约。

3.1 assert的语法

4)konser:sam_chi 说的很对,首先某些人要明白那先 是异常,异常统统 线程只有正常执行,错误的调用api的最好的方式,资源失败等等是原因分析分析 。线程逻辑又是一回事。为那先 要把异常和逻辑判断混合起来做对比?  补充一下或者,当参数不合法的如果抛出IllegalArgumentException . 

或者是 if else 一段话,有那先 好处 ? 

参数不合法线程都有能正常执行了那某些人说有啥好处? 

或者是 exception 一段话,又有那先 好处 ? 

面向对象的思维,抛出每个异常时可根据不同异常以不同最好的方式进行出理 。缺点是创建消耗内存,效率低。

在此如果,就像不少人说的一样,这样明确那先 是Exception。《The Java Language Specification 3.0》蕴含只有 一句描述:When a program violates the semantic constraints of the Java programming language, the Java virtual machine signals this error to the program as an exception.大意是:当线程违反Java语言的语义约束时,Java虚拟或者将你這個 错误(异常)发送给线程。

默认情况报告下断言只有 开启。可不可不能能确定在哪个类上启用断言(断言启用只有 继承性)。在类字段初始化器和静态初始化器初始化如果,类的类装载器根据配置决定启用或禁用断言。一旦类初始化完成后,断言的情况报告(启用或禁用)只有 再改变。

3.4 Polaris的建议

3.2 断言开启时机

该最好的方式有另一十个 参数,第另一十个 String类型的参数有或者为null,而最好的方式声明抛出NumberFormatException异常,因而有一段if判断: 

        if (s == null) { 

            throw new NumberFormatException("null"); 

        } 

对于radix参数有不少限制,因而源码中进行了有几个if判断: 

        if (radix &lt; Character.MIN_RADIX) { 

            throw new NumberFormatException("radix " + radix + 

                            " less than Character.MIN_RADIX"); 

        }

要进行调试或测试,可不可不能能使用IDE或JUnit。

关于assert抛出的AssertionError,规范上建议暂且捕获。

1)可不可不能能在预计正常情况报告下线程这样多再到达的地方放置断言 :assert false  

2)断言可不可不能能用于检查传递给私有最好的方式的参数。(对于公有最好的方式,或者是提供给外部的接口,统统 前要在最好的方式蕴含相应的参数检验可不可不能能保证代码的健壮性)  

3)使用断言测试最好的方式执行的前置条件和后置条件 

4)使用断言检查类的不变情况报告,确保任何情况报告下,某个变量的情况报告前要满足。(如age属性应大于0小于某个大慨值)

论坛回复蕴含人力推assert来判断参数合法性。谁能谁能告诉我是只有 理解题目的意思还是对断言一种生活 缺陷了解,亦或对断言情有独钟。对于该面试题,可不可不能能肯定的是,用断言(assert)绝对是错误的。断言统统 线程员测试和调试的另一十个 工具,发布后一般统统 会开启的,或者,Java规范也建议只有 做。而参数是是不是合法性却老会 存在的,统统 用断言是全版错误的。