【问题标题】:How to accurately compare strings?如何准确比较字符串?
【发布时间】:2016-05-18 13:43:40
【问题描述】:

我有一个函数,它接受一个字符串和 2 个整数。该函数根据字符串是什么,对这两个数字执行操作。

即使我传递了“+”、“-”等,我的默认情况也始终运行。我不知道为什么。 这是代码:

 public int evaluateAnswerTwoOperations(String operation, int numberOne, int numberTwo) {

    switch(operation){

        case "+":
            Log.d("usingsubtraction","plus2nmbers");
            return numberOne + numberTwo;
        case "-":
            Log.d("usingsubtraction","usingsubtraction");
            return  numberOne - numberTwo;
        case "/":
            Log.d("usingsubtraction","usingdivision");
            return numberOne / numberTwo;
        default:
            Log.d("usingsubtraction","usingmultiplication");
            return numberOne*numberTwo;

    }

有人知道为什么吗?

【问题讨论】:

  • 这是不可能的,检查部署的代码是否是最新的,还要检查输入的尾随/前导空格。 returnreturn 之后不会运行任何代码(除非您使用 try/finally)
  • @anaxin 那需要使用char 而不是String
  • 据我所知,您在此处提供的代码看起来是正确的,因此错误可能在其他地方。我建议添加一个Log.d() 调用来打印operation 的值。您应该在值周围加上引号,以便您可以看到可能导致问题的空格。
  • 不请自来的建议:您应该明确地使用 case "*": 进行乘法运算,并使用 default: 打印相应的错误消息。

标签: java android arrays android-intent switch-statement


【解决方案1】:

由于您只对每个开关情况使用长度为 1 的字符串,因此我宁愿使用 char 代替。所以尝试以下方法:

public int evaluateAnswerTwoOperations(char operation, int numberOne, int numberTwo) {

    switch(operation){

        case '+':
            Log.d("usingsubtraction","plus2nmbers");
            return numberOne + numberTwo;
        case '-':
            Log.d("usingsubtraction","usingsubtraction");
            return  numberOne - numberTwo;
        case '/':
            Log.d("usingsubtraction","usingdivision");
            return numberOne / numberTwo;
        default:
            Log.d("usingsubtraction","usingmultiplication");
            return numberOne*numberTwo;

    }
}

【讨论】:

  • 虽然这绝对是一个好建议,但它不会改变预期的行为,也不会指出 OP 原始代码中的错误。
【解决方案2】:

如果代码始终运行default 情况,则与String.equals() 相比,传入的字符串不等于任何其他情况。转储该参数的值,可能包含在尖括号中以显示空格和/或它的十六进制表示,以查看到达那里的内容而不是您认为到达那里的内容...

【讨论】:

    【解决方案3】:

    这个问题可能是由以下问题引起的:

    1. 您的字符串无法与您的任何案例相媲美。
    2. 您在函数中传递的值确实包含一些易受攻击的值

    因此,您只需检查您是否在函数中传递了正确的值。这可以通过将 CHAR 而不是 STRING 传递给函数来避免(这是 +、-、/ 和 * 的好方法)... 用这个 public int evaluateAnswerTwoOperations(char operation, int numberOne, int numberTwo) 并进行其余的比较。

    您的问题的其他可能解决方案是:

    默认情况下不要相乘 你必须引入另一个 Switch 情况来与 * 进行比较。并且在默认情况下打印错误..所以如果两种情况都没有完美匹配..将打印错误

    【讨论】:

      【解决方案4】:

      传统上,switch 只能用于基本类型,例如 intlongcharshortenum。我不确定,但据我没有弄错,Android 不支持 switchString 在最新版本中,但肯定不支持旧版本,所以,正如其他答案所建议的,由于缺乏对该操作的支持,您可能希望使用并传递char 而不是String

      但是,在 Java 7 上,switchString 已受支持。示例:

      package dustin.examples;
      
      import static java.lang.System.out;
      
      /**
       * Simple class demonstrating switch on Strings available with JDK 7.
       */
      public class StringsWithSwitchDemo
      {
         /**
          * Main executable function.
          *
          * @param arguments Command-line arguments: none expected.
          */
         public static void main(final String[] arguments)
         {
            final String name =   arguments.length > 0
                                ? arguments[0]
                                : "Dustin";
      
            switch (name)
            {
               case "Dino" :
                  out.println("Flintstones?");
                  break;
               case "Neo" :
                  out.println("Matrix?");
                  break;
               case "Gandalf" :
                  out.println("Lord of the Rings?");
                  break;
               case "Dustin" :
                  out.println("Inspired by Actual Events");
                  break;
               default :
                  out.println("The Good, the Bad, and the Ugly?");
            }
         }
      }
      

      Source.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多