填充新数组的空指针异常

时间:2016-11-08 11:46:27

标签: java arrays nullpointerexception

我正在尝试实现通用数据类型的向量,其中类型被视为来自用户的输入,例如:

package com.example.genericvector;

import java.util.Scanner;


public class GenericVector <generic_type>{

    private int length;
    private generic_type [] vector;

    GenericVector(generic_type element){
        this.vector[0] = element;
    }


    public void allocate_size(int length){

    }
    public void push_back(generic_type element){

    }
    public void display(generic_type [] vector){

        for(generic_type element : vector)
            System.out.print(element);

        System.out.println();

    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter the data type of vector : ");
        String vector_type = scanner.next();

        switch (vector_type){
            case "integer":
                GenericVector <Integer> vector_int = new GenericVector <Integer>(new Integer(10));
                break;
            case "double":
                GenericVector <Double> vector_double = new GenericVector <Double>(new Double(10.57));
                break;
            default:
                System.out.print("Invalid data type");
        }
    }
}

运行上面的代码后,我得到以下输出:

    Enter the data type of vector : integer
Exception in thread "main" java.lang.NullPointerException
    at com.example.genericvector.GenericVector.<init>(GenericVector.java:12)
    at com.example.genericvector.GenericVector.main(GenericVector.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 1

我对Java很新,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

private generic_type [] vector;

只有声明您的通用类型的字段(数组)。但最初,数组 null

这样的东西
private generic_type [] vector = new generic_type[10];

使用新向量初始化该字段(但请注意,此时各个数组插槽都 null )。但是,uups,评论员是正确的...这是泛型和数组的缺陷之一,你不能使用new []作为泛型类型。另一方面,数组在Java中具有固定的大小;所以你必须经常检查你是否必须增长/缩小底层阵列!因此,工作解决方案可能是:

private List<T> vector = new ArrayList<>();
例如

(使用现有的Java集合类)。

最后注释:按照惯例,泛型类型使用单个上层字符表示。因此它应该是GenericVector<T>而不是generic_type

答案 1 :(得分:0)

您没有初始化数组vector,因此this.vector[0]将抛出NullPointerException。

在这里查看如何创建通用数组实例:How to create a generic array in Java?

编辑:你的构造函数或allocate_size()方法将包含如下内容:

vector = (generic_type[]) Array.newInstance(element.getClass(), length);

另请注意,您需要为数组提供一个长度,因此在构造函数中,您必须初始化调用数组的长度至少为1,否则vector[0]将导致ArrayIndexOutOfBoundsException。< / p>