初学Java,做了一个练习软件。出现了空指针错问,请大家看看,谢谢。原来想实现的是输入英语单词后,再根据编码选择性导出,但是导出的时候出现空指针错误。
本人高中,刚刚开始学,做的比较繁琐。请大家多多指教。import java.util.Scanner;
class test5_1{
    String word;
    char j;
    int l;
    int i;
    int k=0;
    char letter_0[];
    char letter_1[];
    char letter_2[];
    char letter_3[];
    char letter_4[];
    char letter_5[];
    char letter_6[];
    int len_0;
    int len_1;
    int len_2;
    int len_3;
    int len_4;
    int len_5;
    int len_6;
    void back(){
        test5 op= new test5();
    }
    void push(String word, int l, int i){
        this.word=word;
        this.l=l;
        this.i=i;
        switch(i){
            case 0:
                len_0=l;
                char letter_0[]= new char[len_0];
                for(;l>0;l--,k++){
                    letter_0[k]=word.charAt(k);
                }
                back();
            case 1:
                len_1=l;
                char letter_1[]= new char[len_1];
                for(k=0;len_1>0;len_1--,k++){
                    letter_1[k]=word.charAt(k);
                }
                back();
            case 2:
                len_2=l;
                char letter_2[]= new char[len_2];
                for(k=0;len_2>0;len_2--,k++){
                    letter_2[k]=word.charAt(k);
                }
                back();
            case 3:
                len_3=l;
                char letter_3[]= new char[len_3];
                for(k=0;len_3>0;len_3--,k++){
                    letter_3[k]=word.charAt(k);
                }
                back();
            case 4:
                len_4=l;
                char letter_4[]= new char[len_4];
                for(k=0;len_4>0;len_4--,k++){
                    letter_4[k]=word.charAt(k);
                }
                back();
            case 5:
                len_5=l;
                char letter_5[]= new char[len_5];
                for(k=0;len_5>0;len_5--,k++){
                    letter_5[k]=word.charAt(k);
                }
                back();
            case 6:
                len_6=l;
                char letter_6[]= new char[len_6];
                for(k=0;len_6>0;len_6--,k++){
                    letter_6[k]=word.charAt(k);
                }
                back();
        }
    }
    void get(char num){
        this.j=num;
        switch(j){
            case '0':
                for(k=0;len_0>0;len_0--,k++){
                    System.out.println(letter_0[k]);
                }
                back();
            case '1':
                for(k=0;len_1>0;len_1--,k++){
                    System.out.println(letter_1[k]);
                }
                back();
            case '2':
                for(int k=0;len_2>0;len_2--,k++){
                    System.out.println(letter_2[k]);
                }
            case '3':
                for(int k=0;len_3>0;len_3--,k++){
                    System.out.println(letter_3[k]);
                }
                back();
            case '4':
                for(int k=0;len_4>0;len_4--,k++){
                    System.out.println(letter_4[k]);
                }
                back();
            case '5':
                for(int k=0;len_5>0;len_5--,k++){
                    System.out.println(letter_5[k]);
                }
                back();
            case '6':
                for(int k=0;len_6>0;len_6--,k++){
                    System.out.println(letter_6[k]);
                }
                back();
        }
    }
}class test5{
    public static void main(String args[])
    throws java.io.IOException{
        String word;
        char num;
        int i;
        test5_1 op= new test5_1();
        for(i=0;i<7;i++){
            if(i==6){
                System.out.println("欢迎来到英文单词竖式转化堆栈");
                System.out.println("键入英文单词 编号为"+i+"  提取竖式单词请键入777");
                Scanner sca=new Scanner(System.in);
                word=sca.next();
                int l=word.length();
                op.push(word,l,i);
                System.out.println("堆栈已满,键入要提取单词的编号");
                num=(char)System.in.read();
                op.get(num);
            }else{
                System.out.println("欢迎来到英文单词竖式转化堆栈");
                System.out.println("键入英文单词 编号为"+i+"  提取竖式单词请键入777");
                Scanner sca=new Scanner(System.in);
                word=sca.next();
                if(word.equals("777")){
                    System.out.println("键入要提取单词的编号");
                    num=(char)System.in.read();
                    op.get(num);
                    i-=1;
                }else{
                    int l=word.length();
                    op.push(word,l,i);
                }
            }
        }
    }
}

解决方案 »

  1.   

    之所以出错,是因为类test5_1里定义的字符数组未初始化。之所以未初始化,是因为在push方法里定义的数组是方法内的局部变量,不是类的成员变量。
    解决的办法是,把
    char letter_0[]= new char[len_0];
    换成:
    letter_0= new char[len_0];
    其他的case里都这样换。
      

  2.   

    jdk 1.7 在命令窗口下运行没有错误,上面是运行结果
      

  3.   

    各位很热情,感谢!我用的是最新版 JDK7。另外,在mac用的,虽然这应该不是有影响吧。
      

  4.   

    debug看看154行的op对象是不是null
      

  5.   

    letter_0= new char[len_0];
    这么写是有语法错误的。。 
    ==
      

  6.   

    "我来试试看。我在类里面先声明了这些数组也没用吗?" 
    你是声明了,但没有初始化,所以那些数组都是null. 你在方法里本应初始化,赋值,但你又重新定义了和这些数组名一样的数组,它们仅是在方法里可见。和类里定义的没有关系了。
    象我说的那样可以的,我调试过了。
    还可以,把局部变量,赋给成员变量。        switch(i){
                case 0:
                    len_0=l;
                    char letter_0[]= new char[len_0];
                    for(;l>0;l--,k++){
                        letter_0[k]=word.charAt(k);
                    }
    //--
    this.letter_0=letter_0;
                    back();
                case 1:
                    len_1=l;
                    char letter_1[]= new char[len_1];
                    for(k=0;len_1>0;len_1--,k++){
                        letter_1[k]=word.charAt(k);
                    }
    //--
    this.letter_1=letter_1; back();
                case 2:
                    len_2=l;
                    char letter_2[]= new char[len_2];
                    for(k=0;len_2>0;len_2--,k++){
                        letter_2[k]=word.charAt(k);
                    }
    //--
    this.letter_2=letter_2; back();
                case 3:
                    len_3=l;
                    char letter_3[]= new char[len_3];
                    for(k=0;len_3>0;len_3--,k++){
                        letter_3[k]=word.charAt(k);
                    }
    //--
    this.letter_3=letter_3;                back();
                case 4:
                    len_4=l;
                    char letter_4[]= new char[len_4];
                    for(k=0;len_4>0;len_4--,k++){
                        letter_4[k]=word.charAt(k);
                    }
    //--
    this.letter_4=letter_4;                back();
                case 5:
                    len_5=l;
                    char letter_5[]= new char[len_5];
                    for(k=0;len_5>0;len_5--,k++){
                        letter_5[k]=word.charAt(k);
                    }
    //--
    this.letter_5=letter_5;                back();
                case 6:
                    len_6=l;
                    char letter_6[]= new char[len_6];
                    for(k=0;len_6>0;len_6--,k++){
                        letter_6[k]=word.charAt(k);
                    }
    //--
    this.letter_6=letter_6;                back();
            }
      

  7.   

    用3楼的办法,代码:
           switch(i){
                case 0:
                    len_0=l;
                    letter_0= new char[len_0];//这里修改。不再定义数组,而是初始化成员数组。下同。
                    for(;l>0;l--,k++){
                        letter_0[k]=word.charAt(k);
                    }
                    back();
                case 1:
                    len_1=l;
                    letter_1= new char[len_1];
                    for(k=0;len_1>0;len_1--,k++){
                        letter_1[k]=word.charAt(k);
                    }
                    back();
                case 2:
                    len_2=l;
                    letter_2= new char[len_2];
                    for(k=0;len_2>0;len_2--,k++){
                        letter_2[k]=word.charAt(k);
                    }
                    back();
                case 3:
                    len_3=l;
                    letter_3= new char[len_3];
                    for(k=0;len_3>0;len_3--,k++){
                        letter_3[k]=word.charAt(k);
                    }
                    back();
                case 4:
                    len_4=l;
                    letter_4= new char[len_4];
                    for(k=0;len_4>0;len_4--,k++){
                        letter_4[k]=word.charAt(k);
                    }
                    back();
                case 5:
                    len_5=l;
                    letter_5= new char[len_5];
                    for(k=0;len_5>0;len_5--,k++){
                        letter_5[k]=word.charAt(k);
                    }
                    back();
                case 6:
                    len_6=l;
                    letter_6= new char[len_6];
                    for(k=0;len_6>0;len_6--,k++){
                        letter_6[k]=word.charAt(k);
                    }
                    back();
            }
      

  8.   


    我用了你十楼方法,有效果,感谢!
    但是三楼方法里“ letter_4= new char[len_4]; ”这种初始化的语句有报语法错误。
    请看一下。
      

  9.   

    import java.util.Scanner;
    class test5_1{
        String word;
        char j;
        int l;
        int i;
        int k=0;
        char letter_0[];
        char letter_1[];
        char letter_2[];
        char letter_3[];
        char letter_4[];
        char letter_5[];
        char letter_6[];
        int len_0;
        int len_1;
        int len_2;
        int len_3;
        int len_4;
        int len_5;
        int len_6;
        void back(){
            test5 op= new test5();
        }
        void push(String word, int l, int i){
            this.word=word;
            this.l=l;
            this.i=i;
            switch(i){
                case 0:
                    len_0=l;
                    letter_0[]= new char[len_0];
                    for(;l>0;l--,k++){
                        letter_0[k]=word.charAt(k);
                    }
                    back();
                case 1:
                    len_1=l;
                    letter_1[]= new char[len_1];
                    for(k=0;len_1>0;len_1--,k++){
                        letter_1[k]=word.charAt(k);
                    }
                    back();
                case 2:
                    len_2=l;
                    letter_2[]= new char[len_2];
                    for(k=0;len_2>0;len_2--,k++){
                        letter_2[k]=word.charAt(k);
                    }
                    back();
                case 3:
                    len_3=l;
                    letter_3[]=new char[len_3];
                    for(k=0;len_3>0;len_3--,k++){
                        letter_3[k]=word.charAt(k);
                    }
                    back();
                case 4:
                    len_4=l;
                    letter_4[]=new char[len_4];
                    for(k=0;len_4>0;len_4--,k++){
                        letter_4[k]=word.charAt(k);
                    }
                    back();
                case 5:
                    len_5=l;
                    letter_5[]=new char[len_5];
                    for(k=0;len_5>0;len_5--,k++){
                        letter_5[k]=word.charAt(k);
                    }
                    back();
                case 6:
                    len_6=l;
                    letter_6[]=new char[len_6];
                    for(k=0;len_6>0;len_6--,k++){
                        letter_6[k]=word.charAt(k);
                    }
                    back();
            }
        }
        void get(char num){
            this.j=num;
            switch(j){
                case '0':
                    for(k=0;len_0>0;len_0--,k++){
                        System.out.println(letter_0[k]);
                    }
                    back();
                case '1':
                    for(k=0;len_1>0;len_1--,k++){
                        System.out.println(letter_1[k]);
                    }
                    back();
                case '2':
                    for(int k=0;len_2>0;len_2--,k++){
                        System.out.println(letter_2[k]);
                    }
                case '3':
                    for(int k=0;len_3>0;len_3--,k++){
                        System.out.println(letter_3[k]);
                    }
                    back();
                case '4':
                    for(int k=0;len_4>0;len_4--,k++){
                        System.out.println(letter_4[k]);
                    }
                    back();
                case '5':
                    for(int k=0;len_5>0;len_5--,k++){
                        System.out.println(letter_5[k]);
                    }
                    back();
                case '6':
                    for(int k=0;len_6>0;len_6--,k++){
                        System.out.println(letter_6[k]);
                    }
                    back();
            }
        }
    }class test5{
        public static void main(String args[])
        throws java.io.IOException{
            String word;
            char num;
            int i;
            test5_1 op= new test5_1();
            for(i=0;i<7;i++){
                if(i==6){
                    System.out.println("欢迎来到英文单词竖式转化堆栈");
                    System.out.println("键入英文单词 编号为"+i+"  提取竖式单词请键入777");
                    Scanner sca=new Scanner(System.in);
                    word=sca.next();
                    int l=word.length();
                    op.push(word,l,i);
                    System.out.println("堆栈已满,键入要提取单词的编号");
                    num=(char)System.in.read();
                    op.get(num);
                }else{
                    System.out.println("欢迎来到英文单词竖式转化堆栈");
                    System.out.println("键入英文单词 编号为"+i+"  提取竖式单词请键入777");
                    Scanner sca=new Scanner(System.in);
                    word=sca.next();
                    if(word.equals("777")){
                        System.out.println("键入要提取单词的编号");
                        num=(char)System.in.read();
                        op.get(num);
                        i-=1;
                    }else{
                        int l=word.length();
                        op.push(word,l,i);
                    }
                }
            }
        }
    }
      

  10.   

    我感觉其实它报的错都是nonsense而已
      

  11.   

    咳,数组名后面不要再加“[]”了!一般书上建议定义数组时用这样的方法:
    char[] c= new char[10];
    这样更清楚的表达,变量c是一个char型数组。
    而 char c[] =new char[10]; 也对,但容易犯楼主的错误。