Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在子类的构造函数中引发异常_Java_Exception_Constructor - Fatal编程技术网

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

Java 在子类的构造函数中引发异常,java,exception,constructor,Java,Exception,Constructor,所以我的问题是我有一个类和它的子类 ->卡森班 ->类KassenbonVerbessert扩展了Kassenbon 在我的“Kassenbon”类中,我有一个构造函数: public Kassenbon(int max) { produkte = new String[max]; preise = new Integer[max]; } 然后我的子类的构造函数如下所示: public KassenbonVerbessert(int max)

所以我的问题是我有一个类和它的子类

->卡森班 ->类KassenbonVerbessert扩展了Kassenbon

在我的“Kassenbon”类中,我有一个构造函数:

   public Kassenbon(int max) {
        produkte = new String[max];
        preise = new Integer[max];
    }
然后我的子类的构造函数如下所示:

   public KassenbonVerbessert(int max) {
        super(max);
    }
我现在的问题是,我想检查参数max,如果它是负值,那么我想抛出一个异常,因为这意味着构造函数将创建两个长度为负值的数组,这是不可能的。但是仅仅因为super调用必须是构造函数中的第一个语句,我怎么做呢?!但我如何实施:

if(max < 0){
   throw new IllegalArgumentException("Error");
}
if(最大值<0){
抛出新的IllegalArgumentException(“错误”);
}

没有强制要求您将支票放入子类。您可以直接将检查放在父类的构造函数中。

首先,该检查在
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;
} 
public KassenbonVerbessert(int max){
超级(检查最大值(最大值));
}
私有静态int checkMax(int max){
如果(最大值<0){
抛出新的IllegalArgumentException(“max不能为负”);
}
返回最大值;
} 

当您无法将检查应用于父构造函数时,必须按照建议和方法内联检查。但您不必为此编写自己的方法,您可以为此目的:

public KassenbonVerbessert( int max ) 
{
    super( java.util.Objects.checkIndex( max, Integer.MAX_VALUE ) );
}
第二个参数是
max
的最大值,如果您还想提供上边框


当然,您可以为该方法添加静态导入:
import static java.util.Objects.checkIndex

除了@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];
    }

}


你为什么不把检查放在
Kassenbon
构造函数中呢?是的,我忘了提到我不能调整父类。非常感谢,这真的帮助了我。忘了提到我不能调整父类,所以我在超级调用中调用的另一个方法的解决方案是一个很好的解决方案。如果这个答案解决了你的问题,你可以选择哦,你的异常越详细越好。你以后会感谢你自己的。只需确保在异常中不包含密码和其他机密,因为在Java中,您无法完全控制异常处理的方式;它很容易受到外界的影响。
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
    }

}