日期:2011-03-22 16:17:00 来源:本站整理
构建器[Java编程]
本文“构建器[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为违例编写代码时,我们常常要办理的一个问题是:“一旦产生违例,会精确地举行排除吗?”大大都时刻城市非常安全,但在构建器中倒是一个大问题.构建器将对象置于一个安全的起始状况,但它大概履行一些操作——如翻开一个文件.除非用户完成对象的利用,并调用一个特别的排除办法,不然那些操作不会得到精确的排除.若从一个构建器内部“掷”出一个违例,这些排除行为也大概不会精确地发生.全部这些都意味着在编写构建器时,我们必须分外加以留神.
由于前面刚学了finally,所以大家大概认为它是一种符合的筹划.但事情并没有这么简单,因为finally每次城市履行排除代码——即便我们在排除办法运行之前不想履行排除代码.因此,假定真的用finally举行排除,必须在构建器正常完毕时设置某种情势的标志.并且只要设置了标志,就不要履行finally块内的任何东西.由于这种做法并不完善(需求将一个地方的代码同另一个地方的结合起来),所以除非分外需求,不然普通不要尝试在finally中举行这种情势的排除.
在下面这个例子里,我们成立了一个名为InputFile的类.它的作用是翻开一个文件,然后每次读取它的一行内容(转换为一个字串).它操纵了由Java尺度IO库供应的FileReader以及BufferedReader类(将于第10章谈论).这两个类都非常简单,大家目前可以毫无艰难地掌握它们的基本用法:
//: Cleanup.java // Paying attention to exceptions // in constructors import java.io.*; class InputFile { private BufferedReader in; InputFile(String fname) throws Exception { try { in = new BufferedReader( new FileReader(fname)); // Other code that might throw exceptions } catch(FileNotFoundException e) { System.out.println( "Could not open " + fname); // Wasn't open, so don't close it throw e; } catch(Exception e) { // All other exceptions must close it try { in.close(); } catch(IOException e2) { System.out.println( "in.close() unsuccessful"); } throw e; } finally { // Don't close it here!!! } } String getLine() { String s; try { s = in.readLine(); } catch(IOException e) { System.out.println( "readLine() unsuccessful"); s = "failed"; } return s; } void cleanup() { try { in.close(); } catch(IOException e2) { System.out.println( "in.close() unsuccessful"); } } } public class Cleanup { public static void main(String[] args) { try { InputFile in = new InputFile("Cleanup.java"); String s; int i = 1; while((s = in.getLine()) != null) System.out.println(""+ i++ + ": " + s); in.cleanup(); } catch(Exception e) { System.out.println( "Caught in main, e.printStackTrace()"); e.printStackTrace(); } } } ///:~
该例利用了Java 1.1 IO类.
用于InputFile的构建器采取了一个String(字串)参数,它代表我们想翻开的那个文件的名字.在一个try块内部,它用该文件名成立了一个FileReader.对FileReader来说,除非转移并用它成立一个可以实际与之“扳谈”的BufferedReader,不然便没什么用处.注意InputFile的一个好处就是它同时归并了这两种行动.
若FileReader构建器不成功,就会产生一个FileNotFoundException(文件未找到违例).必须单独捕捉这个违例——这属于我们不想关闭文件的一种特别情形,因为文件还没有成功翻开.其他任何捕捉从句(catch)都必须关闭文件,因为文件已在进入那些捕捉从句时翻开(当然,假如多个办法都能产生一个FileNotFoundException违例,就需求略微用一些本领.此时,我们可将差别的情形脱离到数个try块内).close()办法会掷出一个尝试过的违例.即便它在另一个catch从句的代码块内,该违例也会得以捕捉——对Java编译器来说,那个catch从句不过是另一对花括号罢了.履行完本地操作后,违例会被重新“掷”出.这样做是必要的,因为这个构建器的履行已经失利,我们不但愿调用办法来假定对象已精确成立以及有效.
在这个例子中,没有采取前述的标志技术,finally从句明显不是关闭文件的精确地方,因为这大概在每次构建器完毕的时刻关闭它.由于我们但愿文件在InputFile对象处于活动状况时一向保持翻开状况,所以这样做并不得当.
getLine()办法会返回一个字串,此中包含了文件中下一行的内容.它调用了readLine(),后者大概产生一个违例,但那个违例会被捕捉,使getLine()不会再产生任何违例.对违例来说,一项分外的计划问题是决意在这一级完好掌握一个违例,还是举行部份掌握,并传送相同(或差别)的违例,大概只是简单地传送它.在得当的时刻,简单地传送可极大简化我们的编码工作.getLine()办法会变成:
String getLine() throws IOException {
return in.readLine();
}
但是当然,调用者目前需求对大概产生的任何IOException举行掌握.
用户利用完毕InputFile对象后,必须调用cleanup()办法,以便释放由BufferedReader以及/大概FileReader占用的系统资源(如文件句柄)——注释⑥.除非InputFile对象利用完毕,并且到了需求弃之不用的时刻,不然不该举行排除.大家大概想把这样的机制置入一个finalize()办法内,但正如第4章指出的那样,并非总能保证finalize()得到精确的调用(即便肯定它会调用,也不知道什么时刻开始).这属于Java的一项缺陷——除内存排除之外的全部排除都不会自动举行,所以必须知会客户程序员,奉告他们有责任用finalize()保证排除工作的精确举行.
⑥:在C++里,“破坏器”可帮我们掌握这一局面.
在Cleanup.java中,我们成立了一个InputFile,用它翻开用于成立程序的相同的源文件.同时一次读取该文件的一行内容,并且增添呼应的行号.全部违例城市在main()中被捕捉——固然我们可挑选更大的坚固性.
这个示例也向大家展示了为安在本书的这个地方引入违例的概念.违例与Java的编程具有很高的集成度,这主如果由于编译器会强迫它们.只有知道了若何操作那些违例,才可更进一步地掌握编译器的知识.
以上是“构建器[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:<b>java的通用调集库</b>
- ·下一篇文章:缺陷:丧失的违例
- ·中查找“构建器”更多相关内容
- ·中查找“构建器”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论