将数据读入数组的空异常

时间:2014-01-11 16:26:16

标签: java arrays

我在下面printf行的test.main(test.java :)中的线程“main”java.lang.NullPointerException中收到Java Exception。

我在stdin上输入值,例如1 2 Bus然后回车然后另一行,我在Windows上使用Ctrl-Z结束。

我已将打印语句放入,数据读取似乎正常。为什么我在这里得到null异常?

以下是代码:

import java.util.Scanner;

public class test {
    public static class Data
    {
        public Data() {}
        public Data(int v1, int v2, String s1) { n1 = v1; n2 = v2; s = s1; } 
        public int n1; 
        public int n2;
        public String s; 
    };

    public static void main(String[] args) {
        int i = 0;
        int v1, v2;
        v1 = v2 = 0;
        String s;

        Data items[] = new Data[100];

        Scanner input = new Scanner(System.in);

        while(input.hasNext()) {
            switch(i % 3) {
                case 0: v1 = input.nextInt(); break;
            case 1: v2 = input.nextInt(); break;
                case 2: 
                    s = input.next();
                    items[i] = new Data(v1, v2, s);
                    break;
            }
            ++i;
        }
        input.close();

        for(int j = 0; j < i; ++j) {
            //on next line get Exception in thread "main" java.lang.NullPointerException at test.main(test.java:)
            System.out.printf(  "%s\t%d\t%d\n", items[j].s, items[j].n1, items[j].n2);
        }         
    }
}

1 个答案:

答案 0 :(得分:1)

一旦正确缩进,请查看代码:

switch(i % 3) {
    case 0: 
        v1 = input.nextInt(); 
        break;
    case 1: 
        v2 = input.nextInt();
        break;
    case 2: 
        s = input.next();
        items[i] = new Data(v1, v2, s);
        break;
 }
 ++i;

这意味着您只需items[i]初始化i % 3 == 2。因此,数组中三个元素中的2个为空。

但是在最后一个循环中,你试图打印每个元素,而不是测试null。

附注:命名字段s,n1和n2是拥有不可读,不可维护代码的最佳方式。给你的类和变量赋予有意义的名字。