Java 字符串数组中的null指针异常,在初始化期间分配null
我是java初学者。现在我在实践中遇到了问题。实际上,我想从StringTokenizer类中获取字符串标记,并将这些标记分配给字符串数组。但是我得到了空指针异常。我的代码在这里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
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;xString 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]);