2016-02-04 149 views
0

我有這種方法,我驗證和ID,我得到一個問題。 ID必須遵循這些規則是有效的:簡單的方法驗證

  • 有6個字符究竟
  • 必須用A,E或P。

這裏開始的代碼:

public static String getCartId(String cartId) { 
    Boolean correctId = false; 

    while (!correctId) { 
     cartId = JOptionPane.showInputDialog("Type the Cart ID:"); 
     cartId = cartId.trim(); 
     cartId = cartId.toUpperCase(); 
     char c = cartId.charAt(0); 

     // VALIDATION 
     if (cartId.length() != 6) 
      JOptionPane.showMessageDialog(null, "Cart ID must have only 6 chars, type it again."); 
     else if (c != 'A' || c != 'E' || c != 'P') 
      JOptionPane.showMessageDialog(null, "Invalid Cart ID, type it again."); 
     else 
      correctId = true; 
    } 
    return cartId; 
} 

如果我輸入,比方說,aaaaaa,它最終說這個ID是無效的。

任何錯誤的想法?

+1

沒有,根據您的規格'aaaaaa'以小寫'a'開始,它不在'A','E'或'P'的允許集合中。 – hotzst

+1

但在得到第一個字母之前,我把方法放在了UUpperCase()中,變量c正在存儲'A' – sanjuro8998

+0

你測試我的答案了嗎? – Abdelhak

回答

5

嘗試更換此:

else if (c != 'A' || c != 'E' || c != 'P') 

隨着使用&&代替||這樣的:

else if (c != 'A' && c != 'E' && c != 'P') 
+0

謝謝,它現在完美工作...我仍然在學習Java我認爲使用OR會有意義,而不是使用AND,但使用&&像魅力一樣工作,仍然需要學習一些邏輯呵呵,謝謝! – sanjuro8998

-1

你整個字符串轉換爲大寫您要驗證的第一個字母之前。所以,如果你輸入AAAAAA你會試圖驗證AAAAAA

+0

我將全部轉換爲大寫,然後我將第一個字母存儲在變量c中,因此變量c具有字母'A',然後驗證,這不正確嗎?對不起還在學習Java – sanjuro8998

+0

這取決於你是否希望你的驗證區分大小寫。如果你不在乎,並且希望aaaaaa和AAAAAA都能夠作爲輸入傳遞,那就完全沒問題。 – OhDearMoshe

1

我相信,這將更好地爲您使用正則表達式是這樣的:

if (cartId.matches("(?s)([AEP]{1}[A-Z0-9]{5})")) { 
...} 
+0

是否有可能有這樣的兩個驗證,一個是長度和一個是第一個字母?我想告訴用戶這個ID有什麼問題:-) – sanjuro8998

+0

你可以在regexp修改之前檢查字符串長度,如果你需要的話,它不受限制)) – Dante

+0

無論如何,在這裏使用regexp會更舒適,因爲你不需要char變量,並且不必檢查多個參數。例如,今天你的ID必須以A,E或P開頭,如果明天信件數量增加,你的if語句可能會變得龐大......等等 – Dante

1

這種情況正在發生的,該||短路運營商。 Read this

在你的情況

​​

這裏c != 'A'返回。因此它會檢查下一個條件c != 'E',它將返回true,因此它會將您的標識設置爲無效。

嘗試與取代它彷彿& &

else if (c != 'A' && c != 'E' && c != 'P') 

或者如果你想嘗試另一種方法,只是谷歌關於使用正則表達式,並使用[ACP] .....作爲正則表達式。它會將你的代碼減少到兩行驗證。

+0

感謝您的解釋,現在它對我有意義:-) – sanjuro8998

+0

我已經標記答案完成較早,但當然,你的是upvoted,幫了我很多! – sanjuro8998

1

您已經使用

(c != 'A' || c != 'E' || c != 'P') 

這是不正確的。

根據您的要求,您希望如果c不等於A或E或P, 只有它應該將其打印爲無效。但是什麼||確實如此,如果任何一個給定的條件爲真,它就會返回true。這意味着如果c ='A',第一個條件是錯誤的,但其他兩個條件是真的,所以整個if語句的值返回爲true。 通過

(c != 'A' && c != 'E' && c != 'P') 

替換它將幫助,因爲它只有當所有的條件都爲真,則返回true。所以如果c ='A',第一個條件是錯誤的,這將返回false到整個if語句。 希望你明白我的觀點。

+0

非常感謝,我後來才明白它,仍然在學習Java,感謝您的幫助! – sanjuro8998