0

我正在制作一个从基地 a 到基地 b 的转换器。这是说我有一个空指针异常。我不知道如何真正解决它。我知道这可能与数组列表越界有关,但我不确定。我是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){

    }

}

4

1 回答 1

0

您的转换方法是静态的。这意味着它是一个类范围的方法。您的 ArrayList "c" 是 NumberBase 类的属性。由于 convert 是静态的,它无法访问类中声明的特定于对象的属性(静态意味着它是类的方法,而不是作用于对象的方法)。

基本上 - 如果您想访问您定义的属性,您必须创建它们所定义的类的成员。静态方法不需要实际的 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<>();

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

于 2013-09-06T01:01:01.147 回答