2015-03-20 8 views
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

В целом, приложите отладчик и проверьте каждое из условий в длинном '' '' '' '' '' '' '' '' '' '' '' '. – Barett

ответ

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' 

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

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

this.date=date; 
+0

Получил! Большое спасибо за подробный ответ! – ArthurV

0
charAt(someIndex) 

возвращает символ не является Int. Вы должны проверить на

== '0' 
+0

dkatzel был немного быстрее, поэтому мой ответ - это дубликат. – Ria

+0

Спасибо вам! – ArthurV

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

Спасибо, я это помню! – ArthurV

+0

Я настоятельно рекомендую это рассмотреть. Вот еще один пример: http://www.mkyong.com/java/how-to-check-if-date-is-valid-in-java/ – IAbstract

Смежные вопросы