java.lang.NullPointerException

HD1920

Mitglied
Hallo, ich habe ein Problem mit dem folgenden Code (nutze Eclipse, soll eigentlich die 300-ste Fibonacci-Zahl ausgeben). Und zwar erzeugt er folgende java.lang.NullPointerException:

Exception in thread "main" java.lang.NullPointerException
at fibonacci.PhiFuncs.mulphi(Fibonacci.java:21)
at fibonacci.PhiFuncs.potphi(Fibonacci.java:35)
at fibonacci.PhiFuncs.fib(Fibonacci.java:44)
at fibonacci.Fibonacci.main(Fibonacci.java:7)
Anscheinend tritt der erste Fehler in mulphi() auf. Kann mir irgendjemand helfen, die Exception zu vermeiden (d. h. den Code so zu verbessern, dass sie nicht mehr auftritt)?

Java:
package fibonacci;
import java.math.BigInteger;

public class Fibonacci {
	public static void main(String[] args) {
		int n=300;
		System.out.println(PhiFuncs.fib(n));
	}
}

class PhiFuncs {
	public static BigInteger[] addphi(BigInteger[] a, BigInteger[] b) {
		BigInteger[] retval = new BigInteger[2];
		retval[0] = a[0].add(b[0]);
		retval[1] = a[1].add(b[1]);
		return retval;
	}
	
	public static BigInteger[] mulphi(BigInteger[] a, BigInteger[] b) {
		BigInteger[] retval = new BigInteger[2];
		retval[0] = a[0].multiply(b[0]).add(a[1].multiply(b[1]));
		retval[1] = a[0].multiply(b[1]).add(a[1].multiply(b[0])).add(a[1].multiply(b[2]));
		return retval;
	}
	
	public static BigInteger[] potphi(BigInteger[] a, int b) {
		BigInteger[] retval = new BigInteger[2];
		if (b == 0) {
			retval[0] = BigInteger.ONE;
			retval[1] = BigInteger.ZERO;				
		} else {
			if (b % 2 == 1) {
				return mulphi(potphi(a, (b-1)), a);
			} else {
				return potphi(mulphi(a, a), (b / 2));
			}
		}
		return retval;
	}
	
	public static BigInteger fib(int a) {
		BigInteger[] retval_ = new BigInteger[2];
		BigInteger[] initvals = new BigInteger[2];
		retval_ = potphi(initvals, a);
		BigInteger retval = retval_[1];
		return retval;
	}
}

Edit: Ich habe schon das Forum nach ähnlichen Problemen durchsucht und auch schon Google angestrengt. In fast allen Fällen lag es, anders als bei mir, daran, dass das Objekt nicht mit new initialisiert wurde.
 
Zuletzt bearbeitet:
NullPointerExceptions treten auf, wenn ein Objekt null ist oder nicht initialisiert wurde.

Bei dir tritt dieser Fehler auf, weil du deine BigInteger Objekte in den Arrays nicht initialisierst.
 
Moin,

Java:
public static BigInteger fib(int a) 
{
    BigInteger[] retval_ = new BigInteger[2];
    BigInteger[] initvals = new BigInteger[2];
    retval_ = potphi(initvals, a); // !!!
    BigInteger retval = retval_[1];
    return retval;
}

Du deklarierst die Variable "initvals" zwar, aber initialisierst sie nicht.
Darum ist sie Bei der Übergabe an "potphi" immer noch NULL und es kommt bei der Verwendung die NPE!

Gruß
Klaus
 
Hi,
ich habe auch mal ein kleines Programm geschrieben, dass die nte Fibonacci-Zahl berechnet.
Allerdings etwas kürzer mit vermutlich mehr erforderlichen Rechenschritten.
Wenn du long durch BigInteger ersetzt, solltest du damit zum Ziel kommen.

Das Programm war ursprünglich darauf ausgelegt alle Fibonacci-Zahlen auszugeben bis n.

Java:
public class Fibonacci {

	public void getFibonacci(int n){
		long a=0;
		long b=1;
		
		for(int i=1;i<n;i++){
			b=a+b;
			a=b-a;
			}
		
		System.out.println("Die "+n+"te Fibonacci-Zahl lautet: "+a);
	}
	
	public static void main(String[] args) {
		Fibonacci fibo = new Fibonacci();
		fibo.getFibonacci(10);
		
	}

}

Gruß
Lonsdaleit

€dit: Mit long kommst du bis zur 250sten Fibonaccizahl (434636299069558690)!
 
Zuletzt bearbeitet:
@Lonsdaleit: Die Mathematik ist nicht das Problem, "meine" Version sollte deutlich schneller sein. Außerdem ist deine 250ste Fibonacci-Zahl falsch. Sie ist 7896325826131730509282738943634332893686268675876375.
@VfL-Freak: Danke, das war´s! Ich initialisiere initvals nun mit:
Java:
		initvals[0] = BigInteger.ZERO;
		initvals[1] = BigInteger.ONE;
Dann ersetze ich
Code:
retval[1] = a[0].multiply(b[1]).add(a[1].multiply(b[0])).add(a[1].multiply(b[2]));
, welches eine java.lang.ArrayIndexOutOfBoundsException auslöst, durch
Code:
retval[1] = a[0].multiply(b[1]).add(a[1].multiply(b[0])).add(a[1].multiply(b[1]));
und alles funktioniert wie gewünscht.
@anti-held: Ich habe nur initvals nicht initialisiert.
 
Zuletzt bearbeitet:

Zurück
Oben