В какой-то момент вы должны спросить себя: в какой момент программа ДОЛЖНА создавать sh, а не пытаться решить проблемы? Иногда лучше, если программа завершает работу, потому что она не может правильно работать, если критический параметр имеет недопустимое значение.
Вы можете просто объявить, что метод main вызывает исключение AgeException, но программа все равно sh, потому что любое необработанное исключение завершает программу. Если вы хотите убедиться, что программа продолжает работать, вы должны обработать все объявленные исключения.
Кроме того, то, что вы здесь делаете, кажется мне очень неправильным:
public static main(String[] args)
{
try
{
Person p = new Person("SwagiWagi", 18);
}
catch (AgeException ex)
{
int age = -18;
if (age < 0)
{
age = 18;
}
try
{
Person p = new Person("SwagiWagi", 18);
}
catch (AgeException ex)
{
System.out.println("This does not look right.");
}
}
}
При первой попытке блок, который вы хотите поймать неверный ввод от пользователя или любой другой параметр, который дает параметр для объекта Person. И в блоке catch вы пытаетесь «исправить» эти входные данные и проверить это с помощью ДРУГОГО блока try-catch для ТОГО ЖЕ исключительного случая.
Независимо от того, что изначально было передано, ошибочный параметр должен делать это правильно с самого начала. Обработка исключений должна использоваться скорее как способ обнаружения проблем во время выполнения, а не как их исправление.
Если есть способ просто исправить проблему, например, попросить пользователя снова ввести правильное значение, вы должны Конечно, делать это, но это может быть сделано без исключений. Если это невозможно, например, если аргумент передается какой-либо другой программой или потоком, который вы не можете контролировать, то это невозможно, поэтому программа должна выполнить sh.
.