如何解决必须在第一行放置超级构造函数的限制?

How do I get around the limitation of having to place super constructor in the first line?

   public NoWheelsException(Car[] carArray){
        String holder = "";
        for (int i=0; i<carArray.length; i++) {
            if (i == carArray.length - 1) {
                holder = holder + carArray[i].name;
            }else{
                holder = holder + carArray[i].name + ", ";
            }
        }
        String message = holder + " has/have no wheels.";
        super(message);
    }

上面写的是我的代码的理想场景,最后是超级构造函数。虽然,由于 super 必须是第一个语句,但我无法弄清楚如何从数组内联中开发字符串。我不能直接使用 .toString(),因为字符串的外观有一定的标准。除了这个琐碎的细节之外,我已经设法弄清楚了与异常有关的所有内容。任何帮助将不胜感激!

更新

有人建议我尝试 Strin.join 以便 link 它们在一起,尽管不幸的是对象引用名称与数组对象中的名称变量不同...

一种方法是创建私有静态方法,因为静态方法的存在与构造函数和实例化无关:

public NoWheelsException(Car[] carArray){
    super(buildMessageFrom(carArray));
}


private static String buildMessageFrom(Car[] cars) {
    StringBuilder message = new StringBuilder();

    String separator = "";
    for (Car car : cars) {
        message.append(separator);
        message.append(car.name);
        separator = ", ";
    }

    return message.toString();
}

(在循环中构建字符串时,StringBuilder 比字符串连接更有效。'holder = holder + …' 的每次迭代都会创建一个新的 String 对象,最终需要进行垃圾回收。)

如果您熟悉 Streams,您可以在一行中完成所有操作:

public NoWheelsException(Car[] carArray){
    super(Arrays.stream(carArray).map(c -> c.name).collect(Collectors.joining(", ")));
}