2015-02-27 2 views
-1

По какой-то причине, когда я запускаю эту программу, она не работает ... Предположим, что вы читаете из текстового файла, содержащего несколько слов, а затем печатаете анаграммы этих слов в новый файл, каждое слово и его анаграммы в одну линию, а затем следующее слово и его анаграммы в следующей строке ...Моя программа анаграмм не работает

входной текстовый файл содержит пример

«hpesvy

wounxppzu

xznoug

ehsypv

zpwuonxpu

xrqryptcb

uzngxo

gzuonx

ysepvh

uozgnx "

Java Ass2 inputfile.txt output

Я получаю сообщение об ошибке "нулевой"

и все отлично компилируется. Я понятия не имею, что происходит, может ли кто-нибудь помочь?

Код Организации состоит из двух файлов.

import java.io.*; 
import java.io.FileWriter; 
import java.util.*; 


public class Ass2 { 
    public static void main(String[] args) { 

     if (args.length == 2){ 
      String inFile = args[0]; 
      String outFile = args[1]; 

      try{ 
       FileReader fr = new FileReader(inFile); 
       LineNumberReader lnr = new LineNumberReader(fr); 

       int linenumber = 0; 

       while (lnr.readLine() != null){ 
        linenumber++; 
       } 
       FileInputStream fstream = new FileInputStream(inFile); 
       DataInputStream in = new DataInputStream(fstream); 
       BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

       String strLine; 
       String [] array = new String[linenumber]; 
       //Read File line by line 
       int i = 0; 
       while ((strLine = br.readLine()) != null){ 
        array[i] = strLine; 
        i++; 
       } 
       in.close(); 
       //String[] sorted = InsertionSort(array); 
       //fileWrite(sorted, outFile); 
       isAnagram(array); 
      } 
      catch(Exception e){//Catch exception if any 
       System.err.println("Error: " + e.getMessage()); 
      } 
     } 
     else{ 
      System.out.println("I need 2 arguments"); 
      } 
    } 

    private static void fileWrite(String[] array, String outFile) { 
     BufferedWriter filewrite = null; 
     try{ 
      filewrite = new BufferedWriter(new FileWriter(outFile)); 
      filewrite.newLine(); 
      for(int i=0; i<array.length; i++){ 
       filewrite.write(array[i]); 
       filewrite.newLine(); 
      } 
      filewrite.close(); 
      } 
     catch (IOException e){}   
    } 

    public static char[] InsertionSort(char[] array){ 
     //Insertion Sort algorithm from class 
     int j; 
     for(int i=1; i<array.length; i++){ 
      char tmp = array[i]; 
      for(j=i; j>0 && tmp<array[j-1]; j--){ 
       array[j] = array[j-1]; 
      } 
      array[j] = tmp; 
     } 
     return array; 
    } 

    public static void isAnagram(String [] sorted){ 
     Node[] linkedListArray = new Node[sorted.length]; 
     String tmp1 = ""; 
     String tmp2 = ""; 
     String [] myarray = new String [sorted.length]; 

     for (int i = 0; i < sorted.length-1; i++) { 
      for(int a=i+1; a<sorted.length; a++){ 
      tmp1 = sorted[i]; 
      tmp2 = myarray[a]; 

      if (tmp1.length() == tmp2.length()){ 
       char [] a1 = tmp1.toCharArray(); 
       a1 = InsertionSort(a1); 
       char [] a2 = tmp2.toCharArray(); 
       a2 = InsertionSort(a2); 
       int j = 0; 
       boolean isAnan = true; 
       while (j<a1.length && isAnan == true){ 
        if (a1[j] != a2[j]){ 
         System.out.println(tmp1+ " is not An "+tmp2); 
         Node newLink = new Node(tmp1); 
         linkedListArray[j] = newLink; 

        } 
        j++; 
       } 
      } 
     } 
    } 
    } 
    } 

.

public class Node { 
     public String item; 
     public Node next; 
     public Node(String tmp1){ 
      this.item = tmp1; 
     } 
    } 

    class InsertionSort{ 
     private Node head; 
     public InsertionSort(){ 
      head = null; 
     } 
     public InsertionSort(Node[] linkedListArray){ 
      head = null; 
      for(int j=0; j<linkedListArray.length; j++) 
       insert(linkedListArray[j]); 
     } 
     public void insert(Node newNode){ 
      Node previous = null; 
      Node current = head; 
     while(current != null && current.item.compareTo(newNode.item)>0){ 
      previous = current; 
      current = current.next; 
     } 
     if(previous==null) 
      head = newNode; 
     else 
      previous.next = newNode; 
      newNode.next = current; 
     } 
     public Node nextNode(){ 
      Node temp = head; 
      head = head.next; 
      return temp; 
     } 
    } 
+2

Вы пытались отладить свой код? – Jens

+1

Опубликовать трассировку ошибки. – Laerte

+0

Как я могу отладить это, если я просто запустил его на терминале на Mac? – 2WeeksToGO

ответ

3

Бро, вы совершаете кардинальный грех.

catch (IOException e) { 
    } 

Это полностью скрывает доказательства того, что что-то не так с вашим кодом. Первое, что вам нужно сделать, это изменить, что это:

catch (IOException e) { 
     e.printStackTrace(); 
    } 

Следующая вещь неправильно, вы обрабатывающее исключение, как это:

System.err.println("Error: " + e.getMessage()); 

Вот где ваше сообщение (Error: null) приходит от, потому что NullPointerException обычно не имеет сообщения. Итак, второе, что вам нужно сделать, это изменить это на то же самое. e.printStackTrace();.

Тогда у вас будет полная информация о том, что происходит не так.

Это далеко не полный учебник по правильной обработке исключений на Java. Я просто инструктирую вас о минимальной минимальной информации, необходимой для отладки.

На самом деле, за то, что вы делаете, вы действительно не должны ловить никаких исключений вообще.Вы должны избавиться от ваших try..catch блоков и пусть любые исключения будут выброшены из вашего метода main следующим образом:

public static void main(String[] args) throws Exception 
+0

Хорошо спасибо! Таким образом, сообщение об ошибке «Исключение в потоке "главный" java.lang.NullPointerException \t в Ass2.isAnagram (Ass2.java:114) \t в Ass2.main (Ass2.java:63) « » Итак, я все еще озадачен, код имеет все, что ему нужно, он работал до и теперь его сломал. – 2WeeksToGO

+1

Как заметил @Marvin, элементы вашего 'myarray' не были инициализированы' String ', поэтому элементы являются« null », поэтому« NullPointerException »вызывается при попытке вызвать метод с нулевой ссылкой. – gknicker

+0

Я честно потратил часы на этот код, я просто больше этого не понимаю, как я могу инициализировать значения так, чтобы они были строками в пределах myarray? – 2WeeksToGO

2

Ваша ошибка в методе isAnagram. Смотрите следующий экстракт:

String[] myarray = new String[sorted.length]; 

    for (int i = 0; i < sorted.length - 1; i++) { 
     for (int a = i + 1; a < sorted.length; a++) { 
      tmp1 = sorted[i]; 
      tmp2 = myarray[a]; 

      if (tmp1.length() == tmp2.length()) { 

myarray представляет собой массив, состоящий только из null значений. Поэтому tmp2 также будет null, поэтому tmp2.length() выбрасывает исключение NullPointerException.

+0

Но мне нужен myarray здесь, я не могу избавиться от него, он работал в моих учебниках, почему он здесь не работает? – 2WeeksToGO

+0

Я считаю, что вы можете инициализировать 'myarray' значениями' sorted'? 'String [] myarray = new String [sorted.length];' 'System.arraycopy (отсортировано, 0, myarray, 0, sorted.length);' – Marvin

+0

спасибо, код по-прежнему не работает .. I должен будет увидеть моего профессора об этом. Спасибо за помощь – 2WeeksToGO

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