我有一个验证方法,我必须逐个检查条件,然后相应地抛出错误消息。
为实现这一点,我使用多个if语句,如果所有条件都为false,我应该执行一个任务。
这是我的代码:
if(s1.equals("") || s2.equals("") || s3.equals("") || s4.equals("") || s5.equals("") || s6.equals(""))
Toast.makeText(getApplicationContext(),"Enter all Details first", Toast.LENGTH_SHORT).show();
if(!s5.matches("[A-Za-z0-9]+"))
e5.setError("Username cannot contain special characters");
if(s5.length()<6)
e5.setError("Username must be a minimum of 6 characters.");
if(!(s3.contains("@")&& s3.contains(".")))
e3.setError("Enter a valid Email Id");
if(!s6.equals(s7))
e7.setError("Passwords dont match");
if(s2.length()!=10)
e2.setError("Please enter a valid 10 digit number");
else
{
Validate v2=new Validate();
v2.store_values(s1,s2,s3,s4,s5,s6,s8);
v2.execute();
}
问题是else语句只与最后一个if语句相关联,而前面的5个if语句独立工作。
请注意,我无法使用else-ifs,因为所有字段都应经过验证 - 例如,即使s3
无效,仍必须验证s6
。因此,无论评估为多少,都必须评估所有if语句。
我该如何解决这个问题?
答案 0 :(得分:4)
多个if语句与同一个else语句关联的唯一方法是使用if-else-if...else
,这不是你需要的,因为你想要评估所有的if语句,{{1} }只会评估if语句,直到将其评估为true。
相反,您可以使用标记输入为无效的标志(布尔变量),并使用它而不是else语句来确定输入是否有效。
if-else-if...else
答案 1 :(得分:2)
在所有if
语句中设置布尔标志。如果发生错误,请将其设置为true
。
然后,将else
段替换为另一个if
语句,该语句仅在您声明的布尔标志为false时执行。
答案 2 :(得分:0)
您正在使用通用数据类型(String
)来存储数据值受某些要求约束的数据。它降低了代码的可维护性。
更好的方法是创建存储数据的数据类型。然后,该数据类型将具有您可以使用的其他验证逻辑,例如通过使用逻辑来拒绝将该数据类型的值设置为违反您的规范的值。
这种数据类型的例子是Password
。 Password password = new Password("abcd");
然后可以抛出异常,因为您的规范声明密码长度必须为5个或更多字符。此外,您可以通过让构造函数在验证后立即对其进行哈希来确保密码仅作为纯文本在内存中存在很短的持续时间。
如果您使用的是Java EE,请参阅javax.validation.Validator了解另一种方法。