为什么我会继续使用此代码获得ArrayIndexOutOfBoundsException? [英] Why do I keep getting an ArrayIndexOutOfBoundsException with this code?
问题描述
我是一个Java新手,似乎无法弄清楚为什么这个粗暴的20分钟的应用程序会抛出这个异常。
I'm a Java newbie and can't seem to figure out why this crude, 20 minute app is throwing that exception.
基本上我正在解析一个192MB (是的,192MB)制表符分隔的文本文件并将内容存储到MongoDB中。
Basically I am parsing a 192MB (yes, 192MB) tab-delimited text file and storing the contents into MongoDB.
package get_alternatenames;
import java.io.BufferedReader;
import java.io.FileReader;
import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import java.util.Set;
/**
*
* @author cbmeeks
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
String alternateNamesFileName = "/Users/cbmeeks/Projects/GetData/geonames/alternateNames.txt";
String line;
// MongoDB
Mongo m = new Mongo("localhost", 27017);
DB db = m.getDB("mydb");
// Build AlternateNames
DBCollection altNames = db.getCollection("alternatenames");
BufferedReader bReader = new BufferedReader(new FileReader(alternateNamesFileName));
int isPreferredName = 0;
int isShortName = 0;
int lines = 0;
System.out.println("Starting AlternateNames import...");
while ((line = bReader.readLine()) != null) {
String l[] = line.split("\t");
BasicDBObject altName = new BasicDBObject();
altName.put("alternateNameId", l[0]);
altName.put("geonameId", l[1]);
altName.put("isoLanguage", l[2]);
altName.put("alternateName", l[3]);
isPreferredName = 0;
isShortName = 0;
try {
if (l[4] != null) {
isPreferredName = Integer.parseInt(l[4]);
}
} catch (ArrayIndexOutOfBoundsException ex) {
isPreferredName = 0;
} catch (Exception ex) {
isPreferredName = 0;
}
try {
if (l[5] != null) {
isShortName = Integer.parseInt(l[5]);
}
} catch (ArrayIndexOutOfBoundsException ex) {
isShortName = 0;
} catch (Exception ex) {
isShortName = 0;
}
altName.put("isPreferredName", isPreferredName);
altName.put("isShortName", isShortName);
altNames.insert(altName);
lines++;
}
bReader.close();
System.out.println("Number of lines parsed: " + lines);
System.out.println("Creating indexes...");
altNames.createIndex(new BasicDBObject("geonameId", 1));
altNames.createIndex(new BasicDBObject("isoLanguage", 1));
altNames.createIndex(new BasicDBObject("alternateName", 1));
}
}
我知道这不是世界上最美丽的代码。它实际上似乎工作,直到最后。它成功地导入540万条记录,然后结束于:
I know this isn't the most beautiful code in the world. And it actually seems to work until around the end. It successfully imports 5.4 million records and then ends with:
Starting AlternateNames import...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
Java Result: 1
BUILD SUCCESSFUL (total time: 2 minutes 58 seconds)
我似乎找不到问题。我试图搜索文本文件找到一个问题,但是在192MB,除了MacVIM之外,似乎还没有办法处理它,我不知道该怎么办。哈哈
I can't seem to find what the problem is. I've tried to search the text file to find a problem but at 192MB, nothing seems to be able to handle it except MacVIM and I can't quite get my head around that program. lol
但是我确定没有完成文件。当我转到文本文件中导入的最后一个记录(根据MongoDB中的记录计数),看起来看起来很好...但是我可能会缺少某些东西。
But I am sure it isn't finishing the file. When I go to the last record imported in the text file (based on the record count in MongoDB) it appears to look fine...but I could be missing something.
任何建议?
谢谢。
BTW,用于在3分钟内解析该文本文件的Java ...
BTW, kudos to Java for parsing that text file in under 3 minutes...
推荐答案
这是我修正后的代码。感谢所有的提示。
Here is my corrected code that works. Thanks all for the tips.
package get_alternatenames;
import java.io.BufferedReader;
import java.io.FileReader;
import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import java.util.Set;
/**
*
* @author cbmeeks
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
String alternateNamesFileName = "/Users/cbmeeks/Projects/GetData/geonames/alternateNames.txt";
String line;
// MongoDB
Mongo m = new Mongo("localhost", 27017);
DB db = m.getDB("MyDB");
// Build AlternateNames
DBCollection altNames = db.getCollection("alternatenames");
BufferedReader bReader = new BufferedReader(new FileReader(alternateNamesFileName));
int isPreferredName = 0;
int isShortName = 0;
int lines = 0;
System.out.println("Starting AlternateNames import...");
while ((line = bReader.readLine()) != null) {
try {
String l[] = line.split("\t");
if (l.length >= 4) {
BasicDBObject altName = new BasicDBObject();
altName.put("alternateNameId", Integer.parseInt(l[0]));
altName.put("geonameId", Integer.parseInt(l[1]));
altName.put("isoLanguage", l[2]);
altName.put("alternateName", l[3]);
isPreferredName = 0;
isShortName = 0;
if (l.length == 5) {
isPreferredName = Integer.parseInt(l[4]);
}
if (l.length == 6) {
isPreferredName = Integer.parseInt(l[4]);
isShortName = Integer.parseInt(l[5]);
}
altName.put("isPreferredName", isPreferredName);
altName.put("isShortName", isShortName);
altNames.insert(altName);
lines++;
}
} catch (Exception ex) {
}
}
bReader.close();
System.out.println("Number of lines parsed: " + lines);
System.out.println("Creating indexes...");
altNames.createIndex(new BasicDBObject("geonameId", 1));
altNames.createIndex(new BasicDBObject("isoLanguage", 1));
altNames.createIndex(new BasicDBObject("alternateName", 1));
}
}
这篇关于为什么我会继续使用此代码获得ArrayIndexOutOfBoundsException?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!