我正在用 Java 编写一个非常简单的命令行程序来测试我对中文书写系统的了解。目标是显示英语、拼音或汉字,然后强制用户输入未显示的 2 个。在解决了一些简单的数组错误后,我遇到了 NullPointerException。
现在,我明白它是什么,但我只是不明白为什么会发生。
在名为 Master.java 的文件中,我有以下内容:
static final String [] [] Mandarray = {{"You", "Nǐ", "你"}, {"Good", "Hǎo", "好"}};
在 Chinese_Mandarin 对象的构造函数中,我将此数组的内容复制到一个新数组,即 Chinese_Mandarin 对象的成员之一,如下所示,
public Chinese_Mandarin(char transfer){
if(transfer == 'n' || transfer != 'y')System.exit(0);
for (int i = (Master.Mandarray.length-1); i>0 ;i--){
mandalist [i][0] = Master.Mandarray[i][0];
mandalist [i][1] = Master.Mandarray[i][1];
mandalist [i][2] = Master.Mandarray[i][2];
}
对于系统询问用户是否希望继续的上述“if”部分,这并不重要。 接下来,我通过查看第一个字符是否为 * 来检查以确保不会再次显示相同的条目,这在我的程序中表明该条目已被使用。
public void presenter(){
Scanner chinEngl = new Scanner(System.in);
restart: for (int i = mandalist.length; i>0 ;i--){
randInt = random.nextInt(mandalist.length);
randIntSub = random.nextInt(3);
if(mandalist[randInt][randIntSub] == ""){
continue restart;
}
else if (((mandalist[randInt][randIntSub]).charAt(0)) == '*'){
continue restart;
}
在这里,我初始化一个稍后使用的扫描仪,创建两个稍后使用的随机整数,并确保元素不为空(如果是,我传递给标签“restart”以继续循环尽管如此)。
上线:
else if (((mandalist[randInt][randIntSub]).charAt(0)) == '*'){
我收到一个 NullPointerException 错误,但无法理解为什么... Master.mandarray 已转移到 mandalist,我可以假设(但这就是我在这里的原因),因此检索第一个字符应该没有问题完整的条目,对吗?
问题是系统可能检索到一个汉字而不知道如何处理吗? 或者我正在错过什么? 感谢任何可以帮助我的人。您一定会获得学分!
最佳答案
你有很多错误。
错误 1:
使用equals()
而不是==
来比较字符串。这一行:
if(mandalist[randInt][randIntSub] == ""){
应该是:
if(mandalist[randInt][randIntSub].equals("")){
或更好:
if(mandalist[randInt][randIntSub].isEmpty()){
错误 2:
java 数组是从零开始的;数组的最高索引是 length - 1
,而不是 length
,最低索引是零,而不是一,所以你的循环:
for (int i = mandalist.length; i>0 ;i--){
应该是:
for (int i = mandalist.length - 1; i >= 0 ;i--){
错误 3(导致您的问题的错误):
与 Bug 2 类似,您的循环在索引零处初始化元素时停止,因此应该是:
for (int i = (Master.Mandarray.length-1); i >= 0 ;i--){ // i >= 0, not i > 0
<小时/>
除非您确实需要循环索引,否则请使用行业标准方法来提升索引:
for (int i = 0; i < Master.Mandarray.length-1; i++){
关于用于中国研究的简单数组上的 Java NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689653/