构造函数可以中止实例化吗?

时间:2012-04-01 14:51:34

标签: java constructor

我想在构造函数中进行测试,以确定当前是否使用给定参数实例化对象是一个好主意。但是我如何中止并从构造函数向新语句返回警告?在每个“新”声明之前,调用者是否必须进行此类测试?我认为构造函数对它来说是个好地方。

5 个答案:

答案 0 :(得分:9)

您可以使用工厂对象。然后,这可以运行您的检查并返回instansiated对象,或null。这可能比例外更有效。

MyObject myObject = MyObjectFactory.createMyObject();

答案 1 :(得分:5)

是的,你在构造函数中抛出一个异常。

在java中,如果其中一个参数是错误的,那么你通常会抛出一个IllegalArgumentException,这是一个常见的做法,作为一个守护声明:

public class Roman {

    public Roman(int arabic) {

        // "Guard statement" in the beginning of the constructor that
        // checks if the input is legal
        if (arabic < 0) {
            throw new IllegalArgumentException("There are no negative roman numerals");
        }

        // Continue your constructor code here

    }

}

如果您不想要例外,则可以GavinCatelli's answer创建,并创建一个工厂方法,如果该对象不是“正确”,则返回null。

public class RomanFactory {

    public static Roman getSafeRoman(int a) {
        Roman r;
        try {
            r = new Roman(a);
        } catch(IllegalArgumentException e) {
            r = null;
        }
        return r;
    }

}

你必须检查null,否则程序可能会因NullPointerException而崩溃。

答案 2 :(得分:2)

中止对象构造的唯一可靠方法是在构造函数

完成之前抛出异常

答案 3 :(得分:1)

如果参数无效,您可以让构造函数抛出异常。

如果只是输入有效性的问题,调用者应该能够自行检查,那么你应该抛出RuntimeException。如果它是调用者无法控制的东西,那么构造函数应抛出一个已检查的异常;请注意,这将需要调用构造函数的所有代码来处理或声明异常。

答案 4 :(得分:0)

创建自己的异常类,并根据传递给构造函数的参数传递消息。因此从构造函数中抛出此异常。