1

我正在编写一个非常简单的 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];
    }

对于询问用户是否希望继续的系统的上述“如果”部分,这并不重要。接下来,我通过查看第一个字符是否为 * 来检查以确保不会再次显示相同的条目,在我的程序中,这表明该条目已被使用。

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,我可以假设(但这就是我在这里的原因),因此检索完整条目的第一个字符应该没有问题, 正确的?

是系统检索到一个汉字不知道怎么处理的问题吗?或者是我正在丢失的东西?感谢任何可以帮助我的人。你一定会得到学分!

4

2 回答 2

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++) {

循环遍历数组,除非有特殊原因要倒退。

于 2013-09-08T23:30:38.543 回答
1

你有很多错误。

错误 1:

使用equals()not==比较字符串。这一行:

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(导致您的问题的错误):

与错误 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++){
于 2013-09-08T23:33:12.087 回答