我正在使用Java编写一个非常简单的命令行程序来测试我对中文书写系统的了解。目标是呈现英语,拼音或汉字,然后强制用户输入未显示的2。在完成一些简单的Array错误之后,我遇到了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,我可以假设(但这就是我在这里的原因)并且因此检索第一个字符串应该没有问题一个完整的条目,对吗?
问题是系统可能检索到中文字符而不知道如何处理它? 或者是我正在失踪的东西? 谢谢任何可能帮助我的人。你一定会得到学分!
答案 0 :(得分:1)
问题在于
行for (int i = (Master.Mandarray.length-1); i>0 ;i--){
测试i>0
在循环体之前完成,因此当i
为零时循环不会完成。
这意味着数组的其余元素为null
。
恕我直言,使用旧的C风格的习语是比较常见的
for (int i = 0; i < Master.Mandarray.length; i++) {
用于循环遍历数组,除非有特殊原因要反向。
答案 1 :(得分:1)
你有很多错误。
使用equals()
而非==
来比较字符串。这一行:
if(mandalist[randInt][randIntSub] == ""){
应该是:
if(mandalist[randInt][randIntSub].equals("")){
或更好:
if(mandalist[randInt][randIntSub].isEmpty()){
java数组从零开始;数组的最高索引是length - 1
,而不是length
,最低的是零,而不是一个,所以你的循环:
for (int i = mandalist.length; i>0 ;i--){
应该是:
for (int i = mandalist.length - 1; i >= 0 ;i--){
类似于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++){