运行以下代码:
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中的异常
在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)
等等..。
为什么?
发布于 2014-03-04 17:08:08
以下是一个解决方案:
(见用户的评论)
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-04 16:50:28
来自医生
注意子类:由于这些方法中有许多是封闭的、相互递归的循环,因此必须注意在每个此类循环中至少实现一个方法,以防止在使用子类时出现无限递归。特别是,以下是为确保正确性和防止无限递归(尽管其他子集同样可行)而建议的最小方法集:
这是:
FontMetrics metrics = new FontMetrics(myFontTest) {};定义一个没有重写任何方法的子类,因此您将看到这样的行为。
发布于 2014-03-04 17:10:03
按照以下方式重写代码:
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();
}https://stackoverflow.com/questions/22177948
复制相似问题