Я не могу понять, почему мой код исключает исключение.. Я предполагаю, что что-то не так с конструктором, но я не вижу, где именно.
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);
}
}
Большое спасибо за помощь!
Причина, по которой вы выбрасываете исключение, - это ваш большой блок 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;
Использование 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");
}
charAt(someIndex)
возвращает char, а не int. Вы должны проверить
== '0'
if
подобном этому.