基本转换器中的空指针异常

时间:2013-09-06 00:36:17

标签: java nullpointerexception converter base

我正在制作一个从a到b的转换器。这是说我有一个nullpointerexception。我不知道如何解决它。我知道这可能与arraylist的界限有关,但我不确定。我是java的新手,所以请不要让答案太复杂。我知道有一个图书馆功能可以转换基础,但我的教授让我们自己编写。

nullpointerexception是恒星的位置(** * **)

public class NumberBase {

    private static double d;

    private static int i;

    private static ArrayList <Character> c;

    private static double sum;

    private static ArrayList <Integer> result = new ArrayList <Integer>();

    public NumberBase(){
        i = 0;
        c = new ArrayList <Character>();
    }

    public static String convert(String input, int base_in, int base_out){

        while(i < input.length()){
            c.add(input.charAt(i)); (*****)
            i++;
        }

        int digit;

        i = 0;
        while(i < result.size()-1){
        digit = Character.getNumericValue(c.get(i));
        result.add(digit);
        i++;
        }

        d = toBaseTen(base_in);
        String str = "" + d;
        return str;

    }
    public static void main(String args[]){

    }

    public static double toBaseTen(int base_in){

        i--;
        while(i > 0){

            sum = result.get(i)*(Math.pow(base_in, i));
            i--;
        }
        return sum;
    }

    public int fromBaseTen(int base_out){

    }

}

1 个答案:

答案 0 :(得分:0)

您的转换方法是静态的。这意味着它是一种全班方法。您的ArrayList“c”是NumberBase类的属性。由于convert是静态的,因此它无法访问类中声明的特定于Object的属性(static表示它是类的方法,而不是作用于对象的方法)。

基本上 - 如果要访问您定义的属性,则必须创建为其定义的类的成员。静态方法不需要实际的Object来运行。

如果从convert:

中删除static关键字
public String convert(String input, int base_in, int base_out){
    int i = 0;
    while(i < input.length()){
        c.add(Character.valueOf(input.charAt(i))); //(*****)
        i++;
    }

您可以使用以下方式调用它:

public static void main(String args[]){
    NumberBase b = new NumberBase();
    String s = b.convert("test", 0, 3);
}

因为您的方法是静态的,所以您实际上从未实例化NumberBase类的成员。这意味着您的构造函数从未被调用过:

public NumberBase(){
    i = 0;
    c = new ArrayList <Character>();
}

由于您在构造函数中实例化(创建)了您的ArrayList对象(从未调用过),当convert方法尝试访问ArrayList“c”时,没有任何内容,并且您有异常。

编辑:

如果你的方法必须是静态的,要在其中使用ArrayList,你需要将一个作为参数传递或在方法中实例化一个ArrayList。

ArrayList<Character> c = new ArrayList<>();

^如果你把它放在方法体内(在你使用之前的某个地方!),你就不会得到空指针异常。