快速业务通道

使用原汁原味的Java语言 - 非Java原生程序员的语言流畅性 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
, "UTF-8");    } catch (UnsupportedEncodingException e) {      System.err.println("This can''t happen!");      return;    }    BufferedReader buffer = new BufferedReader(reader);    String line;    try {      line = buffer.readLine();    } catch (IOException e) {      System.err.println(e.getMessage());      return;    }    double x;    try {      x = Double.parseDouble(line);    }    catch (NumberFormatException e) {      System.err.println(e.getMessage());      return;    }    System.out.println("Read: " + x);   }

这段代码非常难以阅读,甚至比异常处理取代的 if (errorCondition) 测试 更为难解。流畅的 Java 代码将错误处理与故障点分离开来,不会将错误处理代 码与正常执行流混合在一起。清单 14 中的版本更易于阅读和理解:

清单 14. 保持代码的主执行路线完好

public void readNumberFromFile(String name) {    try {      FileInputStream in = new FileInputStream(name);      InputStreamReader reader = new InputStreamReader(in,  "UTF-8");      BufferedReader buffer = new BufferedReader(reader);      String line = buffer.readLine();      double x = Double.parseDouble(line);      System.out.println("Read: " + x);    }    catch (NumberFormatException e) {      System.err.println("Data format error");    }    catch (IOException e) {      System.err.println("Error reading from file: " +  name);    }   }

使用原汁原味的Java语言 - 非Java原生程序员的语言流畅性(11)

时间:2011-06-10 IBM Elliotte Rusty Harol

某些时候,您可能需要使用嵌套的 try-catch 块来分离造成相同异常的不同 故障模式,但这种情况并不常见。主要的实践经验是:如果一个方法中存在多个 try 块,那么就表明方法过于庞大,应拆分为多个较小的方法。

最后,具有各种语言背景、刚刚接触 Java 编程的程序员往往会错误地假设 他们必须在抛出检查异常(checked exception)的方法中捕捉到这些异常。而 抛出异常的方法通常并不是应该负责捕捉异常的方法。例如,考虑如清单 15 所 示的方法:

清单 15. 过早的异常处理

public static void copy(InputStream in, OutputStream  out) {   try {    while (true) {     int datum = in.read();     if (datum == -1) break;     out.write(datum);    }    out.flush();   } catch (IOException ex) {     System.err.println(ex.getMessage());   }   }

此方法没有足够的信息来处理很有可能发生的 IOException。它并不了解谁 调用了它,也不了解故障的后果。对于此方法来说,惟一合理的举措就是允许 IOException 上行至调用方。编写此方法的正确方式如清单 16 所示:

清单 16. 并非所有异常都需要在第一时间捕捉

public static void copy(InputStream in, OutputStream  out) throws IOException {   while (true) {    int datum = in.read();    if (datum == -1) break;    out.write(datum);   }   out.flush();   }

简而言之,这更为简单、更容易理解,将错误信息传递给代码中最适合处理 这些信息的部分。

这些问题是否真的那么重要?

这些问题都不是关键问题

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号