【问题标题】:Mysterious Runtime Error in JavaJava中的神秘运行时错误
【发布时间】:2013-07-08 20:57:55
【问题描述】:

我正在编写的 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 ; 存在

更奇怪的是,我尝试在我的 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.jav‌​a:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
bluej.runtime.ExecServer$3.run(ExecServer.java:725) 

提前感谢所有帮助,我真的被困住了。

【问题讨论】:

  • 向我们展示您遇到的错误
  • 这就是难倒我的地方。没有显示错误;该程序刚刚终止。我使用catch块尝试调试,当multiplier = multiplier+1行由于某种原因未注释时,程序只会输出“错误”编辑:它可能只是一个逻辑错误吗?
  • 您很可能在list.get() 上越界,试图访问不存在的索引。
  • 嗯...是的。那是因为你告诉它。执行e.printStackTrace(); 而不是System.out.println("error"); 并将结果放在问题的底部。
  • 不要用 == 符号比较字符串,在 if 子句中使用 equal()。它会给你永远假的;

标签: java loops file-io runtime-error csv


【解决方案1】:

试试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.

【讨论】:

  • 不,它仍然给出同样的错误。什么会导致扫描仪在完成整个文件之前提前结束?
【解决方案2】:

不要用 == 符号比较字符串,在 if 子句中使用 equal()。 在您的情况下,没有打印,因为 if 子句中的条件返回 false,因为您从扫描仪返回的字符串和您分配给“currenttarget”的字符串将通过引用进行比较,它们是不同的。

错误:

if((list.get(testingtarget) == currenttarget) && (list.get(testingfeature) == currentfeaturetype))

正确:

if((list.get(testingtarget).equals(currenttarget)) && (list.get(testingfeature).equals(currentfeaturetype)))

【讨论】:

  • 好的,你用eclipse吗?你用调试器吗?用调试器遍历一次循环以查看变量的值。
  • 乘数用作列表的索引。索引可能在某些时候超出了列表的范围。
  • 我正在下载eclipse atm,但有趣的是它说数组的大小是427,而实际上它应该在151450左右
  • 虽然应该使用 equals() 而不是 ==,但无论如何都会抛出错误,因为 testingTarget > list.size() -1。
  • 是的,由于某种原因,它的阅读量低于应有的水平,我正在研究它
【解决方案3】:

也许您需要在打印结束后刷新并关闭您的打印机,请尝试使用 writer.flush();和 writer.close();在乘数 = 乘数 +1 之前;并且不要使用 == 来比较 String 使用 equals

【讨论】:

  • 更改 System.out.println("error");与 System.out.println(e.getMessage);并粘贴结果
  • 它在上面,但我已经重新复制了它 java.lang.IndexOutOfBoundsException: Index: 432, Size: 427 at java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util .ArrayList.get(ArrayList.java:382) 在 Parse.main(Parse.java:28) 在 __SHELL4.run(__SHELL4.java:6) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect。 NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav‌​a:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 bluej.runtime.ExecServer $3.run(ExecServer.java:725) –
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多