Programm würft Exception, kann sie aber nicht abfangen!

Status
Nicht offen für weitere Antworten.

BoZA

Mitglied
Servus mal wieder,

ich habe mal mein Programm weiter geschrieben.
Ursprüngliches Thread
hit me
Das ist das Programm mit den Test eines zufallgenerierten Arrays.

Ich habe jetzt das Problem das ich eine angabe machen muss, wie oft der Test durchgefürht wird!
Leider schaffe ich es nicht die Eingabe möglich zu machen + Bedingungen zu setzten (1 <= Tests <= 100000)
ohne das ich es verhindern kann eine Exception abzufangen!

Hier mal der Quellcode.
Main-Klasse:
Code:
import java.io.IOException;

public class SicherheitsprogrammMain
{
  /**
   * Die statische Methode steuert das Programm zum Erraten der Zufallszahl.
   */
  public static void main(String[] args) throws IOException
  {
    Sicherheitsprogramm check = new Sicherheitsprogramm();
  }
}

Sub-Klasse

Code:
import java.io.IOException;
import java.util.Arrays;

public class Sicherheitsprogramm
{
  private int pinChipkarte[];
  private int pinKonto[];
  private int anzahlTestSoll = 0;
  
  public Sicherheitsprogramm()
  {
    //einfacherTest();
    mehrfacherTest();
  }
  public void einfacherTest() // wirde gerade nicht gebaucht der Teil super funzt
  {
    int summeDerEingezogendenKarten = 0;
    do
    {
      pinChipkarte = MeinPinBuilder.lieferePin();
      for (int index = 1; index <= 3; index++)
      {
        pinKonto = MeinPinBuilder.lieferePin();
        if(Arrays.equals( pinChipkarte, pinKonto))
        {
          break;
        }
      }
    summeDerEingezogendenKarten++;
    }
    while(Arrays.equals( pinChipkarte, pinKonto) == false);
    MeineAusgabe.schreibe("Es wurden " + summeDerEingezogendenKarten + " Chipkarten eingezogen");
  }
  
  public void mehrfacherTest()
  {
    int anzahlTestIst = 0;
    int summeDerEingezogendenKarten = 0;
// Hier liegt das Problem ? Wie kann ich hier Bedingungen   [color=red]!!!![/color]
// einfügen ohne                                                              [color=red]!!!![/color]
// das er mir Exceptions wirft die ich nicht abfangen kann    [color=red]!!!![/color]
    try
    {
      MeineAusgabe.schreibe("Wieviele Test sollen durchgeführt werden:");
      anzahlTestSoll = MeineEingabe.erfasseInt();
    }
    catch(IOException e)
    {
      System.out.print("Fehler");
    }
    do
    {
      anzahlTestIst++;
      pinChipkarte = MeinPinBuilder.lieferePin();
      for (int index = 1; index <= 3; index++)
      {
        pinKonto = MeinPinBuilder.lieferePin();
        if(Arrays.equals( pinChipkarte, pinKonto))
        {
          break;
        }
      }
      summeDerEingezogendenKarten ++;
      if(Arrays.equals( pinChipkarte, pinKonto))
      {
        summeDerEingezogendenKarten--;
      }
    }
    while(anzahlTestSoll != anzahlTestIst);
    double durchschnitt = ((double) anzahlTestSoll/((double) anzahlTestSoll - (double) summeDerEingezogendenKarten));
    MeineAusgabe.schreibe("Bei " + anzahlTestSoll + " Tests wurden im Durchschnitt ");
    MeineAusgabe.schreibeDouble(durchschnitt);
    MeineAusgabe.schreibe("Chipkarten eingezogen.\n");
    MeineAusgabe.schreibeInt(anzahlTestIst);
    MeineAusgabe.schreibeInt(summeDerEingezogendenKarten);
  }
}

MeineEingabe-Klasse:
Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class MeineEingabe
{
 private static BufferedReader eingabe =
 	new BufferedReader(new InputStreamReader(System.in));
 
 public static String erfasseText() throws IOException
 {
  return eingabe.readLine();
 }
 /** Die statische Methode kann ganze Zahlen einlesen[/i]*/
 public static int erfasseInt() throws IOException
 {
   return Integer.parseInt(erfasseText());
 }
 /** Die statische Methode kann Komma Zahlen einlesen[/i]*/
 public static double erfasseDouble() throws IOException
 {
  return Double.parseDouble(erfasseText());
 }
}
Die Ausgabe Klasse
Code:
/**

import java.text.DecimalFormat;

public class MeineAusgabe
{ 
  /** Die statische Methode gibt die Anweisung,
  * den Text auf dem Bildschrim auszugeben[/i] */	
  private static DecimalFormat zahlZweistellen = new DecimalFormat("#.##");
  
  public static void schreibe(String text)
  {
    System.out.print(text);
  }
  public static void schreibeInt(int zahl)
  {
    System.out.println(zahl);
  }
  public static void schreibeDouble(double zahl)
  {
    System.out.println(zahlZweistellen.format(zahl));
  }
}
MeineRandom Klasse:

Code:
import java.util.Random;

public class MeinRandom extends Random
{
  /** Erzeugt den Generator */
  public MeinRandom()
  {
  	super();
  }
  /** Die Oeffentliche Methode erzeugt die Zufallszahl aus einem definierten Bereich
   * @param min - die kleinste Grenze des Bereiches
   * @param max - die größte Grenze des Bereiches
   * @return eine ganze Zahl aus dem Bereich*/
  public int nextInt(int min, int max)
  {
  	return this.nextInt(max - min + 1) + min;
  }
}
Und die letzte...

Code:
public class MeinPinBuilder
{
  public MeinPinBuilder()
  {
    super();
  }
  public static int[] lieferePin()
  {
    int[] pin = new int[4];
    MeinRandom zufall = new MeinRandom();
    for(int index = 0; index < pin.length; index++)
    {
      pin[index] = zufall.nextInt(1,9);
    }
    return pin;
  }
}

Ich bedanke mich mal wieder im Voraus ^^
 
Was wird denn wo für eine Exception geworfen?

Das ist ne wichtige Info, nicht jeder hat Zeit/Lust dein Programm zu kopieren, kompilieren, auszuführen und gucken, wo die Exception geworfen wird.
 
Ok ich hab den Kommentar im Quellcode gefunden, was für bedingungen willst du denn einfügen? und wie hobit schon ragt welche exception?
achja beim durchschauen ist mir noch was aufgefallen:
Code:
public static int erfasseInt() throws IOException
{
   return Integer.parseInt(erfasseText());
}
/** Die statische Methode kann Komma Zahlen einlesen[/i]*/
public static double erfasseDouble() throws IOException
{
  return Double.parseDouble(erfasseText());
}
Die beiden werden keine IOException geben sondern eine NumberFormatException
 
Moinsen,

hab mich wahrscheinlich etwas schwirig ausgedrückt. Sry dafür.
Ich denke das Programm läuft problemlos. Allerdings will ich noch zwei Bedingungen einfügen,
was die einzulesende Zahl betrifft.

einfügen will ich das die "anzahlTestSoll" nicht unter 1 ist (anzahlTestSoll <= 1)
und das die Test nicht größer als 100000 seien soll (anzahlTestSoll >= 100000)

Code:
if(anzahlTestSoll <= 1)
{
  MeineAusgabe.schreibe("Bitte geben Sie eine Zahl zwischen 1 und 100000 ein");
  anzahlTestSoll = MeineEingabe.erfasseInt();
}
else if(anzahlTestSoll >= 100000)
{
  MeineAusgabe.schreibe("Bitte geben Sie eine Zahl zwischen 1 und 100000 ein");
  anzahlTestSoll = MeineEingabe.erfasseInt();
}

Und genau hier kann ich die Exception nicht abfangen, da ich nicht weiss, wie ich es mit try, catch abfangen kann.

Sub-Klasse Zeile 40 - 53

Danke schön.
 
Dabei wird doch gar keine Exception geworfen!? Oder willst du eine Exception werfen, wenn eine von den beiden If-Abfragen zutrifft? Falls ja:

Code:
throw new YourException("your description");
 
Code:
import java.io.IOException;
import java.util.Arrays;

public class Sicherheitsprogramm
{
  private int pinChipkarte[];
  private int pinKonto[];
  private int anzahlTestSoll = 0;
  
  public Sicherheitsprogramm()
  {
    //einfacherTest();
    mehrfacherTest();
  }
  public void einfacherTest()
  {
    int summeDerEingezogendenKarten = 0;
    do
    {
      pinChipkarte = MeinPinBuilder.lieferePin();
      for (int index = 1; index <= 3; index++)
      {
        pinKonto = MeinPinBuilder.lieferePin();
        if(Arrays.equals( pinChipkarte, pinKonto))
        {
          break;
        }
      }
    summeDerEingezogendenKarten++;
    }
    while(Arrays.equals( pinChipkarte, pinKonto) == false);
    MeineAusgabe.schreibe("Es wurden " + summeDerEingezogendenKarten + " Chipkarten eingezogen");
  }
  
  public void mehrfacherTest()
  {
    int anzahlTestIst = 0;
    int summeDerEingezogendenKarten = 0;
    MeineAusgabe.schreibe("Wieviele Test sollen durchgeführt werden:");
    anzahlTestSoll = MeineEingabe.erfasseInt();
    if(anzahlTestSoll <= 1)
    {
      MeineAusgabe.schreibe("Bitte geben Sie eine Zahl zwischen 1 und 100000 ein");
      anzahlTestSoll = MeineEingabe.erfasseInt();
    }
    else if(anzahlTestSoll >= 100000)
    {
      MeineAusgabe.schreibe("Bitte geben Sie eine Zahl zwischen 1 und 100000 ein");
      anzahlTestSoll = MeineEingabe.erfasseInt();
    } 
    /**try
    {
      MeineAusgabe.schreibe("Wieviele Test sollen durchgeführt werden:");
      anzahlTestSoll = MeineEingabe.erfasseInt();
    }
    catch(IOException e)
    {
      System.out.print("Fehler");
    }*/
    do
    {
      anzahlTestIst++;
      pinChipkarte = MeinPinBuilder.lieferePin();
      for (int index = 1; index <= 3; index++)
      {
        pinKonto = MeinPinBuilder.lieferePin();
        if(Arrays.equals( pinChipkarte, pinKonto))
        {
          break;
        }
      }
      summeDerEingezogendenKarten ++;
      if(Arrays.equals( pinChipkarte, pinKonto))
      {
        summeDerEingezogendenKarten--;
      }
    }
    while(anzahlTestSoll != anzahlTestIst);
    double durchschnitt = ((double) anzahlTestSoll/((double) anzahlTestSoll - (double) summeDerEingezogendenKarten));
    MeineAusgabe.schreibe("Bei " + anzahlTestSoll + " Tests wurden im Durchschnitt ");
    MeineAusgabe.schreibeDouble(durchschnitt);
    MeineAusgabe.schreibe("Chipkarten eingezogen.\n");
    MeineAusgabe.schreibeInt(anzahlTestIst);
    MeineAusgabe.schreibeInt(summeDerEingezogendenKarten);
  }
}

Fehler @ line 41 unreported exception java.io.IOException; must be caught or declared to be thrown

Fehler @ line 45 unreported exception java.io.IOException; must be caught or declared to be thrown

Fehler @ line 50 unreported exception java.io.IOException; must be caught or declared to be thrown

Verstehst du was ich meine`?
 
Aaaaaahhhhhhhhh ... das hätte gleich an den Anfang gemusst. Dann wär dein Problem schon längst gelöst. Einfach einen try-catch block um die entsprechenden Zeilen.

Bsp.:

Code:
try {
   anzahlTestSoll = MeineEingabe.erfasseInt(); 
}
catch (IOException e) {
   e.printStackTrace();
}
 
Hobbit_Im_Blutrausch hat gesagt.:
Aaaaaahhhhhhhhh ... das hätte gleich an den Anfang gemusst. Dann wär dein Problem schon längst gelöst. Einfach einen try-catch block um die entsprechenden Zeilen.

Bsp.:

Code:
try {
   anzahlTestSoll = MeineEingabe.erfasseInt(); 
}
catch (IOException e) {
   e.printStackTrace();
}

Supi, dank dir jetzt muss ich nur noch eine do while Schleife rum hauen dann geht es perfekt.

Danke dir!
 
Trotzdem möchte ich nochmal anmerken das bei erfasseInt zwar eine IOException auslösen kann, die wird dann allerdings von erfasseText ausgelöst, genauso wahrscheinlich ist eine NumberFormatException, nur damit du nicht gleich verzweifelst, wenn mal ne exception kommt wen du nen buchstaben eingibst.
 
function hat gesagt.:
Trotzdem möchte ich nochmal anmerken das bei erfasseInt zwar eine IOException auslösen kann, die wird dann allerdings von erfasseText ausgelöst, genauso wahrscheinlich ist eine NumberFormatException, nur damit du nicht gleich verzweifelst, wenn mal ne exception kommt wen du nen buchstaben eingibst.

Jo, weiß ich bescheit, danke dir!
 
hi, ich noch mal....

Die eingabe funzt jetzt tadellos (1 <= anzahlTestSoll <= 100000)

aber irgendwie führt er die darauf folgende do-while Schleife nicht richtig aus bzw. er verfängt sich und arbeitet und aufhaltssam.

Problematik bei Zeile 35 - 82

Code:
import java.io.IOException;
import java.util.Arrays;

public class Sicherheitsprogramm
{
  private int pinChipkarte[];
  private int pinKonto[];
  private int anzahlTestSoll = 0;
  
  public Sicherheitsprogramm()
  {
    //einfacherTest();
    mehrfacherTest();
  }
  public void einfacherTest()
  {
    int summeDerEingezogendenKarten = 0;
    do
    {
      pinChipkarte = MeinPinBuilder.lieferePin();
      for (int index = 1; index <= 3; index++)
      {
        pinKonto = MeinPinBuilder.lieferePin();
        if(Arrays.equals( pinChipkarte, pinKonto))
        {
          break;
        }
      }
    summeDerEingezogendenKarten++;
    }
    while(Arrays.equals( pinChipkarte, pinKonto) == false);
    MeineAusgabe.schreibe("Es wurden " + summeDerEingezogendenKarten + " Chipkarten eingezogen");
  }
  
  public void mehrfacherTest()
  {
    int anzahlTestIst = 0;
    int summeDerEingezogendenKarten = 0;
    MeineAusgabe.schreibe("Wieviele Test sollen durchgeführt werden: ");
    do
    {
      try
      {
        anzahlTestSoll = MeineEingabe.erfasseInt();
      }
      catch(IOException e)
      {
        e.printStackTrace(); 
      }
      if(anzahlTestSoll < 1 || anzahlTestSoll > 100000)
      {
        MeineAusgabe.schreibe("Bitte geben Sie eine Zahl zwischen 1 und 100000 ein: ");
      }
    }
    while((anzahlTestSoll < 1 && anzahlTestSoll > 100000) == false); 
    do
    {
      anzahlTestIst++;
      pinChipkarte = MeinPinBuilder.lieferePin();
      for (int index = 1; index <= 3; index++)
      {
        pinKonto = MeinPinBuilder.lieferePin();
        if(Arrays.equals( pinChipkarte, pinKonto))
        {
          break;
        }
      }
      summeDerEingezogendenKarten ++;
      if(Arrays.equals( pinChipkarte, pinKonto))
      {
        summeDerEingezogendenKarten--;
      }
    }
    while(anzahlTestSoll != anzahlTestIst);
    double durchschnitt = ((double) anzahlTestSoll/((double) anzahlTestSoll - (double) summeDerEingezogendenKarten));
    MeineAusgabe.schreibe("Bei " + anzahlTestSoll + " Tests wurden im Durchschnitt ");
    MeineAusgabe.schreibeDouble(durchschnitt);
    MeineAusgabe.schreibe("Chipkarten eingezogen.\n");
    MeineAusgabe.schreibeInt(anzahlTestIst);
    MeineAusgabe.schreibeInt(summeDerEingezogendenKarten);
  }
}
 
sicher, dass es nicht nur die Zeilen 57 bis 75 betrifft!?

welchen Wert hat denn anzahlTestIst und welchen anzahlTestSoll, bevor es in die Schleife geht (also zwischen Zeile 56 und 57)?
 
Hobbit_Im_Blutrausch hat gesagt.:
sicher, dass es nicht nur die Zeilen 57 bis 75 betrifft!?

welchen Wert hat denn anzahlTestIst und welchen anzahlTestSoll, bevor es in die Schleife geht (also zwischen Zeile 56 und 57)?
jeweils 0

ist klappt, das er mich so lange fragt bist der wert zwischen 1 und 100000 liegt, aber dann mag er nimmer.

Und Zeile 57 bis 75 hat immer problemlos geklappt.....
 
(anzahlTestSoll < 1 && anzahlTestSoll > 100000) <- das wird immer false liefern, weil beide zustände gleichzeitig nie erfüllt werden können setz ein || da zwischen
 
BoZA hat gesagt.:
Hobbit_Im_Blutrausch hat gesagt.:
sicher, dass es nicht nur die Zeilen 57 bis 75 betrifft!?

welchen Wert hat denn anzahlTestIst und welchen anzahlTestSoll, bevor es in die Schleife geht (also zwischen Zeile 56 und 57)?
jeweils 0

ist klappt, das er mich so lange fragt bist der wert zwischen 1 und 100000 liegt, aber dann mag er nimmer.

Und Zeile 57 bis 75 hat immer problemlos geklappt.....

Achso, welche Schleife meinst du denn jetzt? Ich denke die obere funktioniert jetzt!?
 
function hat gesagt.:
(anzahlTestSoll < 1 && anzahlTestSoll > 100000) <- das wird immer false liefern, weil beide zustände gleichzeitig nie erfüllt werden können setz ein || da zwischen

das bringt keine Besserung

Aber es müssen doch beide Bedingung true seien, damit der Bereich stimmt oder irre ich mich im moment da?
 
Hobbit_Im_Blutrausch hat gesagt.:
BoZA hat gesagt.:
Hobbit_Im_Blutrausch hat gesagt.:
sicher, dass es nicht nur die Zeilen 57 bis 75 betrifft!?

welchen Wert hat denn anzahlTestIst und welchen anzahlTestSoll, bevor es in die Schleife geht (also zwischen Zeile 56 und 57)?
jeweils 0

ist klappt, das er mich so lange fragt bist der wert zwischen 1 und 100000 liegt, aber dann mag er nimmer.

Und Zeile 57 bis 75 hat immer problemlos geklappt.....

Achso, welche Schleife meinst du denn jetzt? Ich denke die obere funktioniert jetzt!?

Die obere hat dann funktioniert nach euern Tipps, aber die anderen unterhalb der ersten do while Schleife hat eigentlich schon immer funktioniert.

Jetzt eben nicht mehr und ich kann es mir nicht erklären :bahnhof:
 
ja, aber ich kanns dir erklären. Wenn beide (ist und soll) auf 0 stehen, und du in deiner fußgesteuerten Schleife das ist oder das soll am Anfang immer um 1 erhöhst (was du tust), dann ist "ist" und "soll" niemals gleich (da du nur eine von beiden Variablen erhöhst) und du hast dir so eine endlosschleife erzeugt.
 
Hobbit_Im_Blutrausch hat gesagt.:
ja, aber ich kanns dir erklären. Wenn beide (ist und soll) auf 0 stehen, und du in deiner fußgesteuerten Schleife das ist oder das soll am Anfang immer um 1 erhöhst (was du tust), dann ist "ist" und "soll" niemals gleich (da du nur eine von beiden Variablen erhöhst) und du hast dir so eine endlosschleife erzeugt.
Stimmt es klappt nur wenn ich ein Test mache....
 
achso, dann war ich in der falschen schleife...
aber trotzdem es sollte in einer schleife keine abbruch bedingung geben die sich niemals erfüllt.
 
Hobbit_Im_Blutrausch hat gesagt.:
und d. h. jetzt für uns?

konnte den fehler leider noch nicht lösen.... tüftel noch...

hmm wenn ich die eingabe auskommentiere und dafür anzahlTestSoll einen Wert zuweise, dann klappt alles wie gehabt.
 
So der Fehler war simple, wahrscheinlich wieder zu simpel für mein schnelllebiges Auge.

Code:
while((anzahlTestSoll < 1 || anzahlTestSoll >= 100000) == false);

Wenn anzahlTestSoll < 1 ist liefert es true draus folgt das == false ist gleich was?? false richtig!
Und das ist der Fehler er darf ja nicht aufhören wenn eins davon zutrifft.

Das gleich spielchen bei anzahlTestSoll >= 100000 wenn das besagte zutrifft wird ein true geliefert == und mit false verglichen und das Ergebnis ist wieder false.
Und wieder darf er die Do Bedingung nicht abbrechen.

Aber
Code:
while((anzahlTestSoll < 1 || anzahlTestSoll >= 100000) == true);

Macht alles richtig und unterbricht die do Schleife, wenn keins der besagten sachen zu trifft...

Juhu... danke euch Jungs besonders Hobbit_im_Blutrausch und function
 
BoZA hat gesagt.:
Code:
while((anzahlTestSoll < 1 || anzahlTestSoll >= 100000) == true);

Schreibe bei Boolean-Ausdrücken niemals ==true oder ==false

Damit machst du dir das Leben nur unnötig kompliziert.

Code:
while (anzahlTestSoll < 1 || anzahlTestSoll >= 100000);

Das ist doch auch leicht zu verstehen:

Solange anzahlTestSoll kleiner als 1
oder
anzahlTestSoll größer oder gleich 100000
ist...
 
Leroy42 hat gesagt.:
BoZA hat gesagt.:
Code:
while((anzahlTestSoll < 1 || anzahlTestSoll >= 100000) == true);

Schreibe bei Boolean-Ausdrücken niemals ==true oder ==false

Damit machst du dir das Leben nur unnötig kompliziert.

Code:
while (anzahlTestSoll < 1 || anzahlTestSoll >= 100000);

Das ist doch auch leicht zu verstehen:

Solange anzahlTestSoll kleiner als 1
oder
anzahlTestSoll größer oder gleich 100000
ist...

Ja stimmt auch wieder! Danke auch dir...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben