使用最终成员处理构造函数中捕获的Java异常

褪色的蜜蜂:

我有一些丑陋的代码,想重构它:

public class UdpTransport extends AbstractLayer<byte[]> {
    private final DatagramSocket socket;
    private final InetAddress address;
    private final int port;
    /* boolean dead is provided by superclass */

    public UdpTransport(String host, int port) {
        this.port = port;
        InetAddress tmp_address = null;
        try {
            tmp_address = InetAddress.getByName(host);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            dead = true;
            socket = null;
            address = null;
            return;
        }
        address = tmp_address;
        DatagramSocket tmp_socket = null;
        try {
            tmp_socket = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
            dead = true;
            socket = null;
            return;
        }
        socket = tmp_socket;
    }
    ...

导致丑陋的问题是final成员之间的交互和捕获的异常。final如果可能,我想保留成员

我想按以下方式编写代码,但是Java编译器无法分析控制流- address无法进行第二次分配,因为必须首先尝试分配才能使控制到达catch子句。

public UdpTransport(String host, int port) {
    this.port = port;
    try {
        address = InetAddress.getByName(host);
    } catch (UnknownHostException e) {
        e.printStackTrace();
        dead = true;
        address = null; // can only have reached here if exception was thrown 
        socket = null;
        return;
    }
    ...

Error:(27, 13) error: variable address might already have been assigned

有什么建议吗?

PS我有一个约束,那就是构造函数不要抛出-否则这将很容易。

Audrius Meskauskas:

让构造函数抛出异常。离开final未分配是确定的,如果在构造函数不正常终止,在此情况下,不返回任何对象。

代码中最丑陋的部分是在构造函数中捕获异常,然后返回现有的但无效的实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章