Frage zu Exceptions

Status
Nicht offen für weitere Antworten.

Mane123

Bekanntes Mitglied
Hallo zusammen,

ich habe folgenden Quelltext erstellt:

Java:
public class Wein2 {
	
	private int alter;
	private double grundpreis;
	private double preisProFlasche;
	
	
	//der Standard Konstruktor
	
	public Wein2 () throws IllegalArgumentException {
		


		throw new IllegalArgumentException ("Sie haben kein Alter und keinen Grundpreis eingegeben!");
		
	}
	

	//Der Konstruktor, falls kein Grundpreis eingegeben wurde
	public Wein2 (int alter) throws IllegalArgumentException {
		
		
		throw new IllegalArgumentException ("Sie haben keinen Grundpreis eingegeben!");
		
		
	}
	
	
	//der Konstruktor, falls kein Alter eingegeben wurde	
	public Wein2 (double grundpreis) throws IllegalArgumentException {
		
		throw new IllegalArgumentException ("Sie haben kein Alter eingegeben!");
	}
	
	//der Konstruktor setzt das Alter und den Grundpreis
	//und prüft ob alle Werte plausibel sind
	
	public Wein2 (int alter, double grundpreis) throws IllegalArgumentException {
		
		if (alter > 0) {
			
			this.alter = alter;
		}
		
		else 
			throw new IllegalArgumentException ("Sie haben ein ungültiges Alter eingegeben!");
			
		
		if (grundpreis > 9)
			this.grundpreis = grundpreis;
		
		else
			throw new IllegalArgumentException ("Sie haben einen ungültigen Grundpreis eingegeben!");
		
	}
	
	//die Methode berechnet den Preis pro Flasche
	public void preisBerechnen() {
		preisProFlasche = alter * grundpreis;
	}
	
	//die Methode liefert den Preis pro Flasche
	public double getPreisProFlasche() {
		preisBerechnen();
		return preisProFlasche;
	}

}


Der Quelltext enthielt ursprünglich keine Exception Behandlung, sondern setzte bei fehlenden bzw. falschen Werten einfach Standardwerte.
Ich habe nun einfach die Konstruktoren abgeändert, sodass bei fehlenden bzw. ungültigen Werten einen IllegalArgumentException erscheint.
Ich denke, das stimmt soweit?
Allerdings denke ich mir, dass es hier bestimmt eine elegantere Möglichkeit gibt?
Ist es möglich, alle Fälle im letzten Konstruktor abzudecken, in dem im Prinzip ja die Plausibilitätsprüfung stattfindet?

Viele Grüße
 

Mane123

Bekanntes Mitglied
Sie sollen in Erscheinung treten, wenn in der main-Methode z.B. eine Instanz erzeugt wird, in der nur eine Instanzvariable angegeben ist:

Java:
mport javax.swing.JOptionPane;


public class Javaß8_5 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//eine neue Instanz mit unsinnigen Werten erzeugen
		try {
			
		Wein2 flasche2 = new Wein2(8);
		
		//den Preis ausgeben
		//er wird aus den Alter und dem Grundpreis berechnet.
		System.out.println("Der Preis pro Flasche beträgt " + flasche2.getPreisProFlasche() + " Euro");
		
		}
		
		catch (IllegalArgumentException e) {
			
			JOptionPane.showMessageDialog(null,e.getMessage());
			
		}
	}

}

Hier wird eben nur das Alter initialisiert und es erscheint die Fehlermeldung, dass der Grundpreis fehlt.

Wisst ihr eine andere Möglichkeit, dies zu lösen?

Das soll jetzt nicht alles ein produktives Programm sein, sonder mehr oder weniger als Beispiel dienen. Darum auch die vielen Möglickeiten mit den Konstruktoren.



Viele Grüße
 

function

Bekanntes Mitglied
Wofür soll es denn als Beispiel dienen? Für Exceptions/Exceptionhandling, oder doch was anderes?
 

Wildcard

Top Contributor
So ist das Blödsinn. Wenn die anderen beiden Konstruktoren kein gültiges Objekt erzeugen können musst du sie entfernen. Wenn default Werte Sinn machen, dann ruf in einem Konstruktor einen anderen auf und übergib den Default:
Code:
this(arg1,arg2,"Default")
Bei vielen Parametern im Konstruktor kann auch das Builder Pattern sinnvoll sein.
 

Mane123

Bekanntes Mitglied
Das soll eine Übung zu den Exceptions sein.

Die Ausgangsversion sieht so aus:

Java:
public class Wein {
	
	private int alter;
	private double grundpreis;
	private double preisProFlasche;
	
	//der Standard Konstrukto
	
	public Wein () {
		
		this.alter = 1;
		this.grundpreis = 10;
	}
	
	//der Konstruktor setzt das Alter
	//der Preis erhält einen Standard - Wert
	
	public Wein (int alter) {
		
		this.alter = alter;
		this.grundpreis = 10;
	}
	
	//der Konstruktor setzt den Preis
	//das Alter erhält einen Standard-Wert
	
	public Wein (double grundpreis) {
		
		this.alter = 1;
		this.grundpreis = grundpreis;
	}
	
	
	//der Konstruktor seztz das Alter und den Grundpreis
	
	public Wein (int alter, double grundpreis) {
		
		this.alter = alter;
		this.grundpreis = grundpreis;
	}
	
	//die Mehode berechnet den Preis pro Flasche
	
	public void preisBerechnen () {
		
		preisProFlasche = alter * grundpreis;
	}
	
	//die Methode liefert den Preis pro Flasche
	public double getPreisProFlasche () {
		
		preisBerechnen ();
		return preisProFlasche;
		
		
	}

Diese habe ich umgearbeitet, sodass in den anderen Konstruktoren z.B. nur folgendes steht:

Java:
	public Wein (double grundpreis) {
		
		
		
		this(1,grundpreis);
	}

So wurde der Konstruktor Wein (int alter, double grundpreis) aufgerufen, wo hier die Plausibilitätsprüfung erfolgte.

Nun habe ich folgende Aufgabe:

Überarbeiten Sie die Plausibilitätsprüfung in dem Konstruktor der Klasse Wein2 so, dass bei ungültigen Werten nicht mehr "stillschweigend" Standardwerte gesetzt werden, sondern eine Ausnahem der Klasse IllegalArgumentException.

Meine Lösung habe ich im Ersten Posting aufgezeigt.
Wie würdet ihr das dann lösen?

Viele Grüße
 

Wildcard

Top Contributor
Überarbeiten Sie die Plausibilitätsprüfung in dem Konstruktor der Klasse Wein2 so, dass bei ungültigen Werten nicht mehr "stillschweigend" Standardwerte gesetzt werden, sondern eine Ausnahem der Klasse IllegalArgumentException.
Du hast in deinem Beispiel nicht 'dem Konstruktor', du hast mehrere Konstruktoren und da macht dein Vorgehen keinen Sinn.
 

Mane123

Bekanntes Mitglied
Mit "dem Konstruktor" ist der Konstruktor public Wein2 (int alter, double grundpreis) throws IllegalArgumentException gemeint.
Allerdinds sollen die anderen Konstruktoren auch nocht vorhanden bleiben und nicht irgendwie gelöscht werden.
Passt mein Vorschlag dann so, oder würdet ihr das ändern?

Viele Grüße
 

Wildcard

Top Contributor
Mit "dem Konstruktor" ist der Konstruktor public Wein2 (int alter, double grundpreis) throws IllegalArgumentException gemeint.
Dieser Konstruktor ist ok (auch wenn fraglich ist warum der Grundpreis ausgerechnet größer als 9 sein muss...

Die anderen hingegen:
Java:
    public Wein2 () throws IllegalArgumentException {
        
 
 
        throw new IllegalArgumentException ("Sie haben kein Alter und keinen Grundpreis eingegeben!");
        
    }
    
 
    //Der Konstruktor, falls kein Grundpreis eingegeben wurde
    public Wein2 (int alter) throws IllegalArgumentException {
        
        
        throw new IllegalArgumentException ("Sie haben keinen Grundpreis eingegeben!");
        
        
    }
    
    
    //der Konstruktor, falls kein Alter eingegeben wurde    
    public Wein2 (double grundpreis) throws IllegalArgumentException {
        
        throw new IllegalArgumentException ("Sie haben kein Alter eingegeben!");
    }
Sind falsch. Entweder du löschst sie, oder du entfernst die throw statements.
 

Painii

Bekanntes Mitglied
Unabhängig vom Aufgabensteller:
Macht es für dich als Aufgabenlöser viel Sinn, dem Anwender 3 Konstruktoren zu geben, wovon 2 nur in einer Exception sagen dass man doch den letzten Konstruktor benutzen soll?

Dein letzter Konstruktor ist da schon sinniger, denn es kann ja gut sein dass ein Benutzer eben null angibt, dann kannst du mit der Exception sagen dass du einen echten, gültigen Wert brauchst.
Bei einem Konstruktor wo man gesagt bekommt dass man den Preis angeben soll obwohl der Konstruktor nie danach gefragt hat (es gibt ja nur ein Argument was man übergeben kann), ist dann doch ziemlich... bescheuert.
 

Mane123

Bekanntes Mitglied
Danke für die Hilfe.

Löschen kann ich sie nicht. Da sie zum ursprünglichen Listing gehören.

Mal angenommen, ich lösche die anderen Konstruktoren und erzeuge eine Instanz

Wein2 flasche2 = new Wein2(8);

Dann kann ich ja keine Instanz erstellen?

Und wenn ich die Throw statements entferne, was bringt das denn dann? Dann muss ich ja mit Standard werten arbeiten?

Ich soll nur eine Instanz erstellen können, wenn die Instanz mit zwei gültigen Instanzvariablen initialisiert wurde.

Der Preis >9 wurde willkürlich vom Autor gewählt.

Viele Grüße
 

Wildcard

Top Contributor
Wenn die anderen Konstruktoren bleiben sollen, dann müssen sie den Konstruktor mit den meisten Argumenten aufrufen und Default Werte übergeben. Exceptions werfen ist an dieser Stelle völlig daneben.
 

Mane123

Bekanntes Mitglied
Also das mit den Default-Werten hatte ich schon mal ausprobiert:

Java:
public class Wein2 {
	
	private int alter;
	private double grundpreis;
	private double preisProFlasche;
	
	
	//der Standard Konstruktor
	
	public Wein2 () {
		
		this (0,0);

		//throw new IllegalArgumentException ("Sie haben kein Alter und keinen Grundpreis eingegeben!");
		
	}
	

	//Der Konstruktor, falls kein Grundpreis eingegeben wurde
	public Wein2 (int alter) throws IllegalArgumentException {
		
		this (alter, 0);
		//throw new IllegalArgumentException ("Sie haben keinen Grundpreis eingegeben!");
		
		
	}
	
	
	//der Konstruktor, falls kein Alter eingegeben wurde	
	public Wein2 (double grundpreis) throws IllegalArgumentException {
		
		this (0,grundpreis);
		//throw new IllegalArgumentException ("Sie haben kein Alter eingegeben!");
	}
	
	//der Konstruktor setzt das Alter und den Grundpreis
	//und prüft ob alle Werte plausibel sind
	
	public Wein2 (int alter, double grundpreis) throws IllegalArgumentException {
		
		if (alter > 0) {
			
			this.alter = alter;
		}
		
		else 
			throw new IllegalArgumentException ("Sie haben ein ungültiges Alter eingegeben!");
			
		
		if (grundpreis > 9)
			this.grundpreis = grundpreis;
		
		else
			throw new IllegalArgumentException ("Sie haben einen ungültigen Grundpreis eingegeben!");
		
	}
	
	//die Methode berechnet den Preis pro Flasche
	public void preisBerechnen() {
		preisProFlasche = alter * grundpreis;
	}
	
	//die Methode liefert den Preis pro Flasche
	public double getPreisProFlasche() {
		preisBerechnen();
		return preisProFlasche;
	}

}

So müsste es zwar klappen, aber ich wollte eigentlich Meldungen wie "Sie haben keinen Grundpreis" oder "Sie haben kein Alter und keinen Grundpreis eingegeben" bei den Exceptions erscheinen lassen.

Stattdessen habe ich nur zwei Meldungen.

Kann ich meine gewünschten Meldungen auch irgendwie einbringen, oder ist das nur mit viel Programmieraufwand möglich?

Viele Grüße
 

Wildcard

Top Contributor
Nein, dein Programm gibt dem Benutzer keine Möglichkeit keinen Grundpreis anzugeben, also kannst du diese Meldung auch nirgendwo sinnig unterbringen da dieser Zustand nicht auftritt.
 

Mane123

Bekanntes Mitglied
Okay, danke!

Im Prinzip kann ich mir ja die ganzen anderen Konsturktoren sparen, da dies alles irgendwie sinnlos ist?

Der Anwender soll z.B. durch grafische Eingabedialoge gezwungen sein, zwei Instanzvariablen zu erfassen, und dann würde man sich das alles ersparen...?

Viele Grüße
 

Wildcard

Top Contributor
Mehrere Konstruktoren die dann Default Werte setzen können schon Sinn machen. Nur Konstruktoren die nichts anderes tun als eine Exception zu werfen sollte man sich sparen ;)
 

Mane123

Bekanntes Mitglied
Hallo,

noch mal eine Frage zu den unsinnigen Konstruktoren:

Warum soll man das denn nicht machen, dass Konstruktoren mit einer Eception enden?

Macht das dann einen Unterschied, zu den Konstruktoren, die mit einer Exception enden, oder zu den Konstrutkoren, welche einen ungültigen Standard-Wert setzen und diesen dann an den Konstruktor weitergeben, welcher dann die Plausibilitätsprüfung durchführt?

Viele Grüße
 

Wildcard

Top Contributor
Ungültige Defaultwerte sind genauso falsch. Ein Konstruktor der per Design überhaupt nicht funktionieren kann, hat keine Daseinsberechtigung.
 

Mane123

Bekanntes Mitglied
Danke für die Antwort.

Ich verstehe das schon, aber wie kann ich denn das sonst lösen, ohne die anderen Konstruktoren, welche in der jetzigen Form sinnlos sind, zu löschen?

Ich wüsste da jetzt keine Lösung, außer das Programm zu ändern. Aber das ist in dem Fall nicht der Sinn und Zweck der Aufgabe.

Viele Grüße
 

Wildcard

Top Contributor
Übergib sinnvolle Defaults die nicht zu einem Fehler führen, sonst macht es einfach keinen Sinn
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Frage zu Exceptions Java Basics - Anfänger-Themen 8
J Frage zum Thema Exceptions (Try/Catch) Java Basics - Anfänger-Themen 3
D Frage zu Exceptions Java Basics - Anfänger-Themen 12
D Frage zu Exceptions und der import Anweisung Java Basics - Anfänger-Themen 12
K Frage zu Exceptions -> Logging Java Basics - Anfänger-Themen 6
U Frage zu Exceptions Java Basics - Anfänger-Themen 5
C Exceptions, try, catch --> Frage Java Basics - Anfänger-Themen 7
D Frage zum abfangen von Exceptions Java Basics - Anfänger-Themen 5
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben