Я неохотно использую RuntimeExceptions, потому что это приводит к короткому замыканию встроенного механизма принудительного выполнения всех исключений где-либо.Да, на вашем объекте King исключение не должно произойти, это внутренняя ошибка кодирования, поэтому RuntimeException, возможно, уместно.Но это явно не относится к вашему объекту Piece.
Раздражающее правило Java о том, что super () должен быть первым оператором, не позволяет перехватить ошибку в конструкторе King.
АльтернативаВ некоторых программах я использовал для перемещения весь код конструктора в обычную функцию, а затем чтобы конструктор вызывал эту функцию.Как:
public class Piece
{
public Piece(String name) throws EmptyStringException
{
initPiece(name);
}
// Protect so outsiders must use legal constructors
protected Piece()
{
// nop
}
protected void initPiece(String name) throws EmptyStringException
{
if (name.length()==0)
throw new EmptyStringException();
pieceName=name;
}
}
public class King extends Piece
{
public King(boolean white)
{
try
{
initPiece("King");
}
catch (EmptyStringException panic)
{
throw new RuntimeException(panic.toString()); // should never happen
}
}
}
Другими словами, избегайте необходимости называть супер.Вызовите что-нибудь еще, чтобы выполнить инициализацию.Тогда специальные правила о супер не применяются.
Другой вариант - создать фабричный метод для Кинга, а не конструктор.Скажите:
public class Piece
{
public Piece(String name) throws EmptyStringException
{
if (name.length()==0)
throw new EmptyStringException();
pieceName=name;
}
public Piece makeKing(boolean white)
{
try
{
return new Piece("King");
}
catch (EmptyStringException e)
{
throw new RuntimeException(e.toString()); // won't ever happen
}
}
}
Если Кингу действительно нужен собственный класс, вы все равно можете сделать это выше, это та же концепция.