运行以下代码:
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);
}
}
产生此错误:
线程“main”中的异常java.lang.StackOverflowError
at java.awt.FontMetrics.getWidths(FontMetrics.java:430)
at java.awt.FontMetrics.charWidth(FontMetrics.java:333)
at java.awt.FontMetrics.getWidths(FontMetrics.java:430)
at java.awt.FontMetrics.charWidth(FontMetrics.java:333)
at java.awt.FontMetrics.getWidths(FontMetrics.java:430)
依旧......
为什么?
答案 0 :(得分:3)
来自the doc:
对子类的注意事项:由于这些方法中的许多方法是相互封闭的 递归循环,你必须注意你实现至少一个 每个这样的循环中的方法可以防止你的无限递归 使用子类。特别是,以下是最小的 建议的一组方法来覆盖,以确保正确性 并防止无限递归(尽管其他子集是相同的 可行):
此:
FontMetrics metrics = new FontMetrics(myFontTest) {};
定义了一个子类,没有重写任何方法,因此你看到的行为。
答案 1 :(得分:1)
这是一个解决方案:
(请参阅用户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);
}
}
答案 2 :(得分: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();
}