在子类的构造函数中引发异常

kyxcudwk  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(370)

所以我的问题是我有一个类和它的子类。
->类kassenbon->类kassenbonverbessert扩展kassenbon
在我的“kassenbon”类中,我有一个构造函数:

public Kassenbon(int max) {
        produkte = new String[max];
        preise = new Integer[max];
    }

然后我的子类的构造函数如下所示:

public KassenbonVerbessert(int max) {
        super(max);
    }

我现在的问题是,我想检查参数max,如果它是负数,那么我想抛出一个异常,因为这意味着构造函数将创建两个长度为负的数组,这是不可能的。但是我怎么做仅仅因为超级调用必须是构造函数中的第一个语句,对吗?!但如何实现:

if(max < 0){
   throw new IllegalArgumentException("Error");
}
uwopmtnx

uwopmtnx1#

当您无法将检查应用于父构造函数时,您必须内联检查,如这里和这里所建议的。但你不必为此编写自己的方法,你可以 java.util.Objects.checkIndex() 为此目的:

public KassenbonVerbessert( int max ) 
{
    super( java.util.Objects.checkIndex( max, Integer.MAX_VALUE ) );
}

第二个参数是 max ,如果你也想提供一个上边界…
当然,您可以为该方法添加静态导入: import static java.util.Objects.checkIndex; .

mrphzbgm

mrphzbgm2#

首先,这张支票在未来看起来更有意义 Kassenbon 建造师。但如果不想这样做,可以内联方法调用来检查参数:

public KassenbonVerbessert(int max) {
    super(checkMax(max));
}

private static int checkMax(int max) {
    if (max < 0) {
        throw new IllegalArgumentException("max cannot be negative.");
    }
    return max;
}
xhv8bpkk

xhv8bpkk3#

你不必强迫把支票放在儿童班。您可以直接将检查放入父类的构造函数中。

sz81bmfz

sz81bmfz4#

除了@khelwood所说的之外,还可以使用工厂方法强制创建类。通常,当对象的创建变得更加复杂时(特别是在检查和异常方面),您可以开始使用以下方法:

package stackoverflow.kassensystem;

public class Kassenbon {

    private final String[]  produkte;
    private final Integer[] preise;

    public Kassenbon(final int max) {
        produkte = new String[max];
        preise = new Integer[max];
    }

}

package stackoverflow.kassensystem;

public class KassenbonVerbessert extends Kassenbon {

    static public KassenbonVerbessert createInstance(final int max) {
        if (max < 0) throw new IllegalArgumentException("Parameter 'max' is out of valid bounds! Expected max>0, but got '" + max + "' instead.");
        return new KassenbonVerbessert(max);
    }

    private KassenbonVerbessert(final int max) {
        super(max);
    }

}

使用方法:

package stackoverflow.kassensystem;

public class KassenSystem {

    public static void main(final String[] args) {
        System.out.println("KassenSystem.main() startet...");
        // KassenbonVerbessert kb1 = new KassenbonVerbessert(20); this line cannot work, because KassenbonVerbessert CTOR is private. Must instanciate via static method
        final KassenbonVerbessert kb2 = KassenbonVerbessert.createInstance(20); // this works alright
        final KassenbonVerbessert kb3 = KassenbonVerbessert.createInstance(-666); // this will fail
    }

}

相关问题