本帖最后由 szuzsq 于 2014-11-14 10:14:42 编辑

解决方案 »

  1.   

    首先,异常处理是人们在创造java时带来的一个概念或者说用法,和你所说的返回值判断没有太本质的区别。但是返回值判断需要你对于你引用的方法(依你熟悉的应该叫函数)十分的了解。java和C#所倡导的面向对象编程,就是别人可以完全封装一个方法,你一眼其内容都不用阅读,即可以使用。其抛出的异常编译器强制你必须处理,也就避免了你“忘记”处理异常的几率。其次,所谓代码优美否,这个是仁者见仁的事情,每个人对于代码都有自己的结构思路,不能强求相同,其实最牛的工程师,是可以接受并适应任何代码风格,且可以迅速理解原作者的思路,并按照原作者思路进行仿制修改,以保证同一应用代码风格一致性。编程,搞程序,其实是一项工程,作为工程师其实并不是一味追求完美。完美主义者是科学家。最后,lz说有人反对java异常处理,我觉得是lz理解有些许偏差,lz可以再做详细的描述。
      

  2.   

    谢谢楼上的,,,
    我是从这里,看到一些人在争论java的try,catch
    http://www.cnblogs.com/mailingfeng/archive/2012/11/14/2769974.html
    你有空可以看看...其实try catch并不是java专有的,高级语言c++,pascal等都有...
    只不过,其他语言都是:"我有这个功能,你可以用,也可以不用..."
    但只有java才是:"我觉得这个灰机好,你尽量用..并且我的api都在用,你要用我的api,就不得不用...."异常处理的原理,可以追索到,硬件中断指令.是很花销cpu的....即然java提倡,那就用吧..呵呵..
    我纠结的是,怎么样将java代码写得简洁一点...
    比如上面我提到的代码A,霹雳啪啦50行代码....
    干的其实就是代码B,20行的活.....----------------------------------------------------------------------------
    我说的异常代表一种错误的返回值就是,比如登陆操作,正确情形下,就登陆了;如果用户名不存在,则抛出UserUnexitsException;如果密码不正确,则抛出PasswordInvalidException;
    而c++,也支持异常,但一般是,正确则返回0,用户名不存在则返回-1,密码不正确则返回-2...至于0,-1,-2代表的函义需要记忆,也是可以优化的.一是用宏定义;一是使用枚举类型,可以从他们的名称里体现函义...哦,我还想起一点,就是java截获异常时,基本上都可以e.printStackTrace();
    将信息打印到LogCat里面去,辅助调试...----------------------------------------------------------------------------
    我给出的网址里,有人也提到了,很多异常类,除了名字不同之外,完全就是继承Exception的空壳子....
    设计模式里提到,多用组合,少用继承.......
      

  3.   

    感谢lz回复,我大概扫了一下文章,可能理解的略有偏颇,望指正。
    从我本人而言,我对于Exception的理解还是文中所谓的“初级阶段”或者说“误解”,即我的编程喜欢只喜欢把系统级异常使用Exception处理,而业务、逻辑级(比如密码错误)更倾向于lz所说的返回值处理,其中一个原因就是异常定义过于繁杂编程的时候工作量……比如某一个稍复杂的信息录入方法,我调用的时候需要处理30种异常……甚至异常本身的管理都会出现问题。当然也有可能是本人经验的确有限,还没学习过更为科学华丽的异常管理结构。另,对于lz所说的代码A的优化,首先相同异常且相同处理的语句可以合并,例如:
     
     try {
            is.close();
            os.close();
        catch(IOException e) {
            //TODO...
        }
    其次,我大概梳理修改了一下,时间有限没有细作推敲,希望lz指正
    public static void ReinstallLibrary2(String dst, int raw) {
    InputStream is = Global.mainContext.getResources().openRawResource(raw);
    if (is == null)
    return;
    OutputStream os = null;
    try {
    os = new FileOutputStream(dst);
    byte[] buf = new byte[1024];
    while (true) {
    int len = 0;
    len = is.read(buf);
    if (len <= 0)
    break;
    os.write(buf, 0, len);
    }
    is.close();
    os.close();
    } catch (FileNotFoundException e) {
    //TODO...
    } catch (IOException e){
    //TODO...
    }
    }
      

  4.   


     try {
        is.close(); //这样的做法应该不行....如果这句抛出异常的话,那么下面这句os.close();就没机会执行了.句柄没有及时释放,泄露资源了.
        os.close();
    catch(IOException e) {
    }
    后面的雷同....
    其实在java最外面套上一层try,catch这种做法,相当于压根就没用上java异常处理的思想...
    任何一个地方都有可能出错,但catch的时候,有时并不能确切知道是哪里出的错....
    而且最主要的是一些释放资源的代码没有保证被执行