# Kontenverwaltung



## Sindbad1983 (13. Mrz 2005)

Also hier ist das neue Beispiel:  :bae: 

Es sollen unterschiedliche Bankkonten als Klassen realisiert werden. Implementieren
Sie eine Basisklasse Account und Spezialisierungen für Girokonten (Klasse TransferAccount),
Sparkonten (Klasse SavingsAccount) und Kreditkonten (Klasse CreditAccount).

Basisklasse Account:
Jedes Konto hat eine eindeutige Kontonummer und einen aktuellen Kontostand. Deklarieren Sie
entsprechende Felder und Zugriffsmethoden. Die Kontonummer muss eindeutig sein und sollte daher vom
Programm generiert und unveränderlich sein. Überlegen Sie die Sichtbarkeitsattribute für die Felder und
ob auch eine set-Methode definiert werden soll (d.h. ob das Feld von außen gesetzt werden kann).

Hinweise:
- Zur Vereinfachung können Sie für die Geldbeträge den Typ int verwenden.
- Verwenden Sie ein static int-Feld nextId, um die Kontonummern zu generieren.


Man kann von einem Konto Geld abheben und auf ein Konto Geld einzahlen. Definieren Sie dazu
entsprechende Methoden.

Es soll möglich sein, die letzte Behebung oder Einzahlung rückgängig zu machen. Realisieren Sie dazu
eine Methode void undoLastOperation().

Definieren Sie weiters eine Methode public String toString(), um eine String-Repräsentation
des Kontos zu generieren.

Spezialisierungen TransferAccount, SavingsAccount und CreditAccount:
Leiten Sie dann Unterklassen TransferAccount für Girokonten, SavingsAccount für Sparkonten
und CreditAccount für Kreditkonten ab. Dabei sind folgende Zusätze und Einschränkungen zu
beachten:

 Girokonten:
- Haben eine maximale Überziehung. Über diese Grenze darf das Konto nicht belastet
werden.

 Sparkonten:
- Dürfen nur im Haben sein (Kontostand > 0).

 Kreditkonten:
- Kreditkonten werden anfänglich mit einem Soll (Kontostand < 0) angelegt. Man kann
darauf nur einzahlen (Kredit zurückzahlen) und nicht weiter beheben.
- Auf das Kreditkonto kann nicht mehr eingezahlt werden als der ausstehende Kredit
ausmacht (Kontostand darf nicht > 0 werden).
Prüfen Sie alle diese Bedingungen in den Methoden. Die Methoden sollen bei Verletzung von
Bedingungen Exceptions auslösen. Definieren Sie sich dazu eine eigene Exception-Klasse.


----------



## Sindbad1983 (13. Mrz 2005)

Ich hab gleich mal mit den Schnittstellen der Basisklasse Account begonnen und die wichtigsten Variablen deklariert :


```
public class Account{

	//eindeutige Kontonummer
	private String kontonummer=gibKontonummer();

	private int u=0;
	private int o=9;

	//??? weiß jemand, was das Feld bedeuten könnte? ich hab ja eh kontonummer!  ???:L 
	static int nextId;

	//aktueller Kontostand
	private int kontostand=0;

	//generieren einer eindeutigen Kontonummer
	public String gibKontonummer(){

		StringBuffer sb=new StringBuffer();
		String s;

		for(int i=0;i<=5;i++){

		sb.append(u + Math.floor(Math.random() * (o-u+1)));

		}

		return s=sb.toString();


	}

	//abrufen des Kontostandes
	public int getKontostand(){
		return kontostand;
	}

	//Geld einzahlen
	public void zahleEin(int betrag){
		kontostand=kontostand+betrag;

	}

	//Geld abheben
	public void hebeAb(int betrag){
		kontostand=kontostand-betrag;

	}

	/*
	//letzte Behebung oder Einzahlung rückgängig machen
	public void undoLastOperation(){

	}*/

	//Ausgabe
	public String toString(){

		String s="Kontonummer:"+kontonummer+" "+"Kontostand:"+kontostand;
		return s;


	}

}
```


Erste Probleme hab ich bei der Generierung einer eindeutigen Kontonummer!
Habs mit StringBuffer probiert..geht aber leider nicht!
Soll wohl eine 6-stellige Zahl sein!

z.B. 521452

aber wie geht das? wie bekomm ich eine Zufallszahl mit 6 Stellen in int???
bei mir wirds immer double-> und wenn ich (int) davor schreib, schreit der Compiler!  :cry: 
ist mein Ansatz oben falsch oder hab ich wieder was vergessen?

das nextId ist mir auch nóch nicht ganz klar, wofür ich das brauch!

und das mit dem rückgängig machen der letzten Operation... :autsch: 

es könnt vielleicht gehn, indem man das in eine Datei speichert  , nicht?  :bahnhof: 
oder mit temp-Variablen oder ähnlichem!

naja..muss ich mir noch überlegen!
Vielleicht könnt ihr mir ja wieder zur Seite stehen!

Gute Nacht!


----------



## abollm (14. Mrz 2005)

> aber wie geht das? wie bekomm ich eine Zufallszahl mit 6 Stellen in int???



Z.B. wie folgt, aber bitte nur den randomInt-Teil betrachten. Außerdem noch eine Abfrage wg. Größenüber- und -unterschreitung der Integer-Zahl einbauen:


```
import java.util.*;

/** 
 * Beispiel, um mit Hilfe von java.util.Random.next*()
 * Zufallszahlen zu erzeugen.
 */
public class MyRandom1 {
	public static void main(String[] argv) {
		// java.util.Random-Meth. sind non-static
		// ->
		Random r = new Random();
		for (int i=0; i<10; i++)
		System.out.println("Double mit Hilfe von java.util.Random: " + r.nextDouble());
		int randomInt = 0;
		for (int i=0; i<10; i++) {
		   randomInt = r.nextInt();
		   if (randomInt >= 0)
		      System.out.println("Integer ["+i +"] mit Hilfe von java.util.Random: " + randomInt);
		   else
		   	  System.out.println("Integer ["+i +"] = leider negativ!");
		}
		// <-
	}
}
```


----------



## mic_checker (14. Mrz 2005)

Ich würde es nicht so machen, also allgemein nicht eine best. Methode aufrufen, die dann Zufallszahlen generiert.

Grund:
Die Kontonummer muss eindeutig sein, somit müsstest du erst jedesmal überprüfen ob die Kontonummer schon mal aufgetaucht ist (klar , ging mit Hashset ganz schnell) - aber wozu der ganze Aufwand?

-> 



> Verwenden Sie ein static int-Feld nextId, um die Kontonummern zu generieren.


Wenn du ein Objekt erzeugst, generierst du die Kontonummer mit Hilfe von nextId, willst du z.B. Kontennummern in der Form:

####, wobei die erste Kontonummer 6000 ist - dann könntest du so was machen:


```
kontonr = 6000 + nextId;
```

nextId wird bei jeder Objekterzeugung inkrementiert, du kannst eine get Methode für die Kontonummer schreiben, aber keine set !

Der Sinn und Zweck von nextId ist, das du so genau mitzählen kannst wie viele Konten erzeugt wurden etc., somit muss die Variable statisch sein ! Theoretisch könntest du auch sagen: meine nextId ist jetzt keine Kontonummer, aber scheinbar will das der Aufgabensteller nicht


----------



## mic_checker (14. Mrz 2005)

Sindbad1983 hat gesagt.:
			
		

> und das mit dem rückgängig machen der letzten Operation... :autsch:
> 
> es könnt vielleicht gehn, indem man das in eine Datei speichert  , nicht?  :bahnhof:
> oder mit temp-Variablen oder ähnlichem!



Hab das Prog mal geschrieben, poste natürlich nicht den ganzen Code :


```
/*
	* Wird dazu verwendet den zuletzt eingezahlten / abgehobenen Betrag zu speichern.
	* Zahlt der User ein, so wird lastsum auf das negative des eingezahlten Betrages gesetzt.
	* Hebt der User ab, so wird lastsum auf den abgehobenen Betrag gesetzt.
	* Später in undoLastOperation() wird lastsum lediglich zum Kontostand "addiert".
	*/
	private int lastsum = 0;
```

Prinzip:
User zahlt 'sum' ein, somit wäre das rückgängig machen gleichzusetzen mit dem abheben von 'sum'
User hebt 'sum' ab, somit wäre das rückgängig machen gleichzusetzen mit dem einzahlen von 'sum'
-> In einzahlen(int sum) wird lastsum auf -sum gesetzt und in hebeAb(int sum) auf sum.

In undoLastOperation() steht dann nur noch folgendes:


```
public void undoLastOperation() {
		kontostand += lastsum;
		lastsum = 0;
	}
```

So wird, je nachdem addiert oder subtrahiert, abhängig davon ob eingezahlt wurde oder abgehoben wurde.
Btw. bisher macht er es so das ein erneuter Aufruf von undoLastOperation (ohne zwischenzeitiges abheben/einzahlen) zu keiner Änderung führt. Man könnte natürlich überlegen ob ein erneuter Aufruf dazu führen sollte, dass das vorherige rückgängig machen wieder rückgängig gemacht wird - aber das ist ein anderes thema


----------



## Sindbad1983 (14. Mrz 2005)

boa, das ist eine tolle Idee!
Ich werd versuchen, dass ich das mal implementiere!
Leider werd ich erst am Mi dazukommen, weil ich heut und morgen so viel arbeiten muss!
Aber danke vorerst mal!
Jetzt ist es mir wesentlich klarer geworden!

Also meinst du das so, dass nextId z.B. mit 1 beginnt und dann bei jeder neuen Kontoeröffnung um 1 erhöht wird! So weiß ich dann(wenn ich nextId) ausgib, wieviele Konten aktuell vorhanden sind! ;-)
Ich könnt die aktuelle Zahl in eine Datei speichern, damit sie dann immer verfügbar ist, oder?

Warum komm ich nicht auf solche Ideen? :-(
Danke!
ciao,Tommy


----------



## mic_checker (14. Mrz 2005)

Sindbad1983 hat gesagt.:
			
		

> Also meinst du das so, dass nextId z.B. mit 1 beginnt und dann bei jeder neuen Kontoeröffnung um 1 erhöht wird! So weiß ich dann(wenn ich nextId) ausgib, wieviele Konten aktuell vorhanden sind! ;-)
> Ich könnt die aktuelle Zahl in eine Datei speichern, damit sie dann immer verfügbar ist, oder?



Im Konstruktor kannst du nextId inkrementieren - beachte das du keine set Methode schreibst, da sonst nicht mehr gewährleistet ist, dass die Kontonummer eindeutig ist.
Wenn du bei einem Neustart des Programms nur wissen willst wo er jetzt weiter machen soll (bzgl. nextId und kontonummer), dann würde es reichen es in einer Datei zu speichern.

Das wirst du schon schnell hinkriegen


----------



## Sindbad1983 (16. Mrz 2005)

Hi!

So, ich hab jetzt wieder ein bissl programmiert und es funktioniert schon einiges!  :lol: 

Nur hab ich grad Probleme bei der Unterklasse TransferAccount:

bei der Überprüfung des Limits:

wenn ich ein Limit von z.B. -1000 setze und einen Kontostand von 0 und dann 500 abhebe passt das klarerweise,aber
wenn ich jetzt nochmal z.B. 501 abhebe (und somit überm Limit bin) , möchte ich dass er eine Meldung ausgibt! Oder vielleicht eine Exception!
Das wird dann gleich meine nächste Frage sein... :bahnhof: ..wie sowas funktioniert?!?!


Vielleicht kann mir da bitte jemand helfen!
Es geht um die Methoden checkLimit und hebeAb!




```
public class Account{

	
	private int start=1001;
	public  int kontonummer;
	private int lastsum=0;
	static int nextId=0;
	private int kontostand=0;

	public Account(){
		int kontonummer=getKontonummer();
		nextId++;

	}


	//gibt Anzahl der bereits vorhandenen Konten aus
		public static int getAnzahlKonten(){
			return nextId;
	}


	//generieren einer eindeutigen Kontonummer
	public int getKontonummer(){

		kontonummer=start+nextId;
		return kontonummer;
	}


	//abrufen des Kontostandes
	public int getKontostand(){
		return kontostand;
	}

	//Geld einzahlen
	public void zahleEin(int betrag){
		kontostand=kontostand+betrag;
		lastsum=-betrag;

	}

	//Geld abheben
	public void hebeAb(int betrag){
		kontostand=kontostand-betrag;
		lastsum=+betrag;

	}


	//letzte Behebung oder Einzahlung rückgängig machen
	public void undoLastOperation(){
		kontostand=kontostand+lastsum;

	}

	//Ausgabe
	public String toString(){

		String s="Kontonummer:"+kontonummer+" aktueller Kontostand:"+kontostand;
		return s;


	}

}
```


------------------------------


```
public class TransferAccount extends Account{


	int limit;


	public TransferAccount(){
		super();

	}


	public void setLimit(int betrag){

		limit=betrag;
	}

	public int getLimit(){
		return limit;
	}


//in diesen 2 Methoden liegt wohl der Hund begraben!!!!!!!!  ???:L 

	public boolean checkLimit(int betrag){

		int kontostand=getKontostand();

		if(kontostand-betrag>limit){
			return false;
		}
		else{
			return true;
		}


	}




	public void hebeAb(int betrag){

		boolean ergebnis=checkLimit(betrag);

		if(true){


		super.hebeAb(betrag);
		}
		else{
			System.out.println("Der Betrag kann nicht abgehoben werden!! ->Limit!");
		}


	}

	public String toString(){


		String s;
		s=super.toString()+" Limit liegt bei:"+limit;
		return s;
	}



}
```


-----------------------------------------


```
public class TestAccount{


	public static void main(String [] args){

		Account a1=new Account();
		Account a2=new Account();
		TransferAccount a3=new TransferAccount();

		a1.zahleEin(200);
		a1.hebeAb(50);
		a1.zahleEin(100);
		a1.undoLastOperation();

		a2.zahleEin(1000);
		a2.hebeAb(345);

		a3.setLimit(-1000);
		a3.zahleEin(100);
		a3.hebeAb(1000);
		a3.hebeAb(200); // das dürfte er normalerweise nicht mehr abziehen, sondern stattdessen Meldung ausgeben!

		System.out.println(a1);
		System.out.println(a2);
		System.out.println(a3);

		int getAnzahl=Account.getAnzahlKonten();

		System.out.println("Anzahl der bereits vorhandenen Konten: "+getAnzahl);
	}

}
```


Gibts sonstige Verbesserungsvorschläge?
Danke!


----------



## abollm (16. Mrz 2005)

Zwei Fehler habe ich auf die Schnelle entdeckt, s. Code:

```
[..]
	public boolean checkLimit(int betrag) {

		int kontostand = getKontostand();

		System.out.println("Kontostand-Betrag: "+(kontostand - betrag));
		System.out.println("Limit: "+(limit));
		//if ( (kontostand - betrag) > limit) {   <--- Das ist falsch, oder du müsstest u.a. if-Klausel invertieren
		if ( kontostand - betrag < limit) {
			return false;
		} else {
			return true;
		}

	}

	public void hebeAb(int betrag) {

		boolean ergebnis = checkLimit(betrag);

		if (ergebnis) {
			super.hebeAb(betrag);
		} else {
			System.out
					.println("Der Betrag kann nicht abgehoben werden!! ->Limit!");
		}

	}
[..]
```


----------



## mic_checker (16. Mrz 2005)

Sindbad1983 hat gesagt.:
			
		

> Das wird dann gleich meine nächste Frage sein... :bahnhof: ..wie sowas funktioniert?!?!



Du könntest deine eigene Exception schreiben (sollst du ja auch oder?), z.B. so:


```
public class InvalidAccountOperationException extends Exception {
	public InvalidAccountOperationException() {
		super();
	}
	
	public InvalidAccountOperationException(String err) {
		super(err);
	}
}
```

In den entsprechenden Methoden musst du dann noch "throws InvalidAccoutn..." machen, natürlich an try...catch denken wo du diese Methoden später aufrufst. Aber ich denke das prinzipielle Exception Handling ist dir klar oder?



> ```
> public class TransferAccount extends Account{
> 
> 
> ...



Warum machst du keinen parametisierten Konstruktor , in dem du das Limit angeben kannst ? Bzw. du übergibst Kontostand und Limit - aber das hat erstma nichts mit deinem Problem zu tun.



> ```
> //in diesen 2 Methoden liegt wohl der Hund begraben!!!!!!!!  ???:L
> 
> public boolean checkLimit(int betrag){
> ...



Denk dran das hebeAb die Exception schmeissen kann, falls versucht wird zu viel abzuheben:


```
public void hebeAb(int betrag) throws InvalidAccountOperationException {
...
else {
throw new InvalidAccountOperationException("Konto darf nicht weiter ueberzogen werden !");
}
```


----------



## mic_checker (16. Mrz 2005)

Sindbad1983 hat gesagt.:
			
		

> ```
> public class Account{
> 
> 
> ...


Warum machst du nicht alle private?



			
				Sindbad1983 hat gesagt.:
			
		

> ```
> public Account(){
> int kontonummer=getKontonummer();
> nextId++;
> ...



Warum fügst du keinen Konstruktor hinzu:


```
public Account(int kontostand) {
		this.kontostand = kontostand;
...
}
```

Nicht jeder startet mit 0 Euro und so musst du nicht den Umweg über set machen...



			
				Sindbad1983 hat gesagt.:
			
		

> ```
> //letzte Behebung oder Einzahlung rückgängig machen
> public void undoLastOperation(){
> kontostand=kontostand+lastsum;
> ...



Ich würde noch etwas hinzufügen - nach dieser Zeile:


```
lastsum = 0;
```

Ansonsten - wenn du zweimal hintereinander undo..aufrufst, dann wird z.B. zweimal Geld abgehoben oder draufgezahlt - so passiert nichts beim zweiten Aufruf, wenn zwischenzeitlich nicht abgehoben/eingezahlt wurde.



			
				Sindbad1983 hat gesagt.:
			
		

> ```
> public class TransferAccount extends Account{
> 
> 
> ...



Siehe Kommentar von oben - Hier fände ich sowas vielleicht ganz praktisch:


```
public TransferAccount(int kontostand,int limit) {
...
}
```

Soviel erstmal dazu, vielleicht find ich noch paar Sachen


----------



## Sindbad1983 (16. Mrz 2005)

maa,danke für die vielen Tipps...ich werd die dann gleich umsetzen!
Vorher wollt ich aber noch die ExceptionKlasse programmieren, aber da ist leider ein Fehler aufgetreten!
Wisst ihr, was das zu bedeuten hat?




```
public class AccountException extends Exception{



	private Account account;


	public AccountException(Account account){
		this("Illegal account message");
		this.account=account;

	}

	public AccountException(String message){
		super(message);
	}

	public AccountException(String message, Account account){
		super(message);
		this.account=account;
	}

	public Account getAccount(){
		return account;
	}


}
```

da müsste alles passen

------------------------------------------


```
public class TransferAccount extends Account{


	int limit;


	public void setLimit(int betrag){

		limit=betrag;
	}

	public int getLimit(){
		return limit;
	}



	public boolean checkLimit(int betrag){

				int kontostand=getKontostand();

				if(kontostand-betrag<limit){
					return false;
				}
				else{
					return true;
				}


	}





	public void hebeAb(int betrag) throws AccountException{

		boolean ergebnis=checkLimit(betrag);

		if(ergebnis){


		super.hebeAb(betrag);
		}
		else{
			throw new AccountException(kontonummer);
		}


	}
```


----------------------------------------



```
public class TestAccount{


	public static void main(String [] args){

		Account a1=new Account();
		Account a2=new Account();
		TransferAccount a3=new TransferAccount();
		Account a4=new Account();

		try{

		a1.zahleEin(200);
		a1.hebeAb(50);
		a1.zahleEin(100);
		a1.undoLastOperation();

		a2.zahleEin(1000);
		a2.hebeAb(345);
		a2.hebeAb(234);



		a3.setLimit(-1000);
		a3.zahleEin(100);
		a3.hebeAb(900);
		a3.hebeAb(300);




		a4.zahleEin(200);
		a4.hebeAb(23);

		}
		catch(AccountException e){
				System.out.println(e.toString());
		}


		System.out.println(a1);
		System.out.println(a2);
		System.out.println(a3);
		System.out.println(a4);




		int getAnzahl=Account.getAnzahlKonten();

		System.out.println("Anzahl der bereits vorhandenen Konten: "+getAnzahl);
	}

}
```

--------------------

Fehlerausgabe:


.\TransferAccount.java:36: hebeAb(int) in TransferAccount cannot override hebeAb(int) in Account; overridden method does not throw AccountException
	public void hebeAb(int betrag) throws AccountException{
                    ^
.\TransferAccount.java:46: cannot find symbol
symbol  : constructor AccountException(int)
location: class AccountException
			throw new AccountException(kontonummer);
                              ^
2 errors


wieso kann ich hebeAb nicht überschreiben?

den 2.Fehler weiß ich glaub ich:

ich übergib in new AccountException(kontonummer) die Kontonummer->die ist vom Typ int , jedoch erwartet er Account account;->wie kann ich das trotzdem mit kontonummer machen?


----------



## mic_checker (16. Mrz 2005)

Sindbad1983 hat gesagt.:
			
		

> .\TransferAccount.java:36: hebeAb(int) in TransferAccount cannot override hebeAb(int) in Account; overridden method does not throw AccountException
> public void hebeAb(int betrag) throws AccountException{
> ^
> .\TransferAccount.java:46: cannot find symbol
> ...



hebeAb in Account und TransferAccount müssen je ne AccountException werfen. Machen das beide?

Btw. warum verwendest du so ne Exception-Klasse, warum noch die Account Information darin? Hol doch einfach das "Grundgerüst" von oben.


----------



## Sindbad1983 (16. Mrz 2005)

weil ich die Klasse AccountException so machen muss (Vorgabe)

ok..danke für den Hinweis!

Jetzt steh ich aber vor einem anderen Problem:

der Compiler akzeptiert alles, nur die Ausgabe ist nicht die gewünschte!

Denn den try-catch Block muss ich ja über alle Transaktionen spannen oder?

Aber wenn jetzt z.B. im 3.Konto das Limit überzogen wird, dann bricht er ab, und führt die TA im 4. und 5. Konto nicht mehr aus!

Wie kann man  das lösen? Mit weiteren try-catch Blöcken?

.
.
.
. -> ok...ich hábs grad ausprobiert! Es geht mit mehreren try-catch Blöcken!
Kann das sein? Ist ein bissl viel Aufwand oder? Geht das anders auch?


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

		Account a1=new Account();
		Account a2=new Account();
		TransferAccount a3=new TransferAccount();
		Account a4=new Account();
		Account a5=new Account();


		try{

		a1.zahleEin(200);
		a1.hebeAb(50);
		a1.zahleEin(100);
		a1.undoLastOperation();


				}
						catch(AccountException e){
								System.out.println(e.toString());
						}

		try{

		a2.zahleEin(1000);
		a2.hebeAb(345);
		a2.hebeAb(234);


				}
						catch(AccountException e){
								System.out.println(e.toString());
						}


		try{
		a3.setLimit(-1000);
		a3.zahleEin(100);
		a3.hebeAb(900);
		a3.hebeAb(300);


				}
						catch(AccountException e){
								System.out.println(e.toString());
						}
```


---------------------

Und außerdem möchte ich, dass er die Exception direkt unter das Konto schreibt!
Also hier wärs Konto 3!! Er schreibts aber ganz oben?
Wieso?


AccountException: Illegal account message
Kontonummer:1001 aktueller Kontostand:150
Kontonummer:1002 aktueller Kontostand:421
Kontonummer:1003 aktueller Kontostand:-800 Limit liegt bei:-1000
Kontonummer:1004 aktueller Kontostand:300
Kontonummer:1005 aktueller Kontostand:800
Anzahl der bereits vorhandenen Konten: 5
Drücken Sie eine beliebige Taste . . .


Das wärs dann auch schon wieder!  :roll: 
DANKE![/code]


----------



## Sindbad1983 (16. Mrz 2005)

außerdem soll das betreffende Konto bei der Exception dastehn!
Hab mich grad gespielt..geht aber nicht! :-(


----------



## mic_checker (16. Mrz 2005)

Ist das oben deine komplette main? Poste doch mal bitte den Teil wo es um die Ausgabe geht (oder hab ich was übersehen)....

Das Konto soll da stehen? Meinst du das was von System.out.println(deinaccount); ausgegeben werden würde oder was?


----------



## Sindbad1983 (16. Mrz 2005)

ich schick dir mal alles, damit du einen guten Überblick hast:
so müsste es jetzt halbigs passen...außer das mit lastsum hab ich noch nicht geändert...!


```
public class Account{


	private int start=1001;
	public  int kontonummer;
	private int lastsum=0;
	static int nextId=0;
	int kontostand;


	public Account(int kontostand){
		this.kontostand=kontostand;
		nextId++;

	}


	//gibt Anzahl der bereits vorhandenen Konten aus
		public static int getAnzahlKonten(){
			return nextId;
	}


	//generieren einer eindeutigen Kontonummer
	public int getKontonummer(){

		kontonummer=start+nextId;
		return kontonummer;
	}


	//abrufen des Kontostandes
	public int getKontostand(){
		return kontostand;
	}

	//Geld einzahlen
	public void zahleEin(int betrag){
		kontostand=kontostand+betrag;
		lastsum=-betrag;

	}

	//Geld abheben
	public void hebeAb(int betrag) throws AccountException{
		kontostand=kontostand-betrag;
		lastsum=+betrag;

	}


	//letzte Behebung oder Einzahlung rückgängig machen
	public void undoLastOperation(){
		kontostand=kontostand+lastsum;

	}

	//Ausgabe
	public String toString(){

		String s="Kontonummer:"+kontonummer+" aktueller Kontostand:"+kontostand;
		return s;


	}

}
```

--------------------------------


```
public class TransferAccount extends Account{


	int limit;
	String message="Das Limit wurde ueberzogen!!!";


	public TransferAccount(int kontostand,int limit){
		super(kontostand);
		this.limit=limit;
	}

	public int getLimit(){
		return limit;
	}



	public boolean checkLimit(int betrag){

				int kontostand=getKontostand();

				if(kontostand-betrag<limit){
					return false;
				}
				else{
					return true;
				}


	}





	public void hebeAb(int betrag) throws AccountException{


		boolean ergebnis=checkLimit(betrag);

		if(ergebnis){


		super.hebeAb(betrag);
		}
		else{
			throw new AccountException(message);
		}


	}



	public String toString(){


		String s;
		s=super.toString()+" Limit liegt bei:"+limit;
		return s;
	}



}
```

-----------------------


```
public class AccountException extends Exception{



	private Account account;


	public AccountException(){

		this("Illegal account message");

	}

	public AccountException(String message){
		super(message);
	}

	public AccountException(String message, Account account){
		super(message);
		this.account=account;
	}

	public Account getAccount(){
		return account;
	}


}
```

---------------------------


```
public class TestAccount{


	public static void main(String [] args){

		Account a1=new Account(100);
		Account a2=new Account(100);
		TransferAccount a3=new TransferAccount(100,-1000);
		Account a4=new Account(100);
		Account a5=new Account(100);


		try{
		a1.zahleEin(200);
		a1.hebeAb(50);
		a1.zahleEin(100);
		a1.undoLastOperation();
				}
						catch(AccountException e){
								System.out.println(e.toString());
						}



		try{
		a2.zahleEin(1000);
		a2.hebeAb(345);
		a2.hebeAb(234);
				}
						catch(AccountException e){
								System.out.println(e.toString());
						}





		try{
		a3.zahleEin(100);
		a3.hebeAb(900);
		a3.hebeAb(500);
				}
						catch(AccountException e){
							System.out.println("  ");


								System.out.println(e.toString());
						}



		try{
		a4.zahleEin(500);
		a4.hebeAb(200);
				}
						catch(AccountException e){
								System.out.println(e.toString());
						}



		try{

		a5.zahleEin(1000);
		a5.hebeAb(200);
		}
				catch(AccountException e){
						System.out.println(e.toString());
				}


		System.out.println(a1);
		System.out.println(a2);
		System.out.println(a3);
		System.out.println(a4);
		System.out.println(a5);


		int getAnzahl=Account.getAnzahlKonten();

		System.out.println("Anzahl der bereits vorhandenen Konten: "+getAnzahl);
	}

}
```

------------------

ein bissl viel, aber jetzt weißt wieder, wie weit ich bin...


----------



## Sindbad1983 (16. Mrz 2005)

naja...jetzt schauts so aus


Das System kann den angegebenen Pfad nicht finden.

AccountException: Das Limit wurde ueberzogen!!!
Kontonummer:0 aktueller Kontostand:250
Kontonummer:0 aktueller Kontostand:521
Kontonummer:0 aktueller Kontostand:-700 Limit liegt bei:-1000
Kontonummer:0 aktueller Kontostand:400
Kontonummer:0 aktueller Kontostand:900
Anzahl der bereits vorhandenen Konten: 5
Drücken Sie eine beliebige Taste . . .


ich möcht aber, dass es so aussieht:



Das System kann den angegebenen Pfad nicht finden.


Kontonummer:0 aktueller Kontostand:250
Kontonummer:0 aktueller Kontostand:521
Kontonummer:0 aktueller Kontostand:-700 Limit liegt bei:-1000
AccountException: Das Limit wurde ueberzogen!!!

Kontonummer:0 aktueller Kontostand:400
Kontonummer:0 aktueller Kontostand:900
Anzahl der bereits vorhandenen Konten: 5
Drücken Sie eine beliebige Taste . . .

oder so


Kontonummer:0 aktueller Kontostand:250
Kontonummer:0 aktueller Kontostand:521
Kontonummer:0 aktueller Kontostand:-700 Limit liegt bei:-1000
AccountException: Das Limit wurde bei Konto 3 ueberzogen!!!

Kontonummer:0 aktueller Kontostand:400
Kontonummer:0 aktueller Kontostand:900
Anzahl der bereits vorhandenen Konten: 5
Drücken Sie eine beliebige Taste . . .

oh shit...jetzt hab ich einen Fehler bei Kontonummer  :cry:


----------



## mic_checker (16. Mrz 2005)

Das mit der Ausgabe liegt daran:


```
//try catch blöcke
      System.out.println(a1);
      System.out.println(a2);
      System.out.println(a3);
      System.out.println(a4);
      System.out.println(a5);
```

Falls eine Exception ausgelöst wird erscheint die entsprechende Fehlermeldung, erst nach den try catch Blöcken lässt du toString() aufrufen von den Konten, also die Konten ausgeben.
Somit ist logisch das erst die Fehlermeldung und dann deine Kontodaten erscheinen....


----------



## Sindbad1983 (16. Mrz 2005)

Maaa, ist doch klar! 
Mensch, wieso komm ich nicht auf so leichte Fehler drauf!!

Ich hab das jetzt ziemlich umständlich gemacht..
geht das noch schöner?


```
public class TestAccount{


	public static void main(String [] args){

		Account a1=new Account(100);
		Account a2=new Account(100);
		TransferAccount a3=new TransferAccount(100,-1000);
		Account a4=new Account(100);
		Account a5=new Account(100);


		try{
		a1.zahleEin(200);
		a1.hebeAb(50);
		a1.zahleEin(100);
		a1.undoLastOperation();
			System.out.println(a1);
				}
						catch(AccountException e){
								System.out.println(a1);
								System.out.println(e.toString());
						}




		try{
		a2.zahleEin(1000);
		a2.hebeAb(345);
		a2.hebeAb(234);
		System.out.println(a2);
				}
						catch(AccountException e){
							System.out.println(a2);
								System.out.println(e.toString());
						}
.
.
.
.
```


----------



## Sindbad1983 (16. Mrz 2005)

aber es funktioniert..danke, dass du mir immer so schnell hilfst!


----------



## mic_checker (16. Mrz 2005)

Sindbad1983 hat gesagt.:
			
		

> oh shit...jetzt hab ich einen Fehler bei Kontonummer  :cry:



schau mal in deinen Konstruktor, da fehlt was:


```
kontonummer=getKontonummer();
```

Hast du wohl im Laufe der Zeit mal ausversehen gelöscht 

So...werd jetzt erstma off gehen...vielleicht bis später


----------



## Sindbad1983 (16. Mrz 2005)

ja..bin schon draufgekommen!
dürft wohl so gewesen sein! 

spitze..es funktioniert alles!
jetzt werd ich noch schnell die 2 anderen ausstehenden Unterklassen programmieren!
Schön langsam wirds programmieren wieder lustig!


----------

