2016-02-04 108 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