【问题标题】:Cannot invoke equals(String) on the primitive type int error? [closed]无法在原始类型 int 错误上调用 equals(String)? [关闭]
【发布时间】:2016-02-17 16:44:04
【问题描述】:

我对下面的if statement block 有疑问:

public void viewaccount ( ) {
    Scanner getinput = new Scanner(System.in);
    System.out.println("Enter your account number to log in");
    int login = getinput.nextInt();
    if (login.equals("accnumber")) {   // <== here
        /* to be written */
    }
}

【问题讨论】:

  • 嗯,是的。你有一个int。你期望在它上面调用equals("accnumber") 会做什么?你想达到什么目的?如果您告诉我们您的目标,我们更有可能为您提供帮助。
  • 您不能使用在原始类型 int 上调用的 .equals() 方法。您的错误消息解释了这一点。你很可能想说if ("accnumber".equals(login)),或者更笼统地说:if (String.valueOf(login).equals("accnumber"))
  • 那么 ArrayList 在哪里?到目前为止,您只向用户询问了一个值...也许您想查看其他一些 ArrayList 包含该值吗?你明白"accnumber" 是一个字符串文字吗?假设您正在学习一门课程,我认为向您的老师寻求更多帮助可能是值得的 - Stack Overflow 非常适合解决特定问题,但我认为您需要重新学习基础知识,然后再继续学习。
  • @salman: "accnumber" 不是一个变量——它是一个字符串文字。了解这一点至关重要。

标签: java


【解决方案1】:

.equals(String) 是一种检查两个字符串是否包含相同字符/文本的方法。显然,您不能在 int 上调用 .equals() 来检查它是否包含与字符串相同的字符,因为 int 不包含字符(当然,除非它被转换为人类可读的形式)。

如果你想检查用户是否输入了正确的账号,你应该这样做:

public void viewaccount() {

    Scanner getinput = new Scanner(System.in);
    System.out.println("Enter your account number to log in");
    int login = getinput.nextInt();

    // Correct account number:
    int correctAccountNumber = 1234567;

    if (login == correctAccountNumber) {
        // Hooray! Success.


    }else{
        System.out.println("You have entered the incorrect account number.");
    }

}

如果这曾经在实际应用中使用过,那么从安全角度来看,这将是一场噩梦,但对于学习来说,这应该可以解决您的问题。


为了让您更深入地了解.equals() 的工作原理,我建议您阅读the Java Objects classintprimitive data type,因此它没有像 String 那样内置的方法。 String 被认为是 composite data type,它允许 String 拥有像 .length().equals().trim() 等方法和属性。

在 Java 中,所有类都有 Object 作为超类,它允许所有类和复合数据类型继承 .equals().hashcode().toString() 等方法,但最重要的是,所有复合数据类型也可以实现自己的方法。例如,Integer 数据类型(它是原语int 的包装器)添加了诸如.parseInt().compare() 之类的函数。

与大多数语言不同,Java 为所有这些数据类型提供原始数据类型和内置包装类。 intIntegerbooleanBooleanlongLongcharCharacter。所有其他原始类型的列表还在继续。

【讨论】:

    【解决方案2】:

    如果你想比较一个 int 你不需要使用 .equals() 方法。由于您将输入转换为 int,您可以使用“==”将一个 int 与另一个进行比较。此外,“accnumber”需要初始化为 int 变量。

    【讨论】:

      【解决方案3】:

      equals 方法是类Object 的方法。 int 等原始类型不是对象,因此无法访问 equals 方法。

      当你想比较原始类型时,你必须使用==。在您的情况下,您试图将 int(这是一个数字)与 String(这是一个文本)进行比较,这没有意义 - 它始终是 false

      也许在您的情况下,您应该将输入读取为这样的字符串:

      String login = getinput.next();
      

      然后您可以使用equals 方法,因为login 变量将属于String 类型,它扩展了Object 并且可以与equals 进行比较。

      编辑

      如果您仍想以数字形式读取数据,则应在之后将登录变量从 int 转换为 String,以便与另一个 String 进行比较。

      这样做是这样的:

      int login = getinput.nextInt();
          if (String.valueOf(login).equals("accnumber")) {   
              /* to be written */
          }
      

      当然,这总是会返回 false,因此只有当您提供的 String 文字类似于“131423”时,它才会起作用。我真的希望这个“accnumber”是您仅用于示例的虚拟字符串。否则我看不到任何其他好的方法。

      【讨论】:

      • 虽然这可以解决编译错误,但这显然不是 OP 打算做的(按照提示“输入帐号登录”)
      • 我将在我的答案中添加更多解释,以便他可以选择。
      • 抱歉,编辑根本没有用 - 转换为 Stringint永远等于文字字符串“accnumber”
      • 该示例没有其他方法 - OP 要么想要一个 int 值并将其与“accnumber”不同的值进行比较,要么他需要读取字符串数据。我已经为这两个建议提供了一个示例方法,以便他可以从那里得到它。
      【解决方案4】:

      只需抓取下一个字符串而不是下一个 int。

      String input = getInput.next();
      input.equals("accountNumber");
      

      【讨论】:

      • 虽然这可能会解决编译错误,但这显然不是 OP 打算做的(按照提示“输入帐号登录”)
      • @Chris 这正是 op 想要做的。他们希望将用户输入的值与已知值进行比较。为什么在字符串上使用 int?
      • 用户输入的值是一个帐号 - 即:12345。这永远不会等于文字字符串“accountNumber”
      • @Chris 你有什么理由相信帐号是一个整数?当然 "accountNumber" 不是他们最终想要匹配的,但为什么不匹配字符串而不是 int 呢?也许帐号的位数太多而不能成为 int?
      猜你喜欢
      • 2014-05-19
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 2018-11-03
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多