【问题标题】:about populate a String[] in java关于在 java 中填充 String[]
【发布时间】:2014-01-02 18:24:49
【问题描述】:

我写了一个类并在类中声明了一个String[5];然后我尝试在没有方法的情况下直接在类主体中为这个数组赋值。我有很多错误。然后我尝试定义一个稍后调用的方法来填充这个数组。这次没有错误。我不明白为什么我不能直接在类主体中赋值,比如:aString[0] = "today"。 java新手。我知道我错过了一些重要的概念。我试图谷歌并没有找到答案。请帮我解释一下。

这不起作用:

//: com/instar/Test1.java;
//defining String[];
package com.instar;
public class Test1{
    private static String[] bString = new String[5];
    bString[0] = "Today";
    bString[0] = "Today";
    bString[2] = " snowing";
    bString[3] = " and";
    bString[4] = "cold!";
    }
}

这行得通:

//: com/instar/Test1.java;
//defining String[];
package com.instar;
public class Test1{
    private static String[] aString = new String[5];
    private static String[] bString = new String[5];
    public void populateArray(){
        bString[0] = "Today";
        bString[0] = "Today";
        bString[2] = " snowing";
        bString[3] = " and";
        bString[4] = "cold!";
    }
}

【问题讨论】:

  • 您的代码包含编译错误
  • 分享您的完整代码。
  • 几分钟前,有人问了这种问题。 stackoverflow.com/questions/20887721/…您面临同样的问题。请尽可能阅读我的帖子:stackoverflow.com/a/20887754/1927832
  • 您应该具体说明您遇到了什么样的“错误”。它是 ArrayIndexOutOfBoundsException 吗?它是 NullpointerException 吗?是代码编译错误吗?如果有,是什么样的?

标签: java arrays string


【解决方案1】:

你可能需要静态初始化器。

这应该可行:

//: com/instar/Test1.java;
//defining String[];
package com.instar;
public class Test1{
    private static String[] bString = new String[5];
    static {
      bString[0] = "Today";
      bString[2] = " snowing";
      bString[3] = " and";
      bString[4] = "cold!";
    }
}

或者,试试这个:

private static String[] bString = new String[]{"Today", " snowing", " and", "cold!"};

【讨论】:

  • 请注意,在声明站点初始化时不需要new String[]。更清楚的是,正在创建一个新对象
  • 谢谢。有用。我太愚蠢了,我忘记了构造函数和初始化块。
  • @TwistedMeadow 这不是很准确。这与构造函数无关,这是一个语法错误。问题是您试图直接在类主体中执行语句,而这在 Java 中是无法做到的。您忘记做的是将您的静态代码放在“静态{}”块中。无意吹毛求疵,但我想确保您真正了解问题所在:)
  • 谢谢你,我明白你的意思了。类主体中不允许直接执行赋值语句。我只是习惯了python语法
  • @TwistedMeadow 如果您来自 Python 并且想使用 JVM 语言但又不必使用 Java,我建议您使用 Scala。它更类似于 Python 而不是 Java。此外,在这种情况下它不需要“静态”块;)
【解决方案2】:

您不能在方法、构造函数或初始化程序块之外拥有类似的语句。

【讨论】:

    【解决方案3】:

    在方法或构造函数之外不允许赋值,就像你不能在方法/构造函数之外调用System.out.println("")一样。 (不完全确定为什么,但我知道你不能。)

    但是,您的问题有一个解决方案。我假设您希望静态完成变量的分配,以便排除将分配放在构造函数中。然后你可以做两件事:

    首先,(可能也是最简单的),您可以使用所谓的数组常量。这些允许您在声明数组时设置它们的值。 (但在您声明它们时。)看起来像这样:

    public static String[] bString = {"Today", "Today", " snowing", " and", "cold!"};
    

    您不需要指定数组的大小,因为它是根据您在数组常量中包含的元素数量来推断的。

    其次,您可以声明一个静态方法来为您执行此操作,它允许您使用赋值,(因为它们允许在方法内部。)看起来像这样:

    public static String[] getMyStringArray() {
        static String[] bString = new String[5];
        bString[0] = "Today";
        bString[1] = "Today";
        bString[2] = " snowing";
        bString[3] = " and";
        bString[4] = "cold!";
        return bString;
    }
    

    我个人会使用第一个,因为我认为它更简单、更干净。

    【讨论】:

    • 啊,你解释得很好,我不能投票,因为我的每日投票上限超出了。
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 实际上我认为这解释得不是很好,实际上说“在方法或构造函数之外不允许赋值”是不正确的。您可以为类体内的变量赋值。如果不将逻辑包装在“静态{}”块中,您将无法执行逻辑。
    • 另外,将public static String[] bString = {"Today", "Today", " snowing", " and", "cold!"};称为“数组常量”是不正确的,因为它不是最终的,所以它不是常量。
    • @torbinsky 我指的是{"Today", "Today", " snowing", " and", "cold!"} 作为我的数组常量。我之所以这样称呼它是因为当您尝试在 eclipse 中的声明之外使用一个时,它会发布一条错误消息“不能在声明之外使用数组常量”。如果不损坏磁盘或修改代码,则无法更改以上内容,您也可以修改任何标记为final 的内容。所以,本质上,{} 之间的上述短语是一个常量(不变)值。
    • @AndrewG 啊,我明白了。感谢您对此进行纠正。但是,我仍然认为这个答案总体上有点令人困惑和误导。特别是您的最后一个代码示例,它有点脱离上下文显示了如何声明静态方法并且没有显示 OP 如何实际使用它。我想说以这种方式声明一个完整的方法来初始化一个变量并不是一个好方法。
    【解决方案4】:

    我不明白为什么我不能直接在类体中赋值

    您可以在声明中使用正确的语法。

    private static String[] bString = new String[] 
    {
        "Today",
        "Today",
        " snowing",
        " and",
        "cold!"
    }
    

    允许您在声明时为数组赋值。但是通常,您应该在构造函数中执行这些操作。或许你应该阅读一下java教程。

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 2018-03-03
      • 2011-07-09
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多