【问题标题】:Integer arguments being interpreted as String arguments in Java [duplicate]整数参数在Java中被解释为字符串参数[重复]
【发布时间】:2017-10-05 12:03:10
【问题描述】:

代码:

class Foo 
{
    public static void main(String[] args)
    { 
        int x[] = new int[5];
        for(int i=0;i<5;i++)
            x[i]=i*i;

        for(int i=0;i<5;i++)
        {
            System.out.println("Value #" + i+1 + " = " + x[i]);
        }
    }
}

输出:

tk@insomniac-tk:~$ java Foo
Value #01 = 0
Value #11 = 1
Value #21 = 4
Value #31 = 9
Value #41 = 16

那么,这里发生了什么?我在哪里弄乱了我的java代码?我的意思是为什么在 Java 中,i+1 的字面意思是 i concat 1

【问题讨论】:

  • 连接是从左到右完成的。所以"Value #" + i首先被执行,Sting+Integer被解释为字符串连接。使用括号表示要在串联之前执行 i+1。
  • 你在做两件不同的事情。在 Java 中,您打印一个连接的字符串,而在 C++ 中,您打印单独的“项目”。
  • 修复它:System.out.println("Value #" + (i+1) + " = " + x[i]);
  • + 在 C++ 中的运算符优先级高于 &lt;&lt;
  • 这个问题已经被问过很多次了。这是重复问题的副本。

标签: java


【解决方案1】:
public class Foo 
{
   public static void main(String[] args)
    { 
    int x[] = new int[5];
    for(int i=0;i<5;i++)
        x[i]=i*i;

    for(int i=0;i<5;i++)
        {
            System.out.println("Value # " + (i+1) + " = " + x[i]);
        }
    }
}

试试这个

【讨论】:

  • 是的!有效!如果我错了,请纠正我,每个 System.out.println() 都将字符串作为参数,除非明确指定,否则不会使用整数?
  • @insomniac_tk println 方法将有多个重载方法,包括一个用于整数的方法。但是因为有String,所以使用了接受String参数的println方法
  • @JohnD 是的,这是有道理的。谢谢m8!
【解决方案2】:

Strings 中,+ 运算符用于连接,所以因为你没有指定任何括号,所以你的 i1 也是连接的,你需要使用括号明确地告诉它们是总结起来:

for (int i = 0; i < 5; i++) {
    System.out.println("Value #" + (i + 1) + " = " + x[i]);
}

获取:

Value #1 = 0
Value #2 = 1
Value #3 = 4
Value #4 = 9
Value #5 = 16

除此之外,使用IntStream 的另一种方式也一样:

IntStream.range(0, 5)
         .mapToObj(i -> "Value #" + (i + 1) + " = " + (i * i))
         .forEach(System.out::println);

【讨论】:

    【解决方案3】:

    + 表示类似 concat 的意思,如果您想计算表达式,请将其放在括号中

    (i + 1) 不是 i + 1

    【讨论】:

      【解决方案4】:

      这一行:

      System.out.println("Value #" + i+1 + " = " + x[i]);
      

      尤其是

      "Value #" + i+1 + " = " + x[i]
      

      是以下代码的语法糖:

      new StringBuffer().append("Value #")
                        .append(i)
                        .append(1)
                        .append(" = ")
                        .append(x[i])
                        .toString();
      

      你想要的是这个:

      "Value #" + (i+1) + " = " + x[i]
      

      这将转化为

      new StringBuffer().append("Value #")
                        .append(i+1)
                        .append(" = ")
                        .append(x[i])
                        .toString();
      

      【讨论】:

      • 这里是 Java 新手。所以没有得到大部分内容,但我仍然尝试了 i+1 上的括号并且有效!
      【解决方案5】:

      因为在这种情况下,Java 将 i 附加到您的字符串,然后将 1 附加到您的字符串。

      要首先评估该值(并在此处产生您期望的结果),您必须使用括号通知 Java 您要在附加该值之前对其进行评估:

      System.out.println("Value #" + (i+1) + " = " + x[i]);
      

      输出

      Value #1 = 0
      Value #2 = 1
      Value #3 = 4
      Value #4 = 9
      Value #5 = 16
      

      【讨论】:

        【解决方案6】:

        Java 和 C++ 程序不同的关键原因是使用的运算符不同:

        System.out.println("Value #" + i+1 + " = " + x[i]); // Java
        cout << "Value # " << i + 1 << " =  " << x[i] << endl; // C++
        

        + 运算符有一个higher precedence,因此加法是在重载的&lt;&lt; 运算符之前完成的。

        在 Java 版本中,它都是 +s,所以它们都是从左到右计算的。

        【讨论】:

        • 哇,这太酷了。谢谢m8!
        【解决方案7】:

        问题出在 system.out.println(""); 中,当使用 (+) 与字符串变量相加时,所有整数都会连接成字符串。针对整数和字符串变量的不同操作尝试不同的代码。

        【讨论】:

          【解决方案8】:

          您不能简单地将整数添加到字符串中。您必须使用 Integer.toString(int) 将整数转换为字符串,然后将返回的值添加到字符串中。

          【讨论】:

          • 这是完全错误的,字符串连接会自动将整数转换为字符串 - 阅读section in the JLS
          猜你喜欢
          • 2015-11-07
          • 1970-01-01
          • 2012-02-21
          • 2011-08-01
          • 2015-11-13
          • 2013-01-24
          • 1970-01-01
          • 2016-09-17
          • 2012-05-31
          相关资源
          最近更新 更多