Java StringTokenizer NoTouchElementExecOption错误
我得到了一个NoTouchElementException,现在调试它时,我注意到Car和Carmap被正确创建,并且值被正确存储,所以我不确定ST没有看到下一个令牌?或者当is发现不再有代币时它是否停止 感谢所有人的投入Java StringTokenizer NoTouchElementExecOption错误,java,Java,我得到了一个NoTouchElementException,现在调试它时,我注意到Car和Carmap被正确创建,并且值被正确存储,所以我不确定ST没有看到下一个令牌?或者当is发现不再有代币时它是否停止 感谢所有人的投入 Carmap = new HashMap<String,Car>(); //Change file path accordingly File f = new File("C:\\XXX\\XXX\\XXX\\CarFaxDB.txt");
Carmap = new HashMap<String,Car>();
//Change file path accordingly
File f = new File("C:\\XXX\\XXX\\XXX\\CarFaxDB.txt");
//Check to see if file exists, else create file
if (f.exists()){
String data[] = readFile(f);
for (int i =0; i<data.length; i++){
if (data[i] != null){
if (i>0){
String line = data[i];
StringTokenizer st = new StringTokenizer(line,",");
String VIN = st.nextToken();
String carMake = st.nextToken();
String carModel = st.nextToken();
int carYear = Integer.parseInt(st.nextToken());
data[i]= line;
Car car = new Car(VIN, carMake, carModel, carYear);
Carmap.put(car.getVIN(), car);
}
}
}
}
Carmap=newhashmap();
//相应地更改文件路径
文件f=新文件(“C:\\XXX\\XXX\\XXX\\CarFaxDB.txt”);
//检查文件是否存在,否则创建文件
如果(f.exists()){
字符串数据[]=readFile(f);
对于(int i=0;i0){
字符串行=数据[i];
StringTokenizer st=新的StringTokenizer(行,“,”);
字符串VIN=st.nextToken();
字符串carMake=st.nextToken();
字符串carModel=st.nextToken();
int carYear=Integer.parseInt(st.nextToken());
数据[i]=行;
汽车=新车(VIN、carMake、carModel、carYear);
Carmap.put(car.getVIN(),car);
}
}
}
}
错误即将出现,因为您尝试使用nextToken()
,但标记器没有更多的标记
在执行nextToken()
之前,您应该检查是否有更多令牌。您可以使用hasMoreTokens()
方法来执行此操作
此外,您应该检查是否得到一个非空的行
,并开始打印它,以查看它是否包含您期望的所有令牌
以下是更正后的代码片段:
Carmap = new HashMap<String,Car>();
//Change file path accordingly
File f = new File("C:\\Users\\XXX\\Documents\\CarFaxDB.txt");
//Check to see if file exists, else create file
if (f.exists()){
String data[] = readFile(f);
for (int i = 0; i < data.length; i++){
if (data[i] != null){
if (i > 0){
String line = data[i];
if(!StringUtils.isEmpty(line)) {
System.out.println(line);
StringTokenizer st = new StringTokenizer(line,",");
/* Check For More Tokens */
String VIN = st.hasMoreTokens() ? st.nextToken() : null;
/* Check For More Tokens */
String carMake = st.hasMoreTokens() ? st.nextToken() : null;
/* Check For More Tokens */
String carModel = st.hasMoreTokens() ? st.nextToken() : null;
/* Check For More Tokens */
int carYear = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
data[i] = line;
Car car = new Car(VIN, carMake, carModel, carYear);
Carmap.put(car.getVIN(), car);
}
}
}
}
}
Carmap=newhashmap();
//相应地更改文件路径
文件f=新文件(“C:\\Users\\XXX\\Documents\\CarFaxDB.txt”);
//检查文件是否存在,否则创建文件
如果(f.exists()){
字符串数据[]=readFile(f);
对于(int i=0;i0){
字符串行=数据[i];
如果(!StringUtils.isEmpty(行)){
系统输出打印项次(行);
StringTokenizer st=新的StringTokenizer(行,“,”);
/*检查更多令牌*/
字符串VIN=st.hasMoreTokens()?st.nextToken():null;
/*检查更多令牌*/
字符串carMake=st.hasMoreTokens()?st.nextToken():null;
/*检查更多令牌*/
字符串carModel=st.hasMoreTokens()?st.nextToken():null;
/*检查更多令牌*/
int carYear=st.hasMoreTokens()?Integer.parseInt(st.nextToken()):0;
数据[i]=行;
汽车=新车(VIN、carMake、carModel、carYear);
Carmap.put(car.getVIN(),car);
}
}
}
}
}
在调用StringTokenizer.nextToken()
之前,必须检查StringTokenizer是否有更多的令牌。你是这样做的:
Carmap = new HashMap<String,Car>();
//Change file path accordingly
File f = new File("C:\\Users\\XXX\\Documents\\CarFaxDB.txt");
//Check to see if file exists, else create file
if (f.exists()){
String data[] = readFile(f);
for (int i =0; i<data.length; i++){
if (data[i] != null){
if (i>0){
String VIN, carMake, carModel = null;
int carYear = 0;
String line = data[i];
StringTokenizer st = new StringTokenizer(line,",");
if(st.hasMoreTokens()) {
VIN = st.nextToken();
if(st.hasMoreTokens())
carMake = st.nextToken();
if(st.hasMoreTokens())
carModel = st.nextToken();
if(st.hasMoreTokens())
carYear = Integer.parseInt(st.nextToken());
data[i]= line;
if(VIN != null && carMake != null && carModel != null && carYear > 0)
Car car = new Car(VIN, carMake, carModel, carYear);
Carmap.put(car.getVIN(), car);
}
}
}
}
}
Carmap=newhashmap();
//相应地更改文件路径
文件f=新文件(“C:\\Users\\XXX\\Documents\\CarFaxDB.txt”);
//检查文件是否存在,否则创建文件
如果(f.exists()){
字符串数据[]=readFile(f);
对于(int i=0;i0){
字符串VIN,carMake,carModel=null;
int carYear=0;
字符串行=数据[i];
StringTokenizer st=新的StringTokenizer(行,“,”);
如果(st.hasMoreTokens()){
VIN=圣奈克特肯();
如果(st.hasMoreTokens())
carMake=st.nextToken();
如果(st.hasMoreTokens())
carModel=st.nextToken();
如果(st.hasMoreTokens())
carYear=Integer.parseInt(st.nextToken());
数据[i]=行;
如果(VIN!=null&&carMake!=null&&carModel!=null&&carYear>0)
汽车=新车(VIN、carMake、carModel、carYear);
Carmap.put(car.getVIN(),car);
}
}
}
}
}
请查看此问题的答案,它解释了更多内容。您能分享您文件的内容吗?看起来有空行,所以也要检查一下。@Ambrish这是我的错误,通常没有空行。我将对此进行编辑:唯一的问题是parseInt()不能接受st.hasMoreTokens()?st.nextToken():0。谢谢你的代码片段。我的坏的,愚蠢的复制粘贴。更新了解决方案。在
while(st.hasMoreTokens())
之后,字符串VIN=st.nextToken()代码>可以,但是字符串carMake=st.nextToken()呢代码>?你不应该使用while循环,而是检查每个语句。哦,我没有看到那些语句。我想每次调用StringTokenizer.nextToken()时都必须检查是否有更多的令牌。请看,如果没有更多的令牌可用,那么抛出NoSuchElementException是有记录的行为,因此您没有其他选择。但它不会破坏您的代码。我想每次您要调用StringTokenizer.nextToken()时,都必须检查是否有更多的令牌。是的,你是对的,但是你现在的建议会破坏规则。如果你做得好的话就不会了。我猜只有当你有VIN、carMake、carModel和carYear时,你才能创建一辆新车,但是如果你不能从StringTokennizer获得所有这些,那么你就不能创建汽车。