Was mach ich falsch? Es werden immer falsch Werte ausgegeben

sepp75

Grünschnabel
Wenn ich als eine Zahl eingebe wird nie etwas ausgegeben. Ich kann einfach nicht nachvollziehen warum.


Java:
public class fakultaet {
 
    public static void main(String[] args) {
              System.out.println("n?");
              try {
              BufferedReader input=new BufferedReader (new InputStreamReader (System.in));
              String nn;
              nn = input.readLine();
              int n = Integer.parseInt(nn);
              int[] fac = new int[n];
              fac[0] = 1;
              for (int h =1; h<= n; h++)
              {
            	  fac[h] = fac[h-1] * h;
              }
              System.out.print(fac[n]);

              }
              catch (Exception ex)
              { 
            	  ex.printStackTrace();
              }

    }
 
}
 
Zuletzt bearbeitet:
Hallo und willkommen im Forum

1. bereits beim kompilieren müsste eine Fehlermeldung erscheinen, dass die variable 's' in Zeile 14 nicht gefunden werden kann
2. Exceptions sind dafür da, dass sie dem Entwickler helfen, Fehler zu finden. Deswegen schreibt man in einen catch-Block üblicherweise
Java:
ex.printStackTrace();
, das bewirkt, dass die Fehlermeldung auf der Konsole ausgegeben werden.

3. Klassennamen schreibt man üblicherweise groß

4. in Zeile 10 erzeugst du ein int[], das ist aber zu klein!

5. warum speicherst du die Ergebnisse zwischendurch? Brauchst du die Zwischenergebnisse? Sonst reicht eine temporäre Variable!

EDIT:
Bei n>=12 bekommst du einen Überlauf, weil der Wertebereich von int zu klein ist.
Würdest du den Typ von fac auf long ändern, kann es immerhin bis n <=20 funktionieren. Willst du größere Fakultäten berechnen, solltest du dir java.math.BigInteger anschauen.
Für ungenauere Berechnungen reicht auch double (statt int), das geht dann bis n<=170
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort
Zu 1. Ich habe den Code auf das wichtigste minimiert, ich muss wohl das "int s;" und "s = h-1" gelöscht haben.

Zu 2. Wusste ich nicht. Danke für den Tipp

Zu 3. Wusste ich auch nicht. (Ist eigentlich ja nicht so wichtig)

Zu 4. Werde wohl kaum ein grösseres Array brauchen. Aber werde es trotzdem mal noch ändern.

Zu 5. Ja die Zwischenergebnisse brauche ich noch.

Es kommt jetzt die Fehlermeldung
Java:
java.lang.ArrayIndexOutOfBoundsException: 3
	at fakultaet.fakultaet.main(fakultaet.java:25)

Ich habe einfach mal "double" statt "int" genommen, das java.math.BigInteger werde ich erst später noch ausprobieren.
 
Zuletzt bearbeitet:
Hi

Das bedeutet, dass du auf mehr Elemente zugreifst, als ein Array hat.

Wenn du zB. ein
Java:
double[] abc = new double[4];
machst, hat das schon 4 doubles, aber so nummeriert:
abc[0] abc[1] abc[2] und abc[3]

In deiner for-Schleife greifst du aber auf
abc[1] abc[2] abc[3] und abc[4]
zu. beim [4] kommt dann die Exception.

Gruß
 
Danke für den Tipp ich dachte eben, dass wenn man einen Array
Java:
double[] abc = new double[4];
so definiert man danach auf abc[0] abc[1] abc[2] abc[3] und abc[4] zugreifen kann.

In dem Fall ist das Problem gelöst.
 
Es kommt jetzt die Fehlermeldung
Java:
java.lang.ArrayIndexOutOfBoundsException: 3
	at fakultaet.fakultaet.main(fakultaet.java:25)

Ich habe einfach mal "double" statt "int" genommen, das java.math.BigInteger werde ich erst später noch ausprobieren.

Das habe ich gemeint mit "dein Array ist zu klein" – und zwar um genau ein Element.
 
Zurück