【JAVA小白】 看马士兵JAVA教程,遇到一个String二维数组的问题,总是遇到空指针异常

原题目如下:

clipboard.png
..]

就是让你把一个字符串切掉,然后切掉之后再切掉,然后返回一个二维数组。

以下是我写的代码:

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        String abc = "1,2;3,4,5;6,7,8";
        
        System.out.println(test.calculate(abc));
    
    }
    
    public String[][] calculate(String s) {            //定义切字符串的方法
        
        String[][] calculated = null;                //先定义一个二维数组
        String[] tempOuter = s.split(";");            //第一次,按照分号切割,然后放入外层一维数组
        for (int i = 0; i < tempOuter.length; i++) {        //把切好的一维数组循环拿出来一次
            String[] tempInner = tempOuter[i].split(",");    //每次拿出来里面的字符串再次切割,然后装到内层一维数组中
            for (int j = 0; j < tempInner.length; j++) {    //循环内层一维数组,把每一个最小的字符串拿出来
                calculated[i][j] = tempInner[j];            //把每一个字符串依次装入一开始声明的二维数组当中
            }
            
        }
        return calculated;        
    }    
}

运行结果如下:

clipboard.png

总是说我空指针异常,这个程序到底错在哪儿呢? 我觉得我逻辑没问题啊。

我思考了下,把代码改成了这样,结果还是错的:

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        String abc = "1,2;3,4,5;6,7,8";
        
        System.out.println(test.calculate(abc));
    
    }
    
    public String[][] calculate(String s) {            //定义切字符串的方法
        
        String[][] calculated = null;                //先定义一个二维数组
        String[] tempOuter = s.split(";");            //第一次,按照分号切割,然后放入外层一维数组
        for (int i = 0; i < tempOuter.length; i++) {        //把切好的一维数组循环拿出来一次
            String[] tempInner = tempOuter[i].split(",");    //每次拿出来里面的字符串再次切割,然后装到内层一维数组中
            calculated[i] = tempInner;
        }
        return calculated;        
    }    
}

到底错在哪儿呢?

阅读 2k
2 个回答

calculated一直为空,而且数组是不能扩容的;
可以把calculated定义成list

经过我再一次修改,这道题目总算是做出来了。
代码如下:

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        String abc = "1,2;3,4,5;6,7,8";
        
        for (int t = 0; t < test.calculate(abc).length; t++) {
            System.out.print("{ ");
            for (int u = 0; u < test.calculate(abc)[t].length; u++) {
                System.out.print("[ ");
                System.out.print(test.calculate(abc)[t][u]);
                System.out.print(" ]");
            }
            System.out.print(" }");
        }
        
    }
    
    public String[][] calculate(String s) {            //定义切字符串的方法
        
        
        String[] tempOuter = s.split(";");            //第一次,按照分号切割,然后放入外层一维数组
        String[][] calculated = new String[tempOuter.length][];        //先定义一个二维数组,长度为第一次字符串切割的长度
        for (int i = 0; i < tempOuter.length; i++) {        //把切好的一维数组循环拿出来一次
            String[] tempInner = tempOuter[i].split(",");    //每次拿出来里面的字符串再次切割,然后装到内层一维数组中
            calculated[i] = tempInner;            //把一维数组直接装入一开始创建的二维数组里面
        }
        return calculated;        
    }    
}

虽然做出来了,还是有点朦朦胧胧。
总结一下我的体会:
二维数组不能直接给第二维(内层的)的数组赋值。也就是说,二维数组本质上只是一个里面装数组的一维数组。给他往里面装东西的时候,必须先把里面的数组打包好,做为一个整体放入到外层的一维数组里面去。所以说,一开始,外层的数组要直接定义好他的长度(内层的数组不需要定义长度,因为内层不归外层管,内层里面的每一个数组,都是各自独立的,跟别人没有关系,也就是说内层只需要满数据类型一致,也就是都是数组就行了,但外层必须定义长度,因为外层是一个一维数组,要放入东西必须事先定义长度,而不是一边生成数据,一边塞进去)。JAVA这门语言还是相当严格的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题