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

文档

子类的注意事项:由于这些方法中的许多方法形成封闭的、相互递归的循环,因此您必须注意在每个此类循环中至少实现一种方法,以防止在使用子类时无限递归。特别是,为了确保正确性并防止无限递归(尽管其他子集同样可行),以下是建议的最小覆盖方法集:

这个:

FontMetrics metrics  = new FontMetrics(myFontTest) {};

定义了一个没有覆盖任何方法的子类,因此您看到的行为。

于 2014-03-04T16:50:28.810 回答
2

这是一个解决方案:(
请参阅用户 Boris the Spider 的评论)在我的原始帖子中)

import java.awt.Canvas;
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);
                Canvas c = new Canvas();
                FontMetrics fm = c.getFontMetrics(myFontTest);
                int characterWidth=fm.charWidth('A');
                System.out.println(characterWidth);

    }

}
于 2014-03-04T17:08:08.940 回答
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 回答