我正在编写的一个java程序遇到了一些问题。它旨在分析制表符分隔的文本文件,然后将其存储到数组列表中。我正在尝试使用java程序更改制表符分隔的文本文件的格式。然而,我的代码得到了一个奇怪的运行时错误。以下是我的代码
import java.io.*;
import java.util.*;
public class Parse
{
public static void main(String[] args) {
try{
Scanner scanner = new Scanner(new File("C:\\Users\\Nelson Liu\\My Documents\\ParsePlanets\\SearchResults.txt"));
ArrayList < String > list = new ArrayList < String > ();
scanner.useDelimiter("\t");
while (scanner.hasNext()) {
list.add(scanner.next());
}
scanner.close();
String currenttarget = "Mercury";
String currentfeaturetype = "Albedo Feature";
String featuretypebeforecomma = "albedo";
PrintWriter writer = new PrintWriter("jpl-" + currenttarget + "-" + featuretypebeforecomma + ".txt", "UTF-8");
String classname = "jpl-" + currenttarget + "-" + featuretypebeforecomma;
int multiplier = 0;
int j = 0;
int testingtarget = 0;
int testingfeature = 0;
while (multiplier < 15145) {
testingtarget = (j+2) + (10*multiplier);
testingfeature = (j + 6) +(10*multiplier);
if((list.get(testingtarget) == currenttarget) && (list.get(testingfeature) == currentfeaturetype)){
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("CODE");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-2));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("TARGET");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("DIAMETER");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)+1));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("LATITUDE-LONGITUDE");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)+5));
writer.print(list.get((j+2) + (10*multiplier)+5) + "," + list.get((j+2) + (10*multiplier)+6));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("FEATURE-TYPE");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)+4));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("APPROVAL-STATUS");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)+5));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("APPROVAL-DATE");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)+6));
writer.print("\t");
writer.print("\n");
writer.print(classname);
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)-1));
writer.print("\t");
writer.print("ORIGIN");
writer.print("\t");
writer.print(list.get((j+2) + (10*multiplier)+7));
writer.print("\t");
writer.print("\n");
}
multiplier = multiplier +1 ;
}
} catch(Exception e){
System.out.println("error");
}
}
}我取消了第1行到第1行的注释,程序运行得很好,除非出现行乘数=乘数+1;
更奇怪的是,我尝试在IDE中使用调试器,结果主类显示为空。
堆栈跟踪(从注释复制):
java.lang.IndexOutOfBoundsException: Index: 432, Size: 427 at
java.util.ArrayList.rangeCheck(ArrayList.java:604) at
java.util.ArrayList.get(ArrayList.java:382) at Parse.main(Parse.java:28) at
__SHELL4.run(__SHELL4.java:6) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at
java.lang.reflect.Method.invoke(Method.java:606) at
bluej.runtime.ExecServer$3.run(ExecServer.java:725) 提前感谢你的帮助,我真的被卡住了。
发布于 2013-07-09 05:53:02
试试useDelimiter("\\t")。请访问String parsing in Java with delimeter tab "\t" using split查看讨论。
示例代码:
import java.util.Scanner;
public class ScannerTest
{
public static void main(String[] args)
{
String input = "Some\ttab delimited\tstring\twhere\tsome words\tare\tseparated\tby spaces.";
Scanner sc = new Scanner(input).useDelimiter("\\t");
while (sc.hasNext())
{
System.out.println(sc.next());
}
sc.close();
}
}输出:
Some
tab delimited
string
where
some words
are
separated
by spaces.发布于 2013-07-09 05:09:37
不要将字符串与等号进行比较,在if子句中使用== ()。在您的例子中,没有打印,因为if子句中的条件返回false,因为您从scanner返回的字符串和您分配给"currenttarget“的字符串将通过引用进行比较,这两个引用是不同的。
错误:
if((list.get(testingtarget) == currenttarget) && (list.get(testingfeature) == currentfeaturetype))正确:
if((list.get(testingtarget).equals(currenttarget)) && (list.get(testingfeature).equals(currentfeaturetype)))发布于 2013-07-09 05:38:32
也许你需要在打印结束后刷新并关闭你的打印器,尝试在writer.flush();和writer.close();之前使用multiplier = multiplier +1;并且不要使用==来比较使用等于的字符串
https://stackoverflow.com/questions/17535869
复制相似问题