2013-07-08 2 views
1

У меня проблемы с программой java, которую я пишу. Он предназначен для анализа текстового файла с разделителями табуляции, а затем хранения в списке массивов. Я пытаюсь изменить формат текстового файла с разделителями табуляции с помощью java-программы. Однако мой код получает нечетную ошибку времени выполнения. Вот мой кодЗагадочная ошибка Runtime в 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.jav‌​a:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
bluej.runtime.ExecServer$3.run(ExecServer.java:725) 

Заранее спасибо за помощь, я действительно застрял.

+5

Покажите нам ошибку, вы получаете –

+0

вот что пни меня. не отображается ошибка; программа просто заканчивается. Я использовал блок catch, чтобы попытаться отладить, и программа выведет только «ошибку», когда множитель = множитель + 1 строка по какой-то причине не была изменена edit: может это просто логическая ошибка? –

+0

Скорее всего, вы выходите за пределы на 'list.get()', пытаясь получить доступ к индексу, которого там нет. – iamnotmaynard

ответ

0

Попробуйте 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.
+0

Нет, он по-прежнему дает ту же ошибку. что может привести к преждевременному завершению работы сканера, прежде чем он завершит весь файл? –

0

Не пытайтесь сравнивать строки с символом ==, используйте equ() в вашем if-clause. В вашем случае нет печати, потому что условие в if-clause возвращает false, потому что строка, которую вы вернули из сканера, и строку, которую вы назначили «currenttarget», будут сравниваться по ссылке, которая отличается.

Неправильно:

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

Правильно:

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

Я пробовал это, но я все равно получаю ту же ошибку. –

+0

ok, вы используете eclipse? Используете ли вы отладчик? Пройдите цикл один раз с отладчиком, чтобы увидеть значения переменных. –

+1

множитель используется как индекс для списка. Вероятно, что индекс в какой-то момент за пределами списка. –

0

может быть, вам нужно промыть и закрыть PrintWriter после завершения печати, попробуйте writer.flush(); и writer.close(); перед множителем = множитель +1; и не использовать == для сравнения Используется значение строки

+0

Я просто trid его, он по-прежнему дает ту же ошибку в строке 28 –

+0

change System.out.println ("error"); с System.out.println (e.getMessage); и вставьте результат –

+0

это выше, но я его переработал java.lang.IndexOutOfBoundsException: Index: 432, Размер: 427 в java.util.ArrayList.rangeCheck (ArrayList.java:604) в java.util. ArrayList.get (ArrayList.java:382) в Parse.main (Parse.java:28) в __SHELL4.run (__ SHELL4.java:6) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на 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) - –

Смежные вопросы