5

次のコードを実行します。

import java.awt.Font;
import java.awt.FontMetrics;

public class MetricsTest {

    public static void main(String[] args) {
                Font myFontTest=new Font("Arial", Font.PLAIN, 11);
                FontMetrics metrics  = new FontMetrics(myFontTest) {};
                int characterWidth=metrics.charWidth('A');
                System.out.println(characterWidth);
    }
}

このエラーが発生します:

スレッド「メイン」での例外 java.lang.StackOverflowError

java.awt.FontMetrics.getWidths(FontMetrics.java:430)で

java.awt.FontMetrics.charWidth(FontMetrics.java:333)

java.awt.FontMetrics.getWidths(FontMetrics.java:430)で

java.awt.FontMetrics.charWidth(FontMetrics.java:333)

java.awt.FontMetrics.getWidths(FontMetrics.java:430)で

等々....

なんで?

4

3 に答える 3

3

ドキュメントから:

サブクラス作成者への注意: これらのメソッドの多くは閉じた相互再帰ループを形成するため、サブクラスが使用されたときに無限再帰を防ぐために、そのようなループごとに少なくとも 1 つのメソッドを実装するように注意する必要があります。特に、正確性を確保し、無限再帰を防ぐためにオーバーライドするメソッドの最小推奨セットを次に示します (ただし、他のサブセットも同様に実行可能です)。

これ:

FontMetrics metrics  = new FontMetrics(myFontTest) {};

メソッドをオーバーライドせずにサブクラスを定義しているため、表示されている動作になります。

于 2014-03-04T16:50:28.810 に答える
1

コードを次のように書き換えます。

try {
    Font myFontTest=new Font("Arial", Font.PLAIN, 11);
    Frame f = new Frame();
    //FontMetrics metrics = f.getToolkit().getFontMetrics(myFontTest);      
    FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(myFontTest);

    int characterWidth=metrics.charWidth('A');
    System.out.println(characterWidth);
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
于 2014-03-04T17:10:03.467 に答える