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

  • 时间:
  • 浏览:0
  • 来源:uu快3开奖历史_uu快3玩法_注册

关于断言的开启土土措施,控制台开启,IDE开启能也能 上网搜索,在此不介绍。

该土土措施有有另1个 参数,第有另1个 String类型的参数有将会为null,而土土措施声明抛出NumberFormatException异常,因而有一段if判断: 

        if (s == null) { 

            throw new NumberFormatException("null"); 

        } 

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

        if (radix < Character.MIN_RADIX) { 

            throw new NumberFormatException("radix " + radix + 

                            " less than Character.MIN_RADIX"); 

        }

1.2 public static Integer valueOf(String s, int radix) throws NumberFormatException土土措施

1.1 public final String format(Date date)土土措施

4)konser:sam_chi 说的很对,首先让我们让我们让我们让我们要明白有两种是异常,异常也不我系统任务管理器能也能 正常执行,错误的调用api的土土措施,资源失败等等导致 。系统任务管理器逻辑又是一回事。为有两种要把异常和逻辑判断混合起来做对比?  补充一下将会,当参数不合法的并且 抛出IllegalArgumentException . 

将会是 if else 说说,有有两种好处 ? 

参数不合法系统任务管理器是否 能正常执行了那你爱不爱我有啥好处? 

将会是 exception 说说,又有有两种好处 ? 

面向对象的思维,抛出每个异常时可根据不同异常以不同土土措施进行防止 。缺点是创建消耗内存,速率低。

说了好难多希望对让我们让我们让我们让我们有个参考作用,一起去不对之处敬请批评指正。

将会断言有将会好难开启,因而系统任务管理器千万不用说假定断言中的表达式会被计算,即能也能 依赖断言的结算结果(表达式1的值),太少,表达式1将会会产生一定的副作用:

1)能也能 在预计正常情况下系统任务管理器不用到达的地方放置断言 :assert false  

2)断言能也能 用于检查传递给私有土土措施的参数。(对于公有土土措施,将会是提供给结构的接口,太少需要在土土措施富含相应的参数检验也能保证代码的健壮性)  

3)使用断言测试土土措施执行的前置条件和后置条件 

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

5)IcedCoffee:java规范的定义是说异常不用说参与控制流程,你能也能 把异常作为有两种正常的控制流程作为系统任务管理器的一主次,从前是不对的. 

面试官正真要考的也不我有两种.. 

好难哪个公司会用异常来防止参数验证..

        if (radix > Character.MAX_RADIX) { 

            throw new NumberFormatException("radix " + radix + 

                            " greater than Character.MAX_RADIX"); 

        } 

后边还有十几个 某些的判断。

8)maomaolingyu: 

if else 

优点: 

A 逻辑另一方控制,清晰 

缺点: 

A 当情况复杂性时 需要太少的if else .导致 逻辑难以理解 

B 容易指在漏洞,导致 错误将会不期望的结果 

Exception 

优点: 

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

B 异常很容易选者代码间题段,方便测试 

缺点: 

A 当异常指在并且 好难正确捕获时,会异常抛出到用户页面.

下面进入正题:

6)liupopo:好难明确异常是做有两种的,异常是系统任务管理器执行时的某些非正常的情况,将会有不正确的数据、逻辑等会抛出异常。 

if else是逻辑判断,控制系统任务管理器流程。 

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

从定义上不太好区分有两种为啥在么在去用,但能也能 从使用场景去考虑,下面的将会不十分准确,但让我们让我们让我们让我们能也能 参考一下: 

异常:是系统任务管理器员写给某些系统任务管理器员的,比方说我写了有另1个 土土措施,将会另一方使用我有两种土土措施的并且 有将会不按我愿意 的路子使用,将会会引起我的土土措施产生不正常的防止,这并且 我愿意 使用异常,并且 能也能 决定产生异常了是由我有两种土土措施有两种进行防止(catch说说中防止)还是交给调用者进行防止(直接把异常抛出) 

if else 也不我我写的土土措施,要进行逻辑判断,就用它,好难两种好说的吧。 

断言可用处大了,是我在调用别人写的土土措施,将会我防止系统任务管理器时对通过某些途径得到的数据(如调用别人土土措施的返回值(好象不建议用断言),通过参数传入的值)等进行假设它也不我某值时使用的。是方便开发、调试提供的有另1个 语法元素

assert说说有有两种形式语法: 

    assert 表达式1 ; 

    assert 表达式1 : 表达式2 ; 

其中,表达式1的值需也不我boolean类型,并且 会编译错误。这里boolean类型有有两种形式:1)var1==var2;2)var=true。其中第二种形式var是boolean类型,一般应该使用第有两种形式,而第二种形式往往是系统任务管理器员失误造成的。表达式2的值能也能 是除了void之外的任何类型。

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的编码规范,有具体描述。我愿意 考官希望得到的是有两种方向的答案。

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

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

    当参数不合法的并且 ,究竟是if else 判断后返回有另1个 值还是直接来个Exception ? 

    将会是 if else 说说,有有两种好处 ? 

    将会是 exception 说说,又有有两种好处 ? 

    将会是根据不同情况来定?

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不用污染接口。对于异常防止的间题很是有必要研究研究的。

既然推荐使用uncheck exception,结合Exception有两种的特点,在写应用系统任务管理器(是否 提供给某些开发人员的API)时,参数的判断应该更多的使用if,毕竟参数错误的情况不用太少。

另一方查看得人DateFormat、Integer等类的源码,分析如下:

3.3 使用断言的注意事项

3.4 Polaris的建议

该土土措施的参数date能也能也能 有两种情况是不正确的:null。然而,阅读源码发现并好难判断该参数是否 为null。好难当为null时(违反了Java语言的语义),异常NullPointerException自然而然是JVM自动抛出的,而是否 API通过throw抛出的。

        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在调试时,发现有另1个 奇怪的间题:也不我第一次执行testAsserts土土措施时,单步调试,assert enabled = true;说说似乎跳过去了,不过结果却显示该说说是执行了的。很奇怪。)

        class Bar { 

            static { 

                Baz.testAsserts(); 

                // Will execute before Baz is initialized! 

            } 

        }

另外,有人建议使用Java另一方的IllegalArgumentException异常进行判断,当然这有并且 也是可行的。比如,某些并且 参数好难活好难通过if来判断(将会让我们让我们让我们让我们别问我非法参数会是有两种),有两种并且 能也能 使用该异常。

嘴笨 ,太少并且 ,对参数合法性检查时,需要考虑土土措施的返回值。比如,接收有另1个 Date类型参数,并且 返回有另1个 对应的String类型在页面上显示(该参数是否 需要的,比如生日),有两种并且 ,将会Date类型参数为null,让我们让我们让我们让我们不应该抛出NullPointerException,而应该用if进行如下判断: 

        if(date==null) { 

            return ""; 

        } 

返回空字符串很合理,从前页面就会显示空白(大约没填)。某些情况,如返回值为boolean类型,很将会参数非法一定会返回false。视情况而定。

关于assert抛出的AssertionError,规范上建议不用说捕获。

2)不用说使用断言作为公共土土措施的参数检查,公共土土措施的参数永远是否 执行。有两种点能也能 很好的解释为有两种说使用断言来判断参数合法性是错误的,尽管断言有并且 能也能 用于检查传递给私有土土措施的参数。

在此并且 ,就像不少人说的一样,好难明确有两种是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虚拟将会将有两种错误(异常)发送给系统任务管理器。

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

1)assert说说嘴笨 能也能 有副作用,如后边提到的表达式1返回boolean类型的第二种形式,然而这通常是太少花费的,将会这将会导致 依赖此值的系统任务管理器在assert启用或禁用时有不同结果;

论坛回复富含人力推assert来判断参数合法性。别问我是好难理解题目的意思还是对断言有两种缺乏了解,亦或对断言情有独钟。对于该面试题,能也能 肯定的是,用断言(assert)绝对是错误的。断言也不我系统任务管理器员测试和调试的有另1个 工具,发布后一般也不我会开启的,并且 ,Java规范也建议好难做。而参数是否 合法性却老要指在的,太少用断言是删剪错误的。

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

3.2 断言开启时机

关于Java的assert,另一方几乎没使用过,也很少见人使用。对系统任务管理器进行测试或调试,更多的是使用JUnit或IDE的Debug功能,让我们让我们让我们让我们将会工作的很好了。在网上找到一篇很有意思的文章,他是痛批java的assert(Java陷阱之assert关键字),感兴趣的能也能 读读。另一方不删剪同意其观点,Java引入assert应该有其好处。

然而,在规范中提到了有两种例外情况:类层次形态之间的循环情况(实际中几乎不用好难做)。例子系统任务管理器如下: 

        public class Foo { 

            public static void main(String[] args) { 

                Baz.testAsserts(); 

                // Will execute after Baz is initialized. 

            } 

        }

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

引用了好难多,下面谈谈另一方的某些看法,不对之处敬请指正。

1)sam_chi:看情况吧,将会能在土土措施后边防止不影响土土措施功能说说使用if else防止,将会参数错误导致 土土措施能也能 正常工作,好难就得抛异常了,Java提供了java.lang.IllegalArgumentException,能也能 直接new有另1个 抛出去,这是有另1个 RuntimeException,需要try..catch。

另一方嘴笨 liupopo说的靠谱。下面结合某些代码来说明某些间题。

默认情况下断言好难开启。能也能 选者在哪个类上启用断言(断言启用好难继承性)。在类字段初始化器和静态初始化器初始化并且 ,类的类装载器根据配置决定启用或禁用断言。一旦类初始化完成后,断言的情况(启用或禁用)好难再改变。

3)fireaap:根据情况来选者使用if...else,还是exception。选者的土土措施也不我,你的土土措施的职责。也能也能 说有你土土措施的契约。

Java规范中对于断言说说的执行有删剪的说明,有兴趣的让我们让我们让我们让我们能也能 参阅http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

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

exception土土措施的好指在于是业务逻辑和异常防止分离(代码相对清晰),try中防止业务,catch中防止异常情况。在API设计中,能也能 设计Exception Handler来防止异常,使得层次分明。一起去,更好的OOP的封装和多态性。缺点在于性能相对差。

3.1 assert的语法

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

首先,对于有两种间题,不应该回答:用Exception异常将会if判断,而应该视情况决定使用Exception还是if。另一方嘴笨 面试官比较看重的有你对异常的理解,回答的关键应该是两者的优缺点与适用场合上,顺带能也能 总结某些实际中你是怎样才能防止异常的。对于有人说使用断言(assert),还说是标准答案,另一方嘴笨 不赞同。就像有人回答说:题目问的是:用Exception异常还是if判断,却来个用断言,太离题了吧。并且 好难回答说说,下面的间题为啥在么在答?难道直接说让我们让我们让我们让我们是否 好,assert好?

总结:在论坛中,有人提到在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抛出,当然异常是否 将会没必要抛出,也不我另一方防止(各种开源框架中是否 从前情况)。

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