2015-09-30 4 views
0

Мое задание - отформатировать форматированный строковый месяц # - NNNN (где знак # - значение поля monthNumber, а NNNN - значение поля monthName. Проблема в том, что когда я нажимаю getMonthName, он выходит на 'нуль'.Оператор Switch с пометками

Как это исправить?

public class Month { 
    // instance variables - replace the example below with your own 
    private int monthNumber; 
    private String monthName; 
    private String newMonthName; 

    /** 
    * Constructor for objects of class Month 
    */ 
    public Month(int input){ 
     if((input == 0) || (input > 12)){ 
      System.out.println("Error: Month number must be between 1 and 12"); 
     } 
     else if(input < 0){ 
      System.out.println("Error: Month number must be positive"); 
     } 
     else{ //the value of the input is valid 
      System.out.println("Month number is VALID"); 
     } 
     setMonthName(monthName); 
     printMonth(input); 
     monthNumber = input; 
    } 

    /** 
    * 
    */ 
    private void setMonthName(String monthName) 
    { 
     switch(monthNumber){ 
      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 = "Invalid month"; 
       break; 
     } 
    } 

    /** 
    * 
    */ 
    private void printMonth(int input) 
    { 
     switch(input){ 
      case 0: 
       System.out.println("Month " + input + " is not a month"); 
       break; 
      case 1: 
       System.out.println("Month " + input + " is January"); 
       break; 
      case 2: 
       System.out.println("Month " + input + " is February"); 
       break; 
      case 3: 
       System.out.println("Month " + input + " is March"); 
       break; 
      case 4: 
       System.out.println("Month " + input + " is April"); 
       break; 
      case 5: 
       System.out.println("Month " + input + " is May"); 
       break; 
      case 6: 
       System.out.println("Month " + input + " is June"); 
       break; 
      case 7: 
       System.out.println("Month " + input + " is July"); 
       break; 
      case 8: 
       System.out.println("Month " + input + " is August"); 
       break; 
      case 9: 
       System.out.println("Month " + input + " is September"); 
       break; 
      case 10: 
       System.out.println("Month " + input + " is October"); 
       break; 
      case 11: 
       System.out.println("Month " + input + " is November"); 
       break; 
      case 12: 
       System.out.println("Month " + input + " is December"); 
       break; 
      default: 
       System.out.println("Month " + input + "is an invalid month"); 
       break; 
     } 
    }  

    /** 
    * 
    */ 
    public int getMonthNumber() 
    { 
     return monthNumber; 
    } 

    /** 
    * 
    */ 
    public String getMonthName() 
    { 
     return monthName; 
    } 

} 

ответ

1

Извините, но вам кажется, назначить monthNumber только после вызова setMonthName().

Перестановка код в конструкторе:

monthNumber = input; 
    setMonthName(); 
    printMonth(input); 

Кроме того, в setMonthName(), присвоенное параметру, который из-за наличия такое же имя затмевает поле в классе. (Это хорошая идея включить предупреждение для вашей IDE). Удалите параметр с setMonthName(), тогда вы фактически установите поле в объекте.

private void setMonthName() 
{ 
    switch(monthNumber){ 
    [...] 
    } 
} 

Наконец, не связанные с проблемой вы спросили, я рекомендую изменения printMonth(int input) использовать поля в объекте, а не дублировать ваш переключатель заявление от setMonthName(). не

+0

Я пробовал это и все еще имел «нуль». – Prohew

+0

Ну, чтобы исправить себя во времени, String не совсем примитивный тип, но все же неизменный. – Victor

0

Задача 1.

monthName в методе setMonthName() нет то же самое, как полеmonthName в классе Month. При установке имени в методе поле по-прежнему равно нулю.

Задача 2.

monthNumber, который используется setMonthName() метод устанавливается после вызова этого метода. monthNumber будет всегда в этот момент, и вы всегда будете использовать предложение по умолчанию в своем коммутаторе.

Fix 1.

private void setMonthName(String monthName) 
{ 
    switch(monthNumber){ 
     case 1: 
      this.monthName = "January"; 
      break; 
     case 2: 
      this.monthName = "February"; 
      break; 
     ... 

Фикс 2.

monthNumber = input; 
setMonthName(monthName); 
printMonth(input); 

Резюме.

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

+0

Я не хочу понижать вас, но я серьезно думаю, что ваш аргумент «Проблема 1» недействителен. – Victor

+0

@ Victor, потому что это не аргумент, это факт. Предполагая, что ответ должен предоставить рабочий код без какого-либо дополнительного образования, является недопустимым. Следовательно, сводная направляющая для большей лекции. Меня не волнует, что меня проголосовали за то, что я чувствовала, что я что-то задумал и продвигаюсь в правильном направлении. Особенно в вопросах, освещающих основы языка. – zubergu

+0

Согласно официальной документации, https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html использование ключевого слова 'this' является полностью необязательным, если аргументы метода не имеют тех же имен, что и свойства класса. То есть вы можете назначать и получать доступ к членам из класса без ключевого слова 'this' по своему усмотрению. – Victor

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