2017-02-09 3 views
1

Я думаю, что моя проблема здесь является немой, синтаксической проблемой, но вот она. Я пишу программу, которая берет CSV-файл, который представляет собой 3 строки из 4 столбцов чисел. Я беру этот файл в качестве параметра во время выполнения, затем разбиваю символ новой строки (\ n), а затем разбиваю на разделитель запятой. Затем я сохраняю это в «2D-массив» типа String. Затем я беру каждое значение, разберусь, чтобы удвоить, и заполнить второй «2D-массив», но в два раза на этот раз. Все работает хорошо.Исключение номера формата в классе

Моя проблема в том, когда я попытался взять весь этот код и поместить его в свой класс. Я добавил конструктор к основному, и в классе я скопировал и вставил ранее рабочий код. Но теперь, когда синтаксический анализ из строки в double, я получаю исключение NumberFormatException при переходе с 4-го на 5-й элемент. Точный же код работает при кодировании в основном.

Я думаю, что мое знание классов - это моя проблема здесь.

Вот класс творю:

import java.lang.*; 

public class DataMatrix { 

    private double[][] dMatrix; 

    public DataMatrix(String text) { 

     String[] line = text.split("\n"); 
     // Creates an array for the CSV file 
     String[][] sMatrix = new String[line.length][]; 

     for(int i=0; i < line.length; i++) 
      sMatrix[i] = text.split(","); 
     System.out.println("Original String: "); 

     for(int x=0; x < sMatrix.length; x++) { 
      for(int j=0; j <= line.length; j++) { 
       System.out.println(sMatrix[x][j]); 
      } 
     } 

     double[][] dMatrix = new double[sMatrix.length][]; 
     System.out.println("Converted to double: "); 

     for(int x=0; x < sMatrix.length; x++) { 
      dMatrix[x] = new double[sMatrix[x].length]; 
      for(int j=0; j <= sMatrix.length; j++) { 

       dMatrix[x][j] = Double.parseDouble(sMatrix[x][j]); 
       System.out.println(dMatrix[x][j]); 
      } 
     } 
    } 
} 

Вот мой главный (игнорировать комментарии, используя их, когда я копировать/вставить материал из него):

import java.lang.*; 

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

// DecimalFormat df = new DecimalFormat("#.##"); 

     //Make sure the user passed the command line argument - and nothing else 
     if (args.length != 1){ 
      System.out.println("Assignment1 takes exactly one command-line argument."); 
      System.out.println("Usage: java Assignment1 some_file.csv"); 
      System.exit(0); 
     } 

     String csvFileName = args[0]; 

     //Instantiate my custom file reader 
    CSVReader fileReader = new CSVReader(); 

     //Read the file into a string 
     String text = fileReader.readFile(csvFileName); 
    DataMatrix matrix = new DataMatrix(text); 

}//end of main 
}//end of class 

EDIT: Здесь мой выход:

Files contents: 
1,2,3,4 
3,4,1,0 
2,3,4,2 

Original String: 
1 
2 
3 
4 
3 
4 
1 
0 
2 
3 
4 
2 

Converted to double: 
1.0 
2.0 
3.0 
Exception in thread "main" java.lang.NumberFormatException: For input string: "4 3" 

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1250) 
at java.lang.Double.parseDouble(Double.java:540) 
at DataMatrix.<init>(DataMatrix.java:30) 
at Assignment1.main(Assignment1.java:22) 
+0

Укажите строку входа csv, которая не работает. Чтобы облегчить воспроизведение ошибки, временно добавьте отладочный вывод String doubleString = sMatrix [x] [j]; try { Double.parseDouble (doubleString); } catch (NumberFormatException e) { System.out.println ("NFE on:" + doubleString); } – JanPl

+0

Не эта строка 'sMatrix [i] = text.split (", ");' предполагается быть 'sMatrix [i] = строка [i] .split (", ");'? –

+0

Отредактировано мое сообщение, чтобы показать ошибку вывода. –

ответ

0

локальная переменная dMatrix в конструкторе скрыть атрибут dMatrix

Просто введите double[][] dMatrix = new double[sMatrix.length][]; в код конструктора от dMatrix = new double[sMatrix.length][];.

+0

Спасибо за ваш ответ. При этом я получаю ошибку NullPointException. –

+0

Не удаляйте всю строку. Вы только что объявили «2-D Array» глобально. Тем не менее вам нужно предоставить ссылку, так что измените эту строку с помощью 'dMatrix = new double [sMatrix.length] [];' @NickM –

+0

@SanketMakani. Когда я это делаю, я получаю то же самое sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal) ошибка. Строка 30 в DataMatrix.java и строка 22 в Assignment1.java –

0

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

import java.lang.*; 

public class DataMatrix { 

    public DataMatrix(String text) { 
     //Replace the new line character (\n or \\r or \r\n) with a comma and split based on comma. 
     String[] numbers = text.replaceAll("\r?\n|\r", ",").split(","); 
     for(int i=0; i<numbers.length; i++) 
      System.out.println(Double.parseDouble(numbers[i])); 

    } 
}