为什么我不能在子类构造函数中添加额外的参数验证?

Mag*_*nus 0 java validation constructor abstract superclass

我有两节课.超类:

public abstract class Question(){

public Question(String question, String answer, String... alts){...
}
Run Code Online (Sandbox Code Playgroud)

而子类:

public class StringOptionsQuestion extends Question {

public StringOptionsQuestion(String question, String answer, String... alts){
    if (alts.length == 0){throw new IllegalArgumentException();} //The compiler doesn't like this line.
    super(question, answer, alts);
}}
Run Code Online (Sandbox Code Playgroud)

我希望我的子类,在它传递给超类的构造函数之前StringOptionsQuestion验证其长度alts.但是,我不能这样做.我得到错误"构造函数调用必须是构造函数中的第一个语句".为什么会出现此错误?我怎么能绕过它呢?

Jon*_*eet 5

正如kocko所说,该super语句必须是构造函数中的第一个语句.但是,如果你确实真的,在验证之前真的不希望得到超级构造函数(例如因为它会破坏一个不太有用的错误),你可以在评估superconstructor的参数时进行验证:

public class StringOptionsQuestion extends Question {

    public StringOptionsQuestion(String question, String answer, String... alts) {
        super(question, answer, validateAlternatives(alts));
    }

    private static String[] validateAlternatives(String[] alternatives) {
        if (alternatives.length == 0) { 
           throw new IllegalArgumentException();
        }
        return alternatives;
    }
}
Run Code Online (Sandbox Code Playgroud)