Выбрасывание пользовательского исключения NumberFormatException в Java

#java #throw #numberformatexception

#java #выбрасывать #исключение numberformatexception

Вопрос:

Я пытаюсь создать свое собственное исключение NumberFormatException при преобразовании строки month в целое число. Не уверен, как создать исключение. Будем признательны за любую помощь. Нужно ли мне добавлять try-catch перед этой частью кода? У меня уже есть одно в другой части моего кода.

 // sets the month as a string
mm = date.substring(0, (date.indexOf("/")));
// sets the day as a string
dd = date.substring((date.indexOf("/"))   1, (date.lastIndexOf("/")));
// sets the year as a string
yyyy= date.substring((date.lastIndexOf("/")) 1, (date.length()));
// converts the month to an integer
intmm = Integer.parseInt(mm);
/*throw new NumberFormatException("The month entered, "   mm  is invalid.");*/
// converts the day to an integer
intdd = Integer.parseInt(dd);
/* throw new NumberFormatException("The day entered, "   dd   " is invalid.");*/
// converts the year to an integer
intyyyy = Integer.parseInt(yyyy);
/*throw new NumberFormatException("The yearentered, "   yyyy   " is invalid.");*/
  

Комментарии:

1. Что происходит с кодом, который вы закомментировали?

2. @Thom Я получаю сообщение о недоступности для любого кода после броска.

3. Я удалил инструкции throw и добавил свою собственную строку в то место, где я ранее перехватывал исключение в своем коде.

Ответ №1:

что-то вроде этого:

 try {
    intmm = Integer.parseInt(mm);
catch (NumberFormatException nfe) {
    throw new NumberFormatException("The month entered, "   mm  " is invalid.");
}
  

Или, немного лучше:

 try {
    intmm = Integer.parseInt(mm);
catch (NumberFormatException nfe) {
    throw new IllegalArgumentException("The month entered, "   mm  " is invalid.", nfe);
}
  

РЕДАКТИРОВАТЬ: Теперь, когда вы обновили свой post, похоже, что вам на самом деле нужно что-то вроде parse(String) SimpleDateFormat

Комментарии:

1. Второй пример хорош тем, что он объединит исключения в цепочку, так что вы можете видеть, что причиной недопустимых аргументов было исключение числового формата.

2. @unbeli Я удалил инструкции throw и добавил свою собственную строку в то место, где я ранее перехватывал исключение в своем коде. catch (исключение NumberFormatException NFE) { System.out.println(NFE.GetMessage() «имеет нечисловой ввод в записи»);} Спасибо за ваш вклад

Ответ №2:

 try {
   // converts the month to an integer
   intmm = Integer.parseInt(mm);
} catch (NumberFormatException e) {
  throw new NumberFormatException("The month entered, "   mm  " is invalid.");
}
  

Комментарии:

1. Да, вы правы, потому что if вызвало исключение RuntimeException … Но в этом контексте вероятность невелика. Однако вы правы.

2. Я удалил инструкции throw и добавил свою собственную строку в то место, где я ранее перехватывал исключение в своем коде. catch (исключение NumberFormatException NFE) { System.out.println(NFE.GetMessage() «имеет нечисловой ввод в записи»);} Спасибо за ваш вклад!

Ответ №3:

Integer.parseInt() уже создает исключение NumberFormatException. В вашем примере кажется более уместным выбрасывать исключение IllegalArgumentException:

 int minMonth = 0;
int maxMonth = 11;
try 
{
    intmm = Integer.parseInt(mm);
    if (intmm < minMonth || intmm > maxMonth) 
    {
      throw new IllegalArgumentException
      (String.format("The month '%d' is outside %d-%d range.",intmm,minMonth,maxMonth));
    }
}
catch (NumberFormatException nfe) 
{
  throw new IllegalArgumentException
  (String.format("The month '%s'is invalid.",mm) nfe);
}
  

Комментарии:

1. Я удалил инструкции throw и добавил свою собственную строку в то место, где я ранее перехватывал исключение в своем коде. catch (исключение NumberFormatException NFE) { System.out.println(NFE.GetMessage() «имеет нечисловой ввод в записи»);} Спасибо за ваш вклад