Java 字符串数组中的null指针异常,在初始化期间分配null

Java 字符串数组中的null指针异常,在初始化期间分配null,java,string,Java,String,我是java初学者。现在我在实践中遇到了问题。实际上,我想从StringTokenizer类中获取字符串标记,并将这些标记分配给字符串数组。但是我得到了空指针异常。我的代码在这里 public class Token { public static void main(String str[]) { String str1="This is my first page"; StringTokenizer str2=new StringTokeniz

我是java初学者。现在我在实践中遇到了问题。实际上,我想从StringTokenizer类中获取字符串标记,并将这些标记分配给字符串数组。但是我得到了空指针异常。我的代码在这里

public class Token {
    public static void main(String str[])
    {
        String str1="This is my first page";
        StringTokenizer str2=new StringTokenizer(str1);
        int i=0;
        String d[]=null;
        while(str2.hasMoreTokens())
        {
            d[i]=str2.nextToken();

        }
    System.out.println(d);
    }
}

尝试填充
null
数组是不可接受的:

String d[]=null;

将其更改为
String[]d=新字符串[20],但这里还有一个问题,您不知道将获得多少令牌,因此使用动态列表(例如,
ArrayList
)会更好。

必须初始化Java中的数组。这:

String d[] = null;
本质上创建对数组的引用,该数组为null。因此出现了
NullPointerException

更重要的是,即使已初始化,大小也是固定的,并且无法调整数组的大小。你不能这样做:

String[] d = new String[]; // won't compile: size not specified
继续,您可以:

d[i] = "whatever";
i
始终为0

使用
列表

List<String> list = new ArrayList<>();
最后但并非最不重要的一点是:

System.out.println(d);
不会做你认为它会做的事。它将打印数组引用的字符串表示形式。如果需要数组及其元素的字符串表示形式,请执行以下操作:

System.out.println(Arrays.toString(d));

d[]
定义为
null
,然后访问元素
i
。这会导致出现
NullPointerException

您应该做的是初始化足够大的
d[]
以使所有令牌都适合,例如
String d[]=new String[100]

哦,别忘了增加你的计数器
i


<> P>而不是使用数组,考虑使用<代码>列表>代码>,因为它将动态地增加,这样您就不必选择一个足够大的初始大小来满足所有的数据。

< P>最好在您的情况下使用一个列表,因为您不知道记录器返回了多少元素。
public static void main(String str[])
{
    String str1="This is my first page";
    StringTokenizer str2=new StringTokenizer(str1);
    int i=0;
    List<String> d=new ArrayList<String>();
    while(str2.hasMoreTokens())
    {
        d.add(str2.nextToken());

    }
    System.out.println(d);
}
publicstaticvoidmain(stringstr[])
{
String str1=“这是我的第一页”;
StringTokenizer str2=新的StringTokenizer(str1);
int i=0;
列表d=新的ArrayList();
while(str2.hasMoreTokens())
{
d、 添加(str2.nextToken());
}
系统输出打印ln(d);
}
试试这个

您应该使用str2.countTokens()对令牌进行计数,并在此基础上初始化字符串数组。

打印应该在循环内完成

public static void main(String str[]) {
    String str1 = "This is my first page";
    StringTokenizer str2 = new StringTokenizer(str1);
    int i = 0;
    String d[] = new String[str2.countTokens()];
    while (str2.hasMoreTokens()) {
        d[i] = str2.nextToken();
        System.out.println(d[i]);
    }
}

使用令牌计数进行阵列初始化:

String d[]=new String[str2.countTokens()];

StringTokenizer是一个遗留类,尽管新代码中不鼓励使用它,但出于兼容性原因保留它。建议任何寻求此功能的人改用String的split方法或java.util.regex包

以下示例说明了如何使用String.split方法将字符串分解为基本标记:

     String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);
String[]result=“这是一个测试”。拆分(\\s”);

对于(int x=0;x
String d[]=null;
为什么要这样做?(那么,当你写
d[i]时,有些东西
就像写
null。有些东西
会导致NPE)。先生,我想我们可以给引用变量赋值,然后给它赋值。@TusharPaliwal如果你给数组赋值,内存中就没有为数组分配的空间了。那么你怎么能给未分配数组的条目赋值呢?你根本不能。不是用数组,你不能。虽然这个链接可以回答这个问题,我想最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则只有链接的答案可能无效。@HinataHyuga感谢您的建议。我将为以下答案执行此操作。
     String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);