2016-05-24 2 views
0

Я пытаюсь создать программу, в которой пользователь вводит дату (любую дату), например 29-июл-1995. Программа должна соответствовать формату даты и проверять правильность даты или нет.Проверка календаря регулярного выражения

Вот мой код:

import java.util.*; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Review1_Main { 

public static Pattern pattern; 
public static Matcher matcher; 

// DATE_PATTERN is a format for user input 
private static final Pattern DATE_PATTERN = Pattern.compile("(0?[1-9]|[12][0-9]|3[01])-(^[a-zA-Z]+$)-((19|20)\\d\\d)"); 

// Date format validation 
public static boolean dateValidation(String date) { 

matcher = pattern.matcher(date); 

if(matcher.matches()) { 
    matcher.reset(); 

    if (matcher.find()) { 
    int day = 01; 
    String month = "Jan"; 
    int year = 2000; 

    if(day == 31 && !month.equals("Apr") || !month.equals("Jun") || 
        !month.equals("Sep") || !month.equals("Nov")) { 
     return false; 
    } else if(month.equals("Feb")) { 
     // LEAP year validation 
     if (year % 4 == 0) { 
     if (day == 30 || day == 31) { 
      return false; 
     } else { 
      return true; 
     } 
     } else { 
     if (day == 29 || day == 30 || day == 31) { 
      return false; 
     } else { 
      return true; 
     } 
     }// end of year % 4 
    } else { 
     return true; 
    }// end of day.equals 
    } else { 
    return false; 
    } // end of matcher.find 
} else { 
    return false; 
}// end of matcher.matcher 

} 

public static void main(String[] args) { 
    Scanner s = new Scanner(System.in); 
    String dateInput = "29-Jul-1995"; 
    dateValidation(dateInput); 
} 

} // end of class 

Но по какой-то причине, когда я пытаюсь скомпилировать его, я всегда получаю эту ошибку:

Exception in thread "main" java.lang.NullPointerException 
    at Review1_Main.dateValidation(Review1_Main.java:22) 
    at Review1_Main.main(Review1_Main.java:73) 

Где линия 22 является:

matcher = pattern.matcher(date); 

и строка 73:

dateValidation(dateInput); 

Извиняюсь за мою грамматику.

Спасибо.

+0

Вы используете Java 8, случайно? –

+0

@MichaelMarkidis да –

+0

Взгляните на https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html (это может сделать вашу жизнь намного проще). Множество примеров на SO также. –

ответ

2

Вы инициализируете pattern в конструкторе, но используете его в статическом методе dateValidation. Если вы не создали объект с использованием new перед вызовом метода, статическое поле не будет инициализировано (отсюда исключение нулевого указателя).

Решение превратить ваш шаблон в константу, а не компилировать его в конструкторе:

private static final Pattern DATE_PATTERN = Pattern.compile("..."); 

И затем использовать константу (а не pattern) для создания Matcher:

Matcher matcher = DATE_PATTERN.match(dateInput); 

Вам не нужны статические переменные или matcher.

Обратите внимание, что у вас действительно нет причин использовать статический метод. Лучше было бы назвать этот класс DateValidator и сделать метод проверки методом экземпляра. Шаблон все еще может быть константой.

+0

Еще получаю сообщение об ошибке, но ваш ответ фиксированная моя первая ошибка 'Исключение в потоке«основного»java.lang.NullPointerException в Review1_Main.dateValidation (Review1_Main.java:22) в Review1_Main.main (Review1_Main.java:73) ' –

+0

@ S.Anthony, предполагая, что ваш код теперь изменился, я никак не могу помочь с вашей новой ошибкой, поскольку я не знаю, какой код находится в строке 22. – sprinter

+0

. Неплохо, я обновил код и СПАСИБО. для вашей помощи –

-1

С Java 8:

String dateInput = "01-Feb-2016"; 

List<String> months = new ArrayList<String>(); 
months.add("Jan"); 
months.add("Feb"); 
months.add("Mar"); 
months.add("Apr"); 
months.add("May"); 
months.add("Jun"); 
months.add("Jul"); 
months.add("Aug"); 
months.add("Sep"); 
months.add("Oct"); 
months.add("Nov"); 
months.add("Dec"); 

boolean dateIsValid = true; 
try 
{ 
    String [] vals = dateInput.split("-"); 
    int day = Integer.parseInt(vals[0]); 
    int mon = months.indexOf(vals[1]) + 1; 
    int year = Integer.parseInt(vals[2]); 
    LocalDate.of(year, mon, day); 
} 
catch (DateTimeException e) 
{ 
    dateIsValid = false; 
} 
System.out.println("Date is valid: " + dateIsValid);