抛出异常然后调用构造函数?

时间:2015-07-13 13:45:33

标签: java constructor

所以我建立了一个主要用于个人用途的测试库,但我有一个问题。

使用Java,如果你的班级中有2个或更多的构造函数,如果你想从另一个构建函数,那么它必须是你做的第一件事。这对我来说是个问题,因为我有以下设置。

public Constructor(TypeA a, TypeB b, TypeC c) {
    if (c.getData() == null) throw new IllegalArgumentException("");
    this(a, b, c.getOtherData());
}

public Constructor(TypeA a, TypeB b, TypeD d) {
    // stuff happens
}

如何做到这一点,避免使用"构造函数调用必须是构造函数中的第一个语句"错误?

5 个答案:

答案 0 :(得分:4)

你无法用构造函数做你想做的事。而是使用这样的静态工厂方法:

struct tm tm;
tm.tm_year = 2000 - 1900;  // Years from 1900
tm.tm_mon = 1 - 1; // Months form January
tm.tm_mday = 1;
char time_buffer[100];
int hh, mm;
float ss;
time_t time_value;
char *timestamp = "16:11:56.484";

if (sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ss) != 3) Handle_BadData();
tm.tm_hour = hh;
tm.tm_min = mm;
tm.tm_sec = roundf(ss);  // or simply = ss;
tm.tm_isdst = 0;  // Keep in standard time
// time_value = malloc(100*sizeof(char));
time_value = mktime(&tm);
if (time_value == -1) {
    printf ("unable to make time");
}
else {
  strftime(time_buffer, sizeof(time_buffer), "%c", &tm);
  printf(time_buffer);
}

// Sat Jan  1 16:11:56 2000

答案 1 :(得分:3)

一个选项(可能不好): 检查getData == null and throw the exception as first thing in c.getOtherData()`。这将是第一个被执行的方法。

其他选项: 有一个方法,

helper() {
    if (getData() == null) throw new Exception();
    return getOtherData();
}

从构造函数中调用c.helper()而不是c.getOtherData()

答案 2 :(得分:2)

如何创建静态工厂方法?

public static Constructor newInstance(TypeA a, TypeB b, TypeC c) {
    if (c.getData() == null) throw new IllegalArgumentException("");
    return new Constructor(a, b, c);
}

private Constructor(TypeA a, TypeB b, TypeC c) {
    this(a, b, c.getOtherData());
}

private Constructor(TypeA a, TypeB b, TypeD d) {
    // stuff happens
}

答案 3 :(得分:0)

你可以有一个额外的私人建筑师。我假设你在这里简化了一些代码。你是说如果某些东西是null然后抛出 - 否则你别的东西。

public Constructor(TypeA a, TypeB b, TypeC c) {
   this(a, b, c.getData(), c.getOtherData()); //calls the private ctor
}

public Constructor(TypeA a, TypeB b, TypeD d) {
    // stuff happens  
}

private Constructor(TypeA a, TypeB b, TypeD d1, TypeD d2) {
    // stuff happens  
}

或者你可以传递TypeC

 private Constructor(TypeA a, TypeB b, TypeC) {
    // now do you null check here.
}

Java确实会引起一些痛苦!然后这个规则就是其中之一。在关于编译错误的问题的具体答案中 - 你不能:(

答案 4 :(得分:0)

尝试将抛出的异常移动到第二个构造函数的开头。这将实现完全相同的事情。如果该构造函数有多个路径,则可以创建一个指示逻辑路径的附加参数。