Klassen StackOverflow bei erster Nutzung von Klassen/Konstruktoren

Cashney

Mitglied
Hallo Forum!

Ich beschäftige mich im Studium seit ca. 2 Monaten mit Java-Programmierung. Jetzt bin ich zum ersten Mal in ein Problem gelaufen, dass ich nicht selbst per Google und JavaDoc-Recherche lösen konnte.

Aufgabe ist, eine Klasse zu schreiben ähnlich der Color-Klasse, die in java.awt.* bereits vorhanden ist. Ergo ein paar Konstruktoren die mit entsprechender Wertübergabe eine neue Farbe erstellen und Methoden zum auslesen derselben zur Verfügung stellen.

Das Thema ist mir bisher erst grundlegend vertraut, wenn hier zu viel im argen liegt werde ich gerne nochmal etwas lesen, aber wenn es doch nur ein kleiner Fehler ist hätte ich gern ein bisschen Anregung wo es denn genau hapert. Habe per Debug schon versucht den Fehler einzugrenzen, allerdings komm ich da nicht weiter weil jeder 2te Schritt zu "Source not found." führt. Warum weiß ich nicht... Hatte das aber schonmal mit einem anderen Programm bei dem eigentlich alles in Ordnung war.

Java:
public final class Color {

	// Klassenattribute
	private float alpha;
	private float red;
	private float green;
	private float blue;
	
	// Konstantendeklaration
	final Color BLACK = new Color(0,0,0);
	final Color WHITE = new Color(255,255,255);
	final Color ORANGE = new Color(255, 165, 0);
	final Color RED = new Color(255,0,0);
	final Color BLUE = new Color(0,0,255);
	final Color GREEN = new Color(0,255,0);
	
	// Konstruktoren
	public Color(float r, float g, float b, float a){
		alpha = a;
		red = r;
		green = g;
		blue = b;
		}
	public Color(float r, float g, float b){
		alpha = 1;
		red = r;
		green = g;
		blue = b;
		}
	public Color(int r, int g, int b, int a){
		alpha = (float)a / 255;
		red = (float)r / 255;
		green = (float)g / 255;
		blue = (float)b / 255;
		}
	public Color(int r, int g, int b){
		alpha = 1;
		red = (float)r / 255;
		green = (float)g / 255;
		blue = (float)b / 255;
		}
	
	public Color(int argb){
		int b = argb & 255;
		argb = argb >>> 8;
		int g = argb & 255;
		argb = argb >>> 8;
		int r = argb & 255;
		argb = argb >>> 8;
		int a = argb & 255;
		setColor(r,g,b,a);
		}
	public Color(Color color){
		float a = color.getAlpha();
		float r = color.getRed();
		float g = color.getGreen();
		float b = color.getBlue();
		setColor(r,g,b,a);
		}
	
	// Getter-Methoden
	public float getAlpha(){
		return alpha;
		}
	public float getRed(){
		return red;
		}
	public float getGreen(){
		return green;
		}
	public float getBlue(){
		return blue;
		}
	public int getARGBColor(){
		int result = 0;
		result = (int)(alpha * 255);
		result = result << 8;
		result += (int)(red * 255);
		result = result << 8;
		result += (int)(green * 255);
		result = result << 8;
		result += (int)(blue * 255);				
		return result;
	}
	
	public String getColor(String color){
		if(color.equalsIgnoreCase("BLACK")){
			return "BLACK";
		}else if(color.equalsIgnoreCase("WHITE")){
			return "WHITE";
		}else if(color.equalsIgnoreCase("ORANGE")){
			return "ORANGE";
		}else if(color.equalsIgnoreCase("RED")){
			return "RED";
		}else if(color.equalsIgnoreCase("GREEN")){
			return "GREEN";
		}else if(color.equalsIgnoreCase("BLUE")){
			return "BLUE";
		}else{
			return "null";
		}
	}
	// Setter-Methoden
	private void setColor(float r, float g, float b, float a){
		if((a>=0&&a<=1)&&(r>=0&&r<=1)&&(g>=0&&g<=1)&&(b>=0&&b<=1)){
			alpha = a;
			red = r;
			green = g;
			blue = b;
			}else{
				System.out.println("Parameter richtig eingeben...");
				}
		}
	private void setColor(int r, int g, int b, int a){
		float alpha = ((float)a)/255;
		float red = ((float)r)/255;
		float green = ((float)g)/255;
		float blue = ((float)b)/255;
		setColor(alpha, red, green, blue);
		}

	// To String Methode
	public String toString(){
		// Werte von 0,1 auf 0,255 umrechnen fehlt noch
		String output = ("Color(red = " + red + ", green = " + green + ", blue = " + blue + ", alpha = "+ alpha + ")");
		return output;
	}

	public static void main(String[] args){
		Color neueFarbe = new Color(0,206,209);
		System.out.println(neueFarbe.getBlue());
	}
	
}

Fehlermeldung in der Konsole ist wie folgt:
Exception in thread "main" java.lang.StackOverflowError
at Color.<init>(Color.java:36)
at Color.<init>(Color.java:10)
at Color.<init>(Color.java:10)
at Color.<init>(Color.java:10)
at Color.<init>(Color.java:10)
at Color.<init>(Color.java:10)
[...]

Danke schonmal für etwaige Vorschläge! Wenn ihr noch Infos braucht, einfach nachfragen, arbeite auf Windows 7 mit Eclipse, das folgende UML-Klassendiagramm war uns gegeben:



Mit freundlichen Grüßen
Cashney
 
Zuletzt bearbeitet:
Das kommt weil deine Klasse so heißt wie eine aus der Java Bibliothek 🙂
Schau dir mal die Zeile 10 an:

final Color BLACK = new Color(0,0,0);

hier willst du sicherlich das Color aus der Java Bibliothek nutzen und nicht deine eigene richtig? Tust du hier aber nicht, sondern du erstellst ein Objekt deiner eigenen Klasse, da dort wiederum dann Zeile 10 uausgefphrt wird, erstellst du wieder ein Objekt deiner eigenen Klasse usw....es kommt eben zu einem StackOverflow.
Probiere es mit
Java:
    final java.awt.Color BLACK = new java.awt.Color(0, 0, 0);
//oder
final java.awt.Color BLACK = java.awt.Color.BLACK;
(gilt auch für die darunter liegenden)
Oder besser: Benne deine Klasse um, dann gibt es hier keine Probleme 🙂
 
Dankeschön!

Warum das zu einem StackOverflow führt ist mir jetzt klar. Tatsache ist aber, dass wir NICHT die Java-vorgefertigte Klasse nutzen sollen, sondern explizit die RGB-Werte festlegen sollten. Macht natürlich keinen Sinn hier ein neues Objekt meiner eigenen Klasse zu machen weil das in eine Endlosschleife läuft, verstehe ich! Aber ohne die Java.awt.*?
Werden genau die RGB-Werte die in diesen Konstanten festgelegt sind beim Erstellen eines neuen Objekts übergeben soll die Klasse in der Lage sein den Namen der Farbe zurückzugeben. [JAVA=86] public String getColor(String color){[/code]
 
Stimmt, habe da etwas herumexperimentiert und vergessen wieder aufs ursprüngliche zu setzen weil auch andere Prefixe nicht geholfen haben 😛
 
Ich habe zwischenzeitlich mal den obigen Vorschlag ausprobiert und mit Nutzung von java.awt.Color klappt das ganze. Sollte es aber nicht auch klappen wenn ich die Definition der Konstanten einfach weiter unten ins Programm setze? Also nicht als erstes bei Aufruf sondern hinter/unter die ganzen Konstruktoren und Setter und Getter Methoden? Habe es ausprobiert und es funktioniert, aber kann es da Probleme geben bzw. ist das "unsauber" / "unschön" oder dergleichen? Diese Definition der Klassenkonstanten als Objekt der Klasse selbst?
 
Ich habe zwischenzeitlich mal den obigen Vorschlag ausprobiert und mit Nutzung von java.awt.Color klappt das ganze. Sollte es aber nicht auch klappen wenn ich die Definition der Konstanten einfach weiter unten ins Programm setze? Also nicht als erstes bei Aufruf sondern hinter/unter die ganzen Konstruktoren und Setter und Getter Methoden? Habe es ausprobiert und es funktioniert, aber kann es da Probleme geben bzw. ist das "unsauber" / "unschön" oder dergleichen? Diese Definition der Klassenkonstanten als Objekt der Klasse selbst?

WO du die Konstanten hinsetzt ist völlig wurscht. Der Fehler kam nicht dadurch, dass sie ganz oben standen, sondern dadurch dass sie nicht static waren...
 
Oh mann, dankeschön!

Dann lags ja im Endeffekt doch nur am static vs. final, schön doof weil ichs eigentlich wusste aber irgendwo zuviel herumexperimentiert habe und dann hats nicht funktioniert.

Herzlichen Dank, ihr seids die Besten 😉 :toll:
 
Oh mann, dankeschön!

Dann lags ja im Endeffekt doch nur am static vs. final, schön doof weil ichs eigentlich wusste aber irgendwo zuviel herumexperimentiert habe und dann hats nicht funktioniert.

Herzlichen Dank, ihr seids die Besten 😉 :toll:

static vs. final?
Final und Static sind zwei komlett unterschiedliche Keywords die sich gegenseitig nicht ausschließen.

Konstanten sind im normalfall
Java:
public static final Color BLACK = new Color();
 
Dass die sich nicht ausschließen ist schon klar, wollte damit eher zum Ausdruck bringen dass ich ein bisschen herumprobiert habe.
Das final keyword habe ich auch begriffen, was static GENAU bedeutet ist mir nicht 100%ig klar, aber das kann ich auch anderswo finden, dafür müsst ihr euch jetzt hier nicht die Finger wund tippen, wenns denn doch dazu nochmal fragen gibt melde ich mich hier schon 😉
 

Zurück
Oben