2016-03-03 2 views
2

У меня есть моя программа, и у меня есть правильный вывод ТОЛЬКО, если я ввожу одно из правильных целочисленных значений. Я не уверен, как исправить это, как если бы я добавил другое значение. Я просто получу «Invalid Input» (который я разместил в своем коде), но месяц будет по-прежнему неверно введенным целым числом. Мне нужно знать, как исправить эту проблему в моей программе.Объектно-ориентированное программирование с использованием пользовательского ввода

import java.util.Scanner; 

public class whichMonth { 

    public static void main(String args[]){ 

     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter the month name or number: "); 
     int monthNumber = input.nextInt(); 


     // set up variable access to the class 
     AnyMonth inputMonthNumber = new AnyMonth(); 

     // set the month number from user input 
     inputMonthNumber.setMonthnum(monthNumber); 

     // get the month name from user input number 
     String monthName = inputMonthNumber.getMonthName(monthNumber); 

     // print out the month number and month name 
     System.out.println("The month number is: " + inputMonthNumber.getMonthnum(monthNumber) 
       + "\nThe month name is: " + inputMonthNumber.getMonthName(monthNumber)); 
    } 
} 

class AnyMonth { 

    int Monthnum; 
    String monthName; 

    public AnyMonth() { 

     Monthnum = 1; 
    } 
    public AnyMonth(int currentMonthNumber) { 

     Monthnum = currentMonthNumber; 

     switch(currentMonthNumber) { 
     case 1: 
      Monthnum = 1; 
      monthName = "January"; 
      System.out.println("January"); 
      break; 
     case 2: 
      Monthnum = 2; 
      monthName = "February"; 
      System.out.println("February"); 
      break; 
     case 3: 
      Monthnum = 3; 
      monthName = "March"; 
      System.out.println("March"); 
      break; 
     case 4: 
      Monthnum = 4; 
      monthName = "April"; 
      System.out.println("April"); 
      break; 
     case 5: 
      Monthnum = 5; 
      monthName = "May"; 
      System.out.println("May"); 
      break; 
     case 6: 
      Monthnum = 6; 
      monthName = "June"; 
      System.out.println("June"); 
      break;   
     case 7: 
      Monthnum = 7; 
      monthName = "July"; 
      System.out.println("July"); 
      break;   
     case 8: 
      Monthnum = 8; 
      monthName = "August"; 
      System.out.println("August"); 
      break;   
     case 9: 
      Monthnum = 9; 
      monthName = "September"; 
      System.out.println("September"); 
      break;   
     case 10: 
      Monthnum = 10; 
      monthName = "October"; 
      System.out.println("October"); 
      break; 
     case 11: 
      Monthnum = 11; 
      monthName = "November"; 
      System.out.println("November"); 
      break; 
     case 12: 
      Monthnum = 12; 
      monthName = "December"; 
      System.out.println("December"); 
      break; 
     default: 
      Monthnum = 1; 
      monthName = "January"; 
     } 

    } 

    public AnyMonth(String userMonthName) { 

     switch(userMonthName) { 
     case "January": 
      Monthnum = 1; 
      monthName = "January"; 
      System.out.println("January"); 
      break; 
     case "February": 
      Monthnum = 2; 
      monthName = "February"; 
      System.out.println("February"); 
      break; 
     case "March": 
      Monthnum = 3; 
      monthName = "March"; 
      System.out.println("March"); 
      break; 
     case "April": 
      Monthnum = 4; 
      monthName = "April"; 
      System.out.println("April"); 
      break; 
     case "May": 
      Monthnum = 5; 
      monthName = "May"; 
      System.out.println("May"); 
      break; 
     case "June": 
      Monthnum = 6; 
      monthName = "June"; 
      System.out.println("June"); 
      break;   
     case "July": 
      Monthnum = 7; 
      monthName = "July"; 
      System.out.println("July"); 
      break;   
     case "August": 
      Monthnum = 8; 
      monthName = "August"; 
      System.out.println("August"); 
      break;   
     case "September": 
      Monthnum = 9; 
      monthName = "September"; 
      System.out.println("September"); 
      break;   
     case "October": 
      Monthnum = 10; 
      monthName = "October"; 
      System.out.println("October"); 
      break; 
     case "November": 
      Monthnum = 11; 
      monthName = "November"; 
      System.out.println("November"); 
      break; 
     case "December": 
      Monthnum = 12; 
      monthName = "December"; 
      System.out.println("December"); 
      break; 
     default: 
      Monthnum = 1; 
      monthName = "January"; 

     }  

    } 

    public void setMonthnum (int userMonth) { 

     Monthnum = userMonth; 

     if (userMonth < 1 || userMonth > 12){ 
     System.out.println("Invalid input"); 
     this.Monthnum = userMonth; 
     } 

    } 

    public int getMonthnum(int currentMonthNumber) { 

     Monthnum = currentMonthNumber; 

     return currentMonthNumber; 

    } 

    public String getMonthName(int currentMonthName) { 

     Monthnum = currentMonthName; 
     // use swtich-case here instead, default case should return 1/Jan 
     switch(currentMonthName) { 
     case 1: 
      monthName = "January"; 
      break; 
     case 2: 
      monthName = "February";; 
      break; 
     case 3: 
      monthName = "March"; 
      break; 
     case 4: 
      monthName = "April"; 
      break; 
     case 5: 
      monthName = "May"; 
      break; 
     case 6: 
      monthName = "June"; 
      break;   
     case 7: 
      monthName = "July"; 
      break;   
     case 8: 
      monthName = "August"; 
      break;   
     case 9: 
      monthName = "September"; 
      break;   
     case 10: 
      monthName = "October"; 
      break; 
     case 11: 
      monthName = "November"; 
      break; 
     case 12: 
      monthName = "December"; 
      break; 
     default: 
      monthName = "January"; 

     } 
     return monthName; 
    } 

    public String toString(String monthNameToString){ 

     monthName = monthNameToString; 

     return monthNameToString; 

    } 

    public boolean equals(int month) { 

     if (Monthnum == month) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    public boolean greaterThan(int month) { 

     if (Monthnum > month) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    public boolean lessThan(int month) { 

     if (Monthnum < month) { 
      return true; 
     } 
     else { 
      return false; 
     } 

    } 

} 
+0

Вы получаете значение целочисленного объявления пользователя. Он не принимает строковые значения, если вы используете '.nextInt()' – VVN

ответ

2

Итак, чтобы начать, ваш код будет принимать только в междунар из-за использования

nextInt(); 

используется (как указано ВВН).

int monthNumber = input.nextInt(); 

Ваш выход запрашивает имя месяца или номер, но ваша программа будет принимать только число.

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

В вашем методе setMonthnum() вы по-прежнему устанавливаете переменную Monthnum.

if (userMonth < 1 || userMonth > 12){ 
    System.out.println("Invalid input"); 
    this.Monthnum = userMonth; 
    } 

Таким образом, ваша программа будет использовать любое неправильное значение int и будет продолжена с выполнением. Месяц января будет начать отображаться в виде строки коды

String monthName = inputMonthNumber.getMonthName(monthNumber); 

происходит через коммутатор заявление ищет неверный номер/ввод. Он не находит соответствия и использует случай по умолчанию в январе.

default: 
    monthName = "January"; 

Если вы хотите, чтобы исправить это, вы должны добавить некоторую форму ввода ловушки, чтобы побудить пользователя для другого номера/ввода, как их предыдущий недействителен. Если вы не хотите запрашивать дополнительный ввод и просто завершите выполнение:

System.exit(0); 

Остановите выполнение без каких-либо ошибок. Тем не менее, я бы предложил добавить некоторую форму входной ловушки для управления этим. Кроме того, если вы хотите, чтобы на начальном входе принимались месячные имена, вы можете использовать

nextLine(); 

over nextInt. Это позволит вам взять строку ввода в виде строки. Оттуда вы можете определить, был ли введен вход или номер месяца и действовать соответственно (parseInt/use month name).

+0

Да, хорошо объяснено. – VVN

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