Где я не прав? (Обработка исключений)

1

Я не могу понять, почему мой код исключает исключение.. Я предполагаю, что что-то не так с конструктором, но я не вижу, где именно.

public class OrderDate 
{
    private String date;

    public OrderDate(String date) throws IllegalDateFormatException
    {   
        IllegalDateFormatException wrongDate = 
                new IllegalDateFormatException("Date must have the following"
                                                        + " format: dd/mm/yy");
        if(date.length() > 8        
                || (date.charAt(0) == 0 && date.charAt(1) == 0)
                || (date.charAt(3) == 0 && date.charAt(4) == 0)
                || (date.charAt(0) == 3 && date.charAt(1) > 1)
                || (date.charAt(3) == 1 && date.charAt(4) > 2)                
                ||  date.charAt(2) != '/'
                ||  date.charAt(5) != '/'
                ||  date.charAt(0) > 3
                ||  date.charAt(3) > 1
                ||  !isDigit(date.charAt(0))
                ||  !isDigit(date.charAt(1))
                ||  !isDigit(date.charAt(3))
                ||  !isDigit(date.charAt(4))                        
                ||  !isDigit(date.charAt(6)) 
                ||  !isDigit(date.charAt(7)))                        

            throw wrongDate;
        else
            this.date = date;
    }

    private boolean isDigit(char z)
    {
        return z >= '0' && z <= '9';
    }
}

В основном методе я использую следующее:

    try
    {
        OrderDate myDate = new OrderDate("10/02/15");
        System.out.println("all fine");
    }

    catch(Exception e)
    {
        System.out.println(e);
        System.exit(0);
    }

И класс исключения:

public class IllegalDateFormatException extends Exception
{
    public IllegalDateFormatException(String error) 
    {
        super(error);
    }
}

Большое спасибо за помощь!

  • 0
    В общем, присоедините отладчик и протестируйте каждое из условий в длинном операторе if подобном этому.
Теги:
exception

3 ответа

7

Причина, по которой вы выбрасываете исключение, - это ваш большой блок if/else, в котором есть ошибка.

(date.charAt(0) == 0 && date.charAt(1) == 0)
            || (date.charAt(3) == 0 && date.charAt(4) == 0)
            || (date.charAt(0) == 3 && date.charAt(1) > 1)
            || (date.charAt(3) == 1 && date.charAt(4) > 2)
     ...
            || date.charAt(0) > 3
            ||  date.charAt(3) > 1

string.charAt(in) возвращает символ. вы проверяете, являются ли значения int. Поскольку символы могут быть представлены как целочисленные значения (например, значение ASCII и т.д.), Выражения, такие как date.charAt(1) > 1, всегда будут истинными, поскольку печатные символы начинаются как значение ASCII 32

Измените его на одинарные кавычки

(date.charAt(0) == '0' && date.charAt(1) == '0')
            || (date.charAt(3) == '0' && date.charAt(4) == '0')
            || (date.charAt(0) == '3' && date.charAt(1) > '1')
            || (date.charAt(3) == '1' && date.charAt(4) > '2')
            ...
            || date.charAt(0) > '3'
            ||  date.charAt(3) > '1'

На незаметном примечании не рекомендуется создавать объект Exception перед проверкой состояния. Создание исключений может быть дорогостоящим, поэтому не теряйте процессорное время, если вам не нужно его бросать. Это лучше:

 if(date.length() > 8 ...){
     throw new IllegalDateFormatException("Date must have the following"
                                                    + " format: dd/mm/yy");
 }

 this.date=date;
  • 0
    Понял! Большое спасибо за подробный ответ!
4

Использование Simpledateformat может сделать вашу жизнь намного проще.

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yy");
    try {
        Date date = simpleDateFormat.parse("15/02/99");
    } catch (ParseException e) {
        throw IllegalDateFormat("Date must have the following format: " +
                "dd/mm/yy");
    }
  • 0
    Спасибо, я учту это!
  • 0
    Я настоятельно рекомендую рассмотреть это. Вот еще один пример: mkyong.com/java/how-to-check-if-date-is-valid-in-java
0
charAt(someIndex) 

возвращает char, а не int. Вы должны проверить

== '0'
  • 0
    dkatzel был немного быстрее, поэтому мой ответ дубликат.
  • 0
    В любом случае, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню