Java中用OpenCSV读CSV文件遇NoClassDefFoundError与ClassNotFoundException
我正在开发一个自动发送邮件的应用,流程为先读取CSV文件,创建Recipient类实例并存入ArrayList。但运行时出现大量错误,包括NoClassDefFoundError和ClassNotFoundException。
代码实现
import java.util.ArrayList; import java.util.List; import java.io.FileReader; import java.io.IOException; import com.opencsv.CSVReader; import com.opencsv.exceptions.CsvException; public class UserDataLoader { private final String url; private ArrayList<RECIPIENT> mailingList = new ArrayList<>(); public UserDataLoader (String url){ this.url = url; } public void loadData(){ try (CSVReader reader = new CSVReader(new FileReader(url))) { List<String[]> records = reader.readAll(); for (int i = 1; i <= records.size(); i++){ String[] record = records.get(i); String name = record[0]; String emailAddress = record[1]; String dateOfBirth = record[2]; RECIPIENT customer = new RECIPIENT(name, emailAddress, dateOfBirth); mailingList.add(customer); } } catch (IOException | CsvException e) { e.printStackTrace(); } } public ArrayList<RECIPIENT> getMailinList(){ return mailingList; } }
错误日志
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/ObjectUtils
at com.opencsv.CSVParser.(CSVParser.java:110)
at com.opencsv.CSVReader.(CSVReader.java:99)
at UserDataLoader.loadData(UserDataLoader.java:19)
at App.main(App.java:5)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.ObjectUtils
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 4 more
我预期不会出现错误,不清楚问题来源。已下载OpenCSV并添加到VSCode的引用库中,所有Java文件和CSV文件都在同一文件夹内。
1. 解决依赖缺失问题
错误核心是OpenCSV依赖的Apache Commons Lang3库未被引入,导致运行时找不到org.apache.commons.lang3.ObjectUtils类:
- 下载Apache Commons Lang3的jar包,添加到VSCode的项目引用库中,确保运行环境能加载到该类。
- 若使用Maven/Gradle管理项目,直接添加对应依赖配置,可自动处理依赖链,避免手动下载遗漏。
2. 修复代码中的潜在问题
- 数组索引越界:循环条件
i <= records.size()会触发IndexOutOfBoundsException,List索引从0开始,最后一个元素索引为records.size()-1,应修改为i < records.size()。 - 类名一致性:代码中使用
RECIPIENT,但Java类名规范为大驼峰(Recipient),需确认实际类名与代码调用一致,避免类找不到的问题。 - 方法名拼写错误:
getMailinList()应为getMailingList(),拼写错误会导致调用时出现异常。
内容的提问来源于stack exchange,提问作者dawsUTV

