首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中神秘的运行时错误

Java中神秘的运行时错误
EN

Stack Overflow用户
提问于 2013-07-09 04:57:55
回答 3查看 219关注 0票数 1

我正在编写的一个java程序遇到了一些问题。它旨在分析制表符分隔的文本文件,然后将其存储到数组列表中。我正在尝试使用java程序更改制表符分隔的文本文件的格式。然而,我的代码得到了一个奇怪的运行时错误。以下是我的代码

代码语言:javascript
复制
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中使用调试器,结果主类显示为空。

堆栈跟踪(从注释复制):

代码语言:javascript
复制
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.jav‌​a:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
bluej.runtime.ExecServer$3.run(ExecServer.java:725) 

提前感谢你的帮助,我真的被卡住了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-09 05:53:02

试试useDelimiter("\\t")。请访问String parsing in Java with delimeter tab "\t" using split查看讨论。

示例代码:

代码语言:javascript
复制
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();
    }
}

输出:

代码语言:javascript
复制
Some
tab delimited
string
where
some words
are
separated
by spaces.
票数 0
EN

Stack Overflow用户

发布于 2013-07-09 05:09:37

不要将字符串与等号进行比较,在if子句中使用== ()。在您的例子中,没有打印,因为if子句中的条件返回false,因为您从scanner返回的字符串和您分配给"currenttarget“的字符串将通过引用进行比较,这两个引用是不同的。

错误:

代码语言:javascript
复制
if((list.get(testingtarget) == currenttarget) && (list.get(testingfeature) == currentfeaturetype))

正确:

代码语言:javascript
复制
if((list.get(testingtarget).equals(currenttarget)) && (list.get(testingfeature).equals(currentfeaturetype)))
票数 0
EN

Stack Overflow用户

发布于 2013-07-09 05:38:32

也许你需要在打印结束后刷新并关闭你的打印器,尝试在writer.flush();和writer.close();之前使用multiplier = multiplier +1;并且不要使用==来比较使用等于的字符串

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17535869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档