构造器的功能是把对象设置成安全状态,但还会有别的动作,比如打开一个文件,这样的动作只有在对象使用完毕并且用户调用了特殊的清理方法之后才能得以清理。如果在构造器内出现了异常,这些清理行为也许就不能正常工作了。这意味着在编写构造器时候要格外细心。请看下面的例子
package com.bird.thinking;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class InputFile {
/**
* @use 构造器的异常处理
* @param args
* @author Bird
*/
private BufferedReader in;
public InputFile(String FileName) throws Exception{//带一个参数的构造器
try{
in = new BufferedReader(new FileReader(FileName));
}catch(FileNotFoundException e){
System.out.println("Could not Open " + FileName);//它现在没有打开文件,所以不需要关闭
throw e;//一定要抛出异常,方便使用者知道构造函数会有异常
}catch(Exception e){//抛出其他异常说明文件已经打开,则需要关闭
try{
in.close();
}catch(IOException e2){
System.out.println("in.close() unsuccessful");
}
throw e;
}
}
public String getLine(){//出现异常则抛出运行错误异常
String s = null;
try{
s = in.readLine();
}catch(IOException e){
throw new RuntimeException("readLine() failed");
}
return s;
}
public void dispose(){
try{
in.close();
System.out.println("dispose close successful");
}catch(IOException e2){
throw new RuntimeException("in.close() unsuccessful");
}
}
public static void main(String[] args) {//使用这个类的构造函数
try{
InputFile in = new InputFile("d:\\测试.txt");//构造函数的初始化需要单独放在一个try-catch模块里面
try{
String s = null;
while((s = in.getLine()) != null){
System.out.println(s);
}
}catch(Exception e){
System.out.println("Cauch Exception in main");
e.printStackTrace(System.out);
}finally{
in.dispose();
}
}catch(Exception e){
System.out.println("InputFile Construction failed");
}
}
}
当这个文件找不到时候,运行结果如下
Could not Open d:\试.txt
InputFile Construction failed
当这个文件找到的时候,运行结果如下
测试
dispose close successful
1.可以看出,如果构造器失败了,将抛出FileNotFoundException异常,而其他的异常会提示,并且关闭输入流
2.调用的时候多了一个try-catch模块,这是为了不要误导使用者,让他认为对象已经创建完毕,可以使用了
3.总之,使用构造器里面的异常一定要注意,嵌套try-catch,和抛出处理完的异常
分享到:
相关推荐
研讨课 Hands-on Java研讨课CD Thinking in Objects研讨课 Thinking in Enterprise Java Thinking in Patterns(with Java) Thinking in Patterns研讨课 设计咨询与复审 附录B 资源 软件 编辑器与IDE 书籍 分析与设计...
java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。
JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...
java 构造器初始化成员变量 是否提供默认构造器 继承中构造器的调用
JAVA构造器
计算机后端-Java-Java核心基础-第30章 动态代理与Java8新特性 18. 构造器引用与数组引用
主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下
理解构造器--构造器和方法的区别 要学习Java,你必须理解构造器。因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆。但是,构造器和方法又有很多重要的区别。 我们说构造器是一种方法,就象讲澳大利亚的...
计算机后端-Java-Java核心基础-第11章 面向对象03面向对象03 11. 构造器练习:基本使
计算机后端-Java-Java核心基础-第13章 面向对象05 14. super调用构造器.avi
Java入门理解构造器
钉钉 Java SDK 钉钉官方提供了统一的SDK,使用SDK可以便捷的调用服务端API。注意:此SDK包含原有TOP接口,原有TOP接口可以继续正常调用,没有影响。下面是使用SDK调用API的请求示例: JAVA: DingTalkClient client...
计算机后端-Java-Java核心基础-第11章 面向对象03面向对象03 12. 构造器练习:三角形.avi
没错,mysql-connector源码,也许是你需要的
使用_Java_构造高可扩展应用
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
MyBatisPlus条件构造器 -Wrapper详解(为知笔记版,可用网页打开),详解wrapper条件构造器的各种使用方法及其扩展类的使用方法。
Bruce Eckel 《Thinking in Java》(Java编程思想)作者。Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
面向对象的软件构造导论实验课---IntelliJ IDEA软件实现---Java语言编写---单机版飞机大战。 这个是单机版飞机大战的完整文件包,解压后即可运行。 不过还是,建议大家还是去看我写的文章: ...