Java StringTokenizer NoTouchElementExecOption错误

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");

我得到了一个NoTouchElementException,现在调试它时,我注意到Car和Carmap被正确创建,并且值被正确存储,所以我不确定ST没有看到下一个令牌?或者当is发现不再有代币时它是否停止

感谢所有人的投入

    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获得所有这些,那么你就不能创建汽车。