【问题标题】:Can multiple if statements be associated with a single else clause without using else-if?多个 if 语句可以与单个 else 子句相关联而不使用 else-if 吗?
【发布时间】:2016-04-05 08:46:18
【问题描述】:

我有一个验证方法,我必须逐个检查条件,然后相应地抛出错误消息。

为了实现这一点,我使用了多个 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 语句,无论有多少被评估为真。

我该如何解决这个问题?

【问题讨论】:

  • String 有一个方法 isEmtpy() 是你的第一个 if 更自然的选择
  • e2e3等是什么类型?他们有没有一种方法可以用来检查是否设置了错误?
  • @ErickG.Hagstrom e1,e2 属于 Android 平台的 EditTexts 类型。他们有用于抛出错误的 setError 方法

标签: java if-statement


【解决方案1】:

将多个 if 语句与同一个 else 语句关联的唯一方法是使用 if-else-if...else,这不是您需要的,因为您希望评估所有 if 语句,而 if-else-if...else 将评估if 语句仅在一个被评估为真之前。

相反,您可以使用标志(布尔变量)将输入标记为无效,并使用它代替 else 语句来确定输入是否有效。

boolean valid = true;

if(s1.equals("") || s2.equals("") || s3.equals("") || s4.equals("") || s5.equals("") || s6.equals("")) {     
    Toast.makeText(getApplicationContext(),"Enter all Details first", Toast.LENGTH_SHORT).show();    
    valid = false;
}   
if(!s5.matches("[A-Za-z0-9]+")) {    
    e5.setError("Username cannot contain special characters");  
    valid = false;
} 
if(s5.length()<6) {
    e5.setError("Username must be a minimum of 6 characters.");
    valid = false;
} 
if(!(s3.contains("@")&& s3.contains("."))) {
    e3.setError("Enter a valid Email Id");    
    valid = false;
}   
if(!s6.equals(s7)) {
    e7.setError("Passwords dont match");
    valid = false;
} 
if(s2.length()!=10) {     
    e2.setError("Please enter a valid 10 digit number");
    valid = false;
} 
if (valid) {
    Validate v2=new Validate();
    v2.store_values(s1,s2,s3,s4,s5,s6,s8);
    v2.execute();
}

【讨论】:

  • 每个 if 后面都应该是else {valid=false;}
  • @Pétur 某些输入无效时条件为真,因此valid=false; 不应出现在 else 语句中。
  • 非常感谢先生。但我想知道是否有任何这样的结构可以在不使用布尔变量的情况下实现这一点。
  • @SouravKanta 没有。将多个 if 语句与同一个 else 语句关联的唯一方法是使用 if-else-if..-else,这不是您所需要的,因为您希望评估所有 if 语句。
【解决方案2】:

您正在使用通用数据类型 (String) 来存储其值受某些要求约束的数据。它会降低代码的可维护性。

更好的方法是创建存储数据的数据类型。然后,该数据类型将具有您可以使用的附加验证逻辑,例如通过设置逻辑来拒绝将该数据类型的值设置为违反您的规范的值。 这种数据类型的一个例子是PasswordPassword password = new Password("abcd"); 可能会抛出异常,因为您的规范规定密码的长度必须为 5 个或更多字符。此外,您可以确保密码仅在内存中以纯文本形式存在很短的时间,方法是在验证密码后立即让构造函数对其进行哈希处理。

如果您使用的是 Java EE,请参阅 javax.validation.Validator 了解另一种方法。

【讨论】:

    【解决方案3】:

    在所有if 语句中设置一个布尔标志。如果发生错误,请将其设置为true

    然后,您将 else 段替换为另一个 if 语句,该语句仅在您声明的布尔标志为 false 时执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多