用户报告某个YouTube视频导致我们的程序失败.经过调查,似乎将包含该视频标题的String添加到JTable会导致渲染代码中的某处出现ArrayIndexOutOfBoundsException.
我们已经在Windows XP,7和8以及Ubuntu上的Java 7u45和Java 8(b121)上测试并确认了这一点.
这是一个测试程序,展示了这个问题:
import javax.swing.*;
import java.awt.*;
public class TestJTableAIOOBE {
private static final String TEXT = "\u0D38\u0D4D\u0D31\u0D4D\u0D31\u0D40\u0D32\u0D4D\u200D \u0D15\u0D31\u0D3F\u0D15\u0D4D\u0D15\u0D24\u0D4D\u0D24\u0D3F\u0D2F\u0D3F\u0D32\u0D4D\u200D \u0D2F\u0D47\u0D36\u0D41\u0D15\u0D4D\u0D30\u0D3F\u0D38\u0D4D\u0D24\u0D41\u0D35\u0D3F\u0D28\u0D4D\u0D31\u0D46 \u0D30\u0D42\u0D2A\u0D02 \u0D2A\u0D4D\u0D30\u0D24\u0D4D\u0D2F\u0D15\u0D4D\u0D37\u0D2A\u0D4D\u0D2A\u0D46\u0D1F\u0D4D\u0D1F\u0D41";
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Font font = findFont();
if (font == null) {
System.out.println("No suitable font found");
return;
}
System.out.println("Using font: " + font);
JTable table = new JTable(new Object[][]{{TEXT}}, new Object[]{"title"});
table.setFont(font);
JFrame frame = new JFrame();
frame.add(table);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setVisible(true);
} …
Run Code Online (Sandbox Code Playgroud) Java 有两个重载,分别用于 String.toLowerCase 和 toUpperCase。其中一个重载将 Locale 作为参数,而另一个重载不带参数并使用默认 locale ( Locale.getDefault()
)。
无参数变体可能无法按预期工作,因为大小写转换尊重国际化,并且默认语言环境取决于系统。最值得注意的是,小写的 i 被转换为大写的 ? 在土耳其语地区。
这些方法的目的是什么?无参数变体有任何合法用途吗?或者也许他们只是一个设计错误?(与默认情况下使用系统默认字符编码的几个 I/O API 不同。)