FontMetrics scheint einen Fehler zu haben ...



  • Ich lerne gerade java (und nebenbei auch noch etwas c++) und folgendes hat mich schon etwas gewundert:
    In einem meiner programme verwende ich die klasse java.awt.FontMetrics und bekomme folgende fehlermeldung:

    Exception in thread "main" java.lang.StackOverflowError
    	at java.awt.FontMetrics.getWidths(FontMetrics.java:389)
    	at java.awt.FontMetrics.charWidth(FontMetrics.java:294)
    	at java.awt.FontMetrics.getWidths(FontMetrics.java:389)
    	at java.awt.FontMetrics.charWidth(FontMetrics.java:294)
    	at java.awt.FontMetrics.getWidths(FontMetrics.java:389)
    	at java.awt.FontMetrics.charWidth(FontMetrics.java:294)
    	...
    

    jetzt habe ich mir mal die klasse FontMetrics genauer angeschaut und finde in der datei 'FontMetrics.class' folgendes:

    ...
    public int charWidth(char ch) {
    	if (ch < 256) {
    	    return getWidths()[ch];
    	}
    	char data[] = {ch};
    	return charsWidth(data, 0, 1);
    }
    ...
    public int[] getWidths() {
    	int widths[] = new int[256];
    	for (char ch = 0 ; ch < 256 ; ch++) {
    	    widths[ch] = charWidth(ch);
    	}
    	return widths;
    }
    ...
    

    hmm ... das erklärt irgendwie den StackOverflowError ...

    nun die fragen:
    a) liegt dieser fehler an meiner java version? ich habe aber eigendlich j2se 1.5 (meines wissens die neuste version ...)
    b) was soll ich nun tun? irgendwie könnte ich die methode charWidth(char ch) noch so gut gebrauchen ...
    c) kann ich das 'von hand' reparieren?
    d) kann man / soll man diesen fehler einschicken? wenn ja, wie? zudem ist mein englisch ist ziemlich mies ...

    gruss savage dog



  • Noober und CengizS hat eben folgendes rausgefunden:

    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4032165

    Wenn man sich durch die ganzen Duplikate durchhangelt kommt man schließlich zu:

    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4007374

    State Closed, will not be fixed

    Folglich wirst du damit leben müssen und einen anderen Weg suchen müssen 😕

    MfG SideWinder



  • vielen dank für deine antwort.
    aber etwas komisch finde ich es schon, das so code einfach in der klassse gelassen wird - ich finde das ziemlich unschön
    gruss savage dog



  • Ähm habt ihr das nicht einfach falsch verstanden? Für mich sieht das so aus, als würdet ihr das als Fehler ansehen. Dieses Verhalten ist so beabsichtigt, die Klasse ist auch nicht zum Spaß abstract. Man muss eben entweder getWidths() oder charWidths() implementieren und die andere Methode funktioniert dann automatisch.
    http://java.sun.com/j2se/1.5.0/docs/api/java/awt/FontMetrics.html



  • Ich würde das eindeutig als Bug bezeichnen. Die Klasse war wohl nicht immer abstract. Das was in der Dokumentation steht könnte als Workaround gelten - mehr aber auch nicht.



  • Versteh ich nicht. Allein nur der Text ist für mich schon eindeutig:

    Note to subclassers: Since many of these methods form closed, mutually recursive loops, you must take care that you implement at least one of the methods in each such loop to prevent infinite recursion when your subclass is used.

    Das macht doch auch Sinn. Bei manchen Fonts ist es für dich geiler, das eine anzugeben, bei anderen das andere. Je nachdem was du implementierst, funktioniert der Rest dann automatisch. Wenn es nicht performant ist, overridest du alle Methoden. Die Methoden abstract zu machen ist aber hierfür keine Option, denn du sollst ja ne default-Implementierung haben.
    Dass das Ding nicht out-of-the-box funktioniert, liegt bei abstrakten Klassen irgendwie auf der Hand. o_O

    Das was in der Dokumentation steht könnte als Workaround gelten - mehr aber auch nicht.

    Workaround um was? Du implementierst doch hier gerade deine eigene Font-Metrik und netterweise hast du schon mal vordefinierte Methoden, die aus einem Teil der Angaben den Rest berechnen, in der Hoffnung, dass es dir genehm sein könnte. Erinnert mich irgendwie an Template Method... zwar sind die Methoden nicht abstrakt aber in ihrer Grundform nicht brauchbar.


Anmelden zum Antworten