论坛首页 Java企业应用论坛

验证String是不是整数,用异常作判断怎么了!(续2)

浏览 6911 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-01-02   最后修改:2011-01-02
gdpglc 写道
evanzzy 写道
用异常判断正常逻辑不太好,一是程序结构不清晰,因为异常不仅仅代表了验证错误,还可能代表网络错误、内存溢出等问题;二是异常做判断,比用普通的判断方法耗费的系统资源要大得多,这个大得多的数量级在10倍以上。所以还是不要用异常处理正常逻辑,虽然功能用起来没问题,但不代表这种写法就是好的


张冠李代 乱其八糟

总共6行代码:哪里能看出不清晰呢???
这6行代码里,哪有网络的事...
又是性能,c比java估计也能快10倍,你会因为这个不用java吗?

这些理由是死的,用法是活的...



快10倍的话,java早死了。 真不知道你在想什么。

你的程序没有什么问题, 但是, 你这个程序存在局限性:

对于一个性能没有要求的地方, 无所谓的;
对于性能有要求, 但是钱不是问题的地方, 无所谓;
如果您刚从事这个行业, 对自己没有什么要求,其实程序代码能工作就可以了, 也是没有那么多的要求。 但是, 请不要误导他人。

如果你在互联网企业, 并且大规模的处理数据, 数据又不是那么规整的时候,你就知道你这段代码造成多大的悲剧了。
不懂其实不要紧的, 但是又人说你不对的时候, 请您好好想下为什么。
你可以看看我的blog写的一些内容。   http://sdh5724.iteye.com/blog/647930

某种处理方式是不是合适, 要看业务场景的。 对于桌面程序, 小规模程序大部分的处理方式都是对的。但是,也有很多程序员, 需要面对严酷的性能, 也有很多程序员需要面对严格的代码review, 还有些程序员写的是opensource代码,需要面对大伙的挑战。

如果, 你引用的opensource代码, 都完全象你这么做, 你还能相信他们的代码质量么?

写代码有很多“不建议”的方法, “不建议”不是说你不能用, 如果不影响的情况下, 你也可以用。 如果一个程序员经常使用“不建议”的方式做事, 那么这习惯就会被你自然的养成。 

看你坚持不懈的样子, 回个贴, 哎, 累。






1 请登录后投票
   发表时间:2011-01-02  
gdpglc 写道
evanzzy 写道
用异常判断正常逻辑不太好,一是程序结构不清晰,因为异常不仅仅代表了验证错误,还可能代表网络错误、内存溢出等问题;二是异常做判断,比用普通的判断方法耗费的系统资源要大得多,这个大得多的数量级在10倍以上。所以还是不要用异常处理正常逻辑,虽然功能用起来没问题,但不代表这种写法就是好的


张冠李代 乱其八糟

总共6行代码:哪里能看出不清晰呢???
这6行代码里,哪有网络的事...
又是性能,c比java估计也能快10倍,你会因为这个不用java吗?

这些理由是死的,用法是活的...


能把c写到比java快10倍的人 确实不多.....

特别在server side....
0 请登录后投票
   发表时间:2011-01-02  
我只能说楼主是刚出道的。哈哈。。。

面试我绝对不要这种固执的人,不听好的建议。。。

虽然代码实现了功能,但是抛出异常的性能明显要减低,而且你还直接用exception来抛出。

希望你工作的时候不要做出这么低级的代码出来。。

随便拍砖。
1 请登录后投票
   发表时间:2011-01-02   最后修改:2011-01-02
引用

快10倍的话,java早死了。

java的所以能占有一席之地,是因为它的社区比较活跃,比如javaeye;入门比较简单,好多非计算机相关专业的朋友上几个月补习班,就可以出来干活了;较好的Exception机制,使代码维护比较方便;比较爽的IDE;VM的设计理念等等。
另外,这个快10倍应该也不是空穴来风的。在特定场景下是可以做得出来的。
下面是测试的源码:
#include "stdio.h"
#include "stdlib.h"
#include <sys/time.h> 
int main(int argc, char *argv[]){
        struct timeval tvafter, tvpre;
        struct timezone tz;
        long sum=0;
        int i=0;
        gettimeofday(&tvpre, &tz);
        for(i=0;i<1000000;i++){
                sum+=i;
        }
        gettimeofday(&tvafter, &tz);
        printf("sum=%d, Time used=%d\n",sum,(tvafter.tv_sec-tvpre.tv_sec)*1000+(tvafter.tv_usec-tvpre.tv_usec));
}

public class T{
        public static void main(String[] args){
                long t0 = System.nanoTime();
                int sum=0;
                int i=0;
                for(i=0;i<1000000;i++){
                        sum += i;
                }
                long t1 = System.nanoTime();
                System.out.println("sum="+sum+", Time used="+(t1-t0)/1000);     
        }
}

echo "C Performance"
gcc -O2 t.c
./a.out
echo "Java Performance"
/opt/java1.5/bin/javac T.java
/opt/java1.5/bin/java T

下面是测试的环境:
引用

HP-UX B.11.31 U ia64
HP RX6600 3CPU(1.6G双核) 36G内存
JDK1.5.0.11(HP)
GCC4.2.4

下面是测试的结果:
引用

C Performance
sum=1783293664, Time used=628
Java Performance
sum=1783293664, Time used=7677
0 请登录后投票
   发表时间:2011-01-02   最后修改:2011-01-02
我现在有点忙,正想找时间做这个测试呢?多谢... 对于性能问题请别拍脑门...
0 请登录后投票
   发表时间:2011-01-02   最后修改:2011-01-02
sdh5724 写道
gdpglc 写道
evanzzy 写道
用异常判断正常逻辑不太好,一是程序结构不清晰,因为异常不仅仅代表了验证错误,还可能代表网络错误、内存溢出等问题;二是异常做判断,比用普通的判断方法耗费的系统资源要大得多,这个大得多的数量级在10倍以上。所以还是不要用异常处理正常逻辑,虽然功能用起来没问题,但不代表这种写法就是好的


张冠李代 乱其八糟

总共6行代码:哪里能看出不清晰呢???
这6行代码里,哪有网络的事...
又是性能,c比java估计也能快10倍,你会因为这个不用java吗?

这些理由是死的,用法是活的...



快10倍的话,java早死了。 真不知道你在想什么。

你的程序没有什么问题, 但是, 你这个程序存在局限性:

对于一个性能没有要求的地方, 无所谓的;
对于性能有要求, 但是钱不是问题的地方, 无所谓;
如果您刚从事这个行业, 对自己没有什么要求,其实程序代码能工作就可以了, 也是没有那么多的要求。 但是, 请不要误导他人。

如果你在互联网企业, 并且大规模的处理数据, 数据又不是那么规整的时候,你就知道你这段代码造成多大的悲剧了。
不懂其实不要紧的, 但是又人说你不对的时候, 请您好好想下为什么。
你可以看看我的blog写的一些内容。   http://sdh5724.iteye.com/blog/647930

某种处理方式是不是合适, 要看业务场景的。 对于桌面程序, 小规模程序大部分的处理方式都是对的。但是,也有很多程序员, 需要面对严酷的性能, 也有很多程序员需要面对严格的代码review, 还有些程序员写的是opensource代码,需要面对大伙的挑战。

如果, 你引用的opensource代码, 都完全象你这么做, 你还能相信他们的代码质量么?

写代码有很多“不建议”的方法, “不建议”不是说你不能用, 如果不影响的情况下, 你也可以用。 如果一个程序员经常使用“不建议”的方式做事, 那么这习惯就会被你自然的养成。 

看你坚持不懈的样子, 回个贴, 哎, 累。

对性能无要求的地方

也尽量不用异常.
try{
while(true){//不用hashnext用异常不好么?
 list.add( it.next());  
}
}cache(Exception e ){
 return list;
}


使用goto & 指针写的好的程序多了去了
但大多数人都不能用的好.
盖狗舍不需要多严格的代码规范
但盖大楼时不需要多少hack技巧
0 请登录后投票
   发表时间:2011-01-02  
phoenixlf 写道
楼主,你有做任何事的自由,我们尊重你的这种自由。
但我这和你讨论另一个问题,
让我们再回顾一下你的代码:
public static boolean validateInteger(String str) { 
try { 
        Integer.parseInt(str); 
     } catch (Exception ex) { 
         return false; 
     } 
     return true; 
}


这段代码的功能是什么?我的理解是判断转入字符串是否为整数,那好,判断这个的目的是什么呢?Integer.parseInt(str)的功能是什么,是解析字符串为Int值,而不是判断是不是为整数(虽然可以通过异常来实现这个功能),当然这只是我的理解。我的原则是代码要完全忠实于其目的。对我而言,在写方法的实现中,尽可能做到只专注自已的功能实现。

让我们再猜测一下,调用这个函数的方法接下来是不是会还进行一次parseInt操作呢,如果是那validateInteger(String str)里面用parseInt来判断是不是有点不好呢。
如果不是,那这个判断有何用呢?因为判断其整数的行为肯定是会在接下来的一个地方会用到其整数属性。如果不是,那判断其整数的行为就很难理解。
另外,关于楼主专注的用异常来判断的话题,个人认为可行但是尽可能避免,理由有上面说的也有个人风格问题。
另给大家说句迟到的元旦快乐。^.^


软件开发的基本原则是 高内聚,低偶合, 直接指导原则是:针对接口编程。 也就是接口的调用者,不必关心接口的实现方式。 如果你理解我说的,你再看看你自已写的内容...
0 请登录后投票
   发表时间:2011-01-02  
不建议使用异常
1、异常是怎么来的?
很久以前,编程里没有异常,用跳转(ASM),错误号(C/C++),然后OOP的时候,加入了这个结构化的异常,用来控制程序结构的,不是用来做业务处理的。

2、性能
处理异常比正常的一个判断,性能确实差了很多,参见efficient java
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics