刚才琢磨这个问题主要是在想,如果constructor抛出了exception,那么返回的object是什么一个情况呢?如果我这个object中有一些关键的资源没有初始化,比如说Database connection在创建的时候有可能抛出SQLException,会不会返回一个HALF-MADE的object呢?为了验证,写了如下代码,结论:如果constructor中抛出了exception,constructor不会返回任何object,甚至null也不会返回。(因为程序流程在执行到return之前就跳转到exception处理去了啊亲,当然不会return任何东西!)

class Box {
private final int number;
public Box(int number) {
if (number < 0) {
throw new IllegalArgumentException("Negative number: " + number);
}
this.number = number;
}
public int getNumber() {
return number;
}
} public class Foo { public static void main(String[] args) {
Box box = new Box(999);
try {
box = new Box(-999);
} catch (IllegalArgumentException e) {
// ignored
}
System.out.println(box);
} }

回到我刚才遇到的问题,经过这番思考之后,我改写了一下,使用了一个static factory method(当然,针对我这里的情况而言,其实使用constructor也是可以的)

// Data Source
public class DatabaseConnection {
// data source name
private static final String DSNAME = "java:comp/env/jdbc/fooooooooooooo";
private Connection conn = null;
private DatabaseConnection(Connection conn) {
this.conn = conn;
}
/**
* Construct a new instance of DatabaseConnection.
* @return a new instance of DatabaseConnection.
* */
public static DatabaseConnection newInstance() throws NamingException, SQLException {
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(DSNAME);
Connection conn = ds.getConnection();
return new DatabaseConnection(conn);
}
public Connection getConnection() {
return conn;
}
public void close() throws SQLException {
conn.close();
}
}

我搜索了3篇有关constructor的问题,值得一看

1、Is it good practice to make the constructor throw an exception?

  里面讨论了从constructor抛出exception是不是good practice

  值得一提的是,里面还讨论了检查argument的正确性应该用exception还是assertion

2、Is doing a lot in constructors bad?

3、How much code should one put in a constructors (Java)?

  2和3讨论了constructor应该做哪些工作,不应该做哪些工作,做多少工作合适,以及在什么情况下应该考虑使用Factory或者Builder

从constructor中抛出exception后,constructor会返回null吗?的更多相关文章

  1. java中抛出throw关键字是怎么用的? 举例?

    5.抛出throw关键字 马克-to-win:我们先说5/0的原理,当程序运行到5/0的时候,java系统JVM会在后台new出一个除0异常实例,之后把这个实例传入catch块儿供开发者使用.马克-t ...

  2. 一个问题:关于finally中return吞掉catch块中抛出的异常

    今天遇到一个感觉很神奇的问题,记录一下问题以及自己分析问题的思路. 预警:不知道怎么看java字节码的朋友可能需要先看一下如何阅读java字节码才能看懂后面的解释. 我有一段程序: public cl ...

  3. js中遍历出查询后的listmodel(下拉框系列)

    function selectclassname(){ $.ajax({ url:"queryschoolclasslists.action", async:false, data ...

  4. 想抛就抛:Application_Error中统一处理ajax请求执行中抛出的异常

    女朋友不是想抛就抛,但异常却可以,不信请往下看. 今天在MVC Controller中写代码时,纠结了一下: public async Task<ActionResult> Save(in ...

  5. maven执行过程中抛出的各类异常信息

    价值 各类异常信息分类 举例 maven源代码的模块maven-core里的各类*Exception命名的class包含里,maven执行过程中打印的各类异常日志内容 比如如下错误 错误信息分别来自( ...

  6. ASP.NET程序中 抛出"Thread was being aborted. "异常(转)

    Thread was being aborted :中文意思 线程被终止 引用地址:http://support.microsoft.com/default.aspx/kb/312629/EN-US/ ...

  7. CDH下集成spark2.2.0与kafka(四十一):在spark+kafka流处理程序中抛出错误java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)V

    错误信息 19/01/15 19:36:40 WARN consumer.ConsumerConfig: The configuration max.poll.records = 1 was supp ...

  8. nodejs出现events.js:72中抛出错误 Error: listen EADDRINUSE

    <pre>events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoExce ...

  9. Django admin 中抛出 'WSGIRequest' object has no attribute 'user'的错误

    这是Django版本的问题,1.9之前,中间件的key为MIDDLEWARE_CLASSES, 1.9之后,为MIDDLEWARE.所以在开发环境和其他环境的版本不一致时,要特别小心,会有坑. 将se ...

随机推荐

  1. 数学图形(1.38)anguinea曲线

    个人觉得,这是一种变异的SIN曲线. #http://www.mathcurve.com/courbes2d/anguinee/anguinee.shtml vertices = t = from ( ...

  2. 高性能CSS

    避免使用@import 有两种方式加载样式文件,一种是link元素,另一种是CSS 2.1加入@import.而在外部的CSS文件中使用@import会使得页面在加载时增加额外的延迟.虽然规则允许在样 ...

  3. UI设计经常使用站点

    前期:http://www.zcool.com.cn/ 中期:http://www.ui.cn/ 后期:https://dribbble.com/

  4. Git使用帮助

    1. 本地创建新项目 git init git add . git commit -m "First commit" 2. 本地代码同步Push到远程仓库 git remote a ...

  5. 一些C++11语言新特性 - Uniform Initialization

    1. Uniform Initialization , , }; std::vector<, , , , , , }; std::vector<std::string> cities ...

  6. Unity3D 多平台_预编译相关宏定义

    http://www.cnblogs.com/zhaoqingqing/p/3510332.html API地址:http://docs.unity3d.com/Documentation/Manua ...

  7. Box layout

    Layout management with layout classes is much more flexible and practical. It is the preferred way t ...

  8. JavaWeb 发送get请求

      JavaWeb 发送get请求 CreationTime--2018年6月20日15点27分 Author:Marydon 1.前提 通过HttpClient来实现 2.具体实现 客户端如何发送请 ...

  9. Ubuntu下开启root登陆--并开启SSH登录验证

    Ubuntu下开启root登陆亲手安装过Ubuntu的童鞋都知道,默认安装只会添加一个普通用户名和密码,而超级用户权限则是利用sudo命令来执行.在Ubuntu下使用root登陆或者在shell中用s ...

  10. iOS-仿智联字符图片验证码

    概述 随机字符组成的图片验证码, 字符位数可改变, 字符可斜可正排列. 详细 代码下载:http://www.demodashi.com/demo/10850.html 项目中有时候会有这种需求: 获 ...