如何处理这个 NullPointerException?
How to deal with this NullPointerException?
我正在制作一个程序,它可以计算每个单词在随机段落中使用了多少次。它编译,但是当我尝试 运行 它给了我一个 NullPointerException
.
代码如下:
import java.util.StringTokenizer;
class Count
{
int count;
String name;
void SetCount(int c, String n)
{
count = c;
name = n;
}
void Show()
{
System.out.print("Name=" + name);
System.out.print("Count=" + count);
}
}
class Contains2 extends Count
{
public static void main(String args[])
{
String s = "Once you have made it to the box office and gotten your tickets, you are confronted with the problems of the theater itself. If you are in one of the run-down older theaters, you must adjust to the musty smell of seldom-cleaned carpets. Escaped springs lurk in the faded plush or cracked leather seats, and half the seats you sit in seem loose or tilted so that you sit at a strange angle. The newer twin and quad theaters offer their own problems. Sitting in an area only one-quarter the size of a regular theater, moviegoers often have to put up with the sound of the movie next door. This is especially jarring when the other movie involves racing cars or a karate war and you are trying to enjoy a quiet love story. And whether the theater is old or new, it will have floors that seem to be coated with rubber cement. By the end of a movie, shoes almost have to be pried off the floor because they have become sealed to a deadly compound of spilled soda, hardening bubble gum, and crushed Ju-Jubes";
int size, i, count = 0, j;
size = s.length();
String[] test = new String[size];
Count[] c = new Count[size];
StringTokenizer st = new StringTokenizer(s, " ");
while (st.hasMoreTokens())
{
for (i=0; i < size; i++)
{
test[i] = st.nextToken();
c[i].SetCount(1, test[i]);
}
}
for (i=0; i<size; i++)
{
for (j=0; j<size; j++)
{
if (c[i].name.equals(test[j]))
c[i].count+=1;
}
}
for (i=0; i<size; i++)
{
c[i].Show();
}
}
}
主要问题是,即使您创建了一个 Count[]
数组,您实际上并没有在数组中的每个位置初始化一个 Count()
对象。
Count[] c = new Count[size];
这会初始化数组本身,但它仍然没有在数组的每个位置放置一个已初始化的 Count()
对象。您需要像这样 new Count()
实际创建和分配这些新对象:
for (int i=0; i<size; i++)
{
c[i] = new Count();
}
这里似乎还有一个问题:
while (st.hasMoreTokens())
{
for (i=0; i<size; i++)
{
test[i] = st.nextToken();
c[i].SetCount(1, test[i]);
}
}
你在 st.hasMoreTokens()
循环,然后你继续调用 st.nextToken()
size
次,到达终点。
试试这个:
import java.util.StringTokenizer;
class Contains2 extends Count
{
public static void main(String args[])
{
String s = "Once you have made it to the box office and gotten your tickets, you are confronted with the problems of the theater itself. If you are in one of the run-down older theaters, you must adjust to the musty smell of seldom-cleaned carpets. Escaped springs lurk in the faded plush or cracked leather seats, and half the seats you sit in seem loose or tilted so that you sit at a strange angle. The newer twin and quad theaters offer their own problems. Sitting in an area only one-quarter the size of a regular theater, moviegoers often have to put up with the sound of the movie next door. This is especially jarring when the other movie involves racing cars or a karate war and you are trying to enjoy a quiet love story. And whether the theater is old or new, it will have floors that seem to be coated with rubber cement. By the end of a movie, shoes almost have to be pried off the floor because they have become sealed to a deadly compound of spilled soda, hardening bubble gum, and crushed Ju-Jubes";
int size, count = 0;
StringTokenizer st = new StringTokenizer(s, " ");
size = st.countTokens();
Count[] c = new Count[size];
String[] test = new String[size];
while (st.hasMoreTokens())
{
String token = st.nextToken();
for (int i=0; i<size; i++)
{
test[i] = token;
c[i] = new Count();
c[i].SetCount(1, token);
}
}
for (int i=0; i<size; i++)
{
for (int j=0; j<size; j++)
{
if (c[i].name.equals(test[j]))
c[i].count+=1;
}
}
for (int i=0; i<size; i++)
{
c[i].Show();
}
}
}
public class Count
{
protected int count;
protected String name;
public void SetCount(int c, String n)
{
count = c;
name = n;
}
public void Show()
{
System.out.println("Name=" + name);
System.out.println("Count=" + count);
}
}
当您执行 c[i].SetCount(.....)
时,c[i]
处的对象尚未用 new Count()
初始化
我正在制作一个程序,它可以计算每个单词在随机段落中使用了多少次。它编译,但是当我尝试 运行 它给了我一个 NullPointerException
.
代码如下:
import java.util.StringTokenizer;
class Count
{
int count;
String name;
void SetCount(int c, String n)
{
count = c;
name = n;
}
void Show()
{
System.out.print("Name=" + name);
System.out.print("Count=" + count);
}
}
class Contains2 extends Count
{
public static void main(String args[])
{
String s = "Once you have made it to the box office and gotten your tickets, you are confronted with the problems of the theater itself. If you are in one of the run-down older theaters, you must adjust to the musty smell of seldom-cleaned carpets. Escaped springs lurk in the faded plush or cracked leather seats, and half the seats you sit in seem loose or tilted so that you sit at a strange angle. The newer twin and quad theaters offer their own problems. Sitting in an area only one-quarter the size of a regular theater, moviegoers often have to put up with the sound of the movie next door. This is especially jarring when the other movie involves racing cars or a karate war and you are trying to enjoy a quiet love story. And whether the theater is old or new, it will have floors that seem to be coated with rubber cement. By the end of a movie, shoes almost have to be pried off the floor because they have become sealed to a deadly compound of spilled soda, hardening bubble gum, and crushed Ju-Jubes";
int size, i, count = 0, j;
size = s.length();
String[] test = new String[size];
Count[] c = new Count[size];
StringTokenizer st = new StringTokenizer(s, " ");
while (st.hasMoreTokens())
{
for (i=0; i < size; i++)
{
test[i] = st.nextToken();
c[i].SetCount(1, test[i]);
}
}
for (i=0; i<size; i++)
{
for (j=0; j<size; j++)
{
if (c[i].name.equals(test[j]))
c[i].count+=1;
}
}
for (i=0; i<size; i++)
{
c[i].Show();
}
}
}
主要问题是,即使您创建了一个 Count[]
数组,您实际上并没有在数组中的每个位置初始化一个 Count()
对象。
Count[] c = new Count[size];
这会初始化数组本身,但它仍然没有在数组的每个位置放置一个已初始化的 Count()
对象。您需要像这样 new Count()
实际创建和分配这些新对象:
for (int i=0; i<size; i++)
{
c[i] = new Count();
}
这里似乎还有一个问题:
while (st.hasMoreTokens())
{
for (i=0; i<size; i++)
{
test[i] = st.nextToken();
c[i].SetCount(1, test[i]);
}
}
你在 st.hasMoreTokens()
循环,然后你继续调用 st.nextToken()
size
次,到达终点。
试试这个:
import java.util.StringTokenizer;
class Contains2 extends Count
{
public static void main(String args[])
{
String s = "Once you have made it to the box office and gotten your tickets, you are confronted with the problems of the theater itself. If you are in one of the run-down older theaters, you must adjust to the musty smell of seldom-cleaned carpets. Escaped springs lurk in the faded plush or cracked leather seats, and half the seats you sit in seem loose or tilted so that you sit at a strange angle. The newer twin and quad theaters offer their own problems. Sitting in an area only one-quarter the size of a regular theater, moviegoers often have to put up with the sound of the movie next door. This is especially jarring when the other movie involves racing cars or a karate war and you are trying to enjoy a quiet love story. And whether the theater is old or new, it will have floors that seem to be coated with rubber cement. By the end of a movie, shoes almost have to be pried off the floor because they have become sealed to a deadly compound of spilled soda, hardening bubble gum, and crushed Ju-Jubes";
int size, count = 0;
StringTokenizer st = new StringTokenizer(s, " ");
size = st.countTokens();
Count[] c = new Count[size];
String[] test = new String[size];
while (st.hasMoreTokens())
{
String token = st.nextToken();
for (int i=0; i<size; i++)
{
test[i] = token;
c[i] = new Count();
c[i].SetCount(1, token);
}
}
for (int i=0; i<size; i++)
{
for (int j=0; j<size; j++)
{
if (c[i].name.equals(test[j]))
c[i].count+=1;
}
}
for (int i=0; i<size; i++)
{
c[i].Show();
}
}
}
public class Count
{
protected int count;
protected String name;
public void SetCount(int c, String n)
{
count = c;
name = n;
}
public void Show()
{
System.out.println("Name=" + name);
System.out.println("Count=" + count);
}
}
当您执行 c[i].SetCount(.....)
时,c[i]
处的对象尚未用 new Count()