Java中ArrayList实例化报错求助:语法错误问题排查
解决ArrayList泛型声明的语法错误问题
嘿,我一眼就看到你代码里的问题啦——泛型的声明位置写错了,这就是导致那个syntax error on token "(", Expression expected after this token错误的原因。
错误原因分析
你写的代码行:
persons = new ArrayList () < personInfo > ();
Java里泛型的尖括号<>应该紧跟在类名ArrayList后面,而不是放在构造方法括号之后。正确的泛型初始化语法是把类型参数放在类名和构造方法括号之间。
修正方案
有两种正确的写法可以选:
- 明确指定泛型类型(适用于所有Java版本):
persons = new ArrayList<personInfo>();
- 使用菱形运算符
<>(Java 7及以上版本支持,编译器会自动推断泛型类型):
persons = new ArrayList<>();
修正后的完整AddressBook类代码
import javax.swing.*; import java.util.*; public class AddressBook { ArrayList<personInfo> persons; public AddressBook() { // 这里已经修正了泛型的写法 persons = new ArrayList<personInfo>(); // 或者用更简洁的菱形运算符:persons = new ArrayList<>(); } public void addPerson() { String name = JOptionPane.showInputDialog("Enter Person Name"); String add = JOptionPane.showInputDialog("Enter Address"); String ph = JOptionPane.showInputDialog("Enter Phone Number"); personInfo p = new personInfo(name, add, ph); persons.add(p); } public void searchPerson(String n) { // 因为已经用了泛型,这里不需要再强制类型转换啦 for (personInfo p : persons) { if (n.equals(p.name)) { p.print(); } } } public void deletePerson(String n) { // 注意:用普通for循环删除元素时要注意索引偏移问题,这里推荐用迭代器更安全 Iterator<personInfo> iterator = persons.iterator(); while (iterator.hasNext()) { personInfo p = iterator.next(); if (n.equals(p.name)) { iterator.remove(); } } } }
额外的小建议
- Java的类名规范是大驼峰命名法,所以
personInfo建议改成PersonInfo,这是行业通用的编码规范,能让代码更易读。 - 在
searchPerson方法里,因为我们已经给ArrayList指定了泛型类型,所以不需要再做(personInfo)的强制类型转换,直接遍历即可。 - 在
deletePerson方法里,原来的普通for循环删除元素可能会导致漏删(因为删除元素后后面的元素会前移,索引会错位),用迭代器Iterator删除是更稳妥的做法。
内容的提问来源于stack exchange,提问作者user7418416
相关产品推荐
相关产品推荐

