2014-10-06 33 views
0

我無法讓我的開關工作。我得到一個不可編譯的源代碼Date.java:75。此外,當程序返回結果時 - 我希望它還會返回MONTH NAME DD,YYYY以及我已經做的MM/DD/YYYY。如果你能指出我正確的方向,我會很感激。Java開關不工作

import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Scanner; 

public class Date { 

private GregorianCalendar date = null; 

private String[] months = new String[]{ "january", "february", "march", "april", "may", 
           "june", "july", "august", "september", "october", "november", "december" }; 



public Date(int month, int day, int year) { 

    date = new GregorianCalendar(year, month-1, day); 

} 

public Date(String month, int day, int year) { 

    date = new GregorianCalendar(year, this.getMonth(month), day); 

} 



public Date(int dayOfYear, int year) { 

    date = new GregorianCalendar(); 

    date.set(Calendar.DAY_OF_YEAR, dayOfYear); 

    date.set(Calendar.YEAR, year); 

} 


private int getMonth(String month) { 

    for (int i=0; i<months.length; ++i) 

     if (month.toLowerCase().equals(months)) //equals(months)) 

     return i; 

    return 0; 

} 

public String toString() { 

    return date.get(Calendar.MONTH)+1 + "-" + date.get(Calendar.DATE) + "-" + date.get(Calendar.YEAR); 

} 



public static void main(String[] args) { 

    int mo; 
    int dy; 
    int yr; 
    String moo; // Month name string 

    boolean wrongInput = false; 
    do { 
     Scanner input = new Scanner(System.in); // scanner to read input 
     wrongInput = false; 
     int menu = input.nextInt(); // menu selection 

      System.out.printf("Enter 1 for format: MM/DD/YYYY \n"); 
      System.out.printf("Enter 2 for format: Month DD,YYYY \n");  
      System.out.printf("Enter 3 to exit \n"); 
      System.out.printf("Choice:"); 


    switch(menu) 
    { 
     case '1' : // MM/DD/YYYY UI 
     System.out.printf("Enter Month (1-12): "); 
     mo = input.nextInt(); 
     System.out.printf("Enter Day of Month: "); 
     dy = input.nextInt(); 
     System.out.printf("Enter Year: "); 
     yr = input.nextInt(); 

     Date a = new Date(mo, dy, yr); //chew 
     System.out.println(a); //spit 
      break; 

     case '2' : // Month DD,YYYY UI 
     System.out.printf("Enter Month name: "); 
     moo = input.next(); 
     System.out.printf("Enter Day of Month: "); 
     dy = input.nextInt(); 
     System.out.printf("Enter Year: "); 
     yr = input.nextInt(); 

     Date b = new Date(moo, dy, yr); //chew 
     System.out.println(b); //spit 
      break; 

     case '3' : // EOP 
     System.exit(0); 
      break; 

     default: 
     System.out.println("Invalid selection."); 
     wrongInput = true; 
      break; 
     } 
    while(wrongInput); 
    } 

回答

6

您正在傳遞整數並檢查字符。 1int'1'是java中的字符。

在你的代碼menuintchar所以你的情況應該是case 1:,而不是case '1':

因此改變你的switch

switch(menu){ 
     case 1: 
     //Your code 
     break; 

     case 2: 
     //Your code 
     break; 
     //..And so on 
    } 

眼下字符'1','2'..ASCII值與傳遞int值進行比較作爲menu這顯然不會等於ASCII char的值爲81,而82'2',所以在這種情況下它完全沒用。

+0

我作出改變,但是我仍然收到線程錯誤異常「主」了java.lang.RuntimeException:不可編譯源代碼 - 在解析時達到了文件結尾 \t at date.Date.main(Date.java:75) – Joe 2014-10-06 16:48:51

3

您正在檢查字符'1','2'等。請嘗試只是數字。例如。

case 1: 
//do this 
break; 
1

的問題是,在你的switch您切換一個整數,但你必須字符定義單例。 (Chars總是用''標出)。這不會立即引發編譯錯誤的原因是java中的char被保存爲一個正常的整數。你甚至可以用chars進行數學運算。因此,交換機會將整數menu與等於'1','2'的整數進行比較,依此類推。這可以工作,但由於某種原因,char'0'的整數值爲40(或41?)。因此,如果您將menu設置爲40(41?),則會觸發case '1':

爲了避免這個只需將代碼從case '1':case '2':變化等方面case 1:case 2:`等

+0

儘管其他awnsers都完全正確,但我只是想說明爲什麼代碼的行爲如此。 :) – Gumbo 2014-10-06 17:42:05