2013-03-18 3 views
0

Я немного запутался прямо сейчас. Я сделал эту функцию, чтобы переписать мой массив 2D String в двумерный двойной массив. Но это отличает исключения nullpointer. Данные в d2 имеют формат: String [i] [0/1] где 0 и 1 - это число в формате «0.3343434».Преобразование массива 2D строк в 2D double

public void StringToDouble() { 
    unsorted = new double[d2.length][2]; 

    for(int i = 0; i < d2.length; i++) 
    { 
     unsorted[i][0] = Double.parseDouble(d2[i][0]);  
     unsorted[i][1] = Double.parseDouble(d2[i][1]); 
    } 

} 

Я получаю сообщение об ошибке, когда я печать несортированный [0] [0] и [1] [1].

Вот код целиком.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.nio.MappedByteBuffer; 
import java.nio.channels.FileChannel; 
import java.nio.charset.Charset; 
import java.util.ArrayList; 
import java.util.Scanner; 


public class LoadAndSort { 

String raw; 
double [][] data; 
String [] datastring; 

// 2D CONVERT 

String [] d1; 
String [][] d2; 
double[][] unsorted; 
double [][] sorted; 
String path = "src/data.dat"; 


public LoadAndSort() throws IOException { 



    // # Reads file from disk and stores to variable. 
    datas = readFile(path); 
    // # Splits the content, and sorts it into a huge string with relevant variables. 

    // # Splits on newline to order the lines. 
    d1 = datas.split("\\r?\\n"); 
    // # Splits on comma to convert to 2D Array. 
    Convert2D(); 
    // # Mirrors the 2D array because Mikal is gay. 
    //MirrorArray(); 
    //StringToDouble(); 

    System.out.println(unsorted[0][0]); 
    System.out.println(unsorted[0][1]); 

} 



private static String readFile(String path) throws IOException { 
    FileInputStream stream = new FileInputStream(new File(path)); 
    try { 
     FileChannel fc = stream.getChannel(); 
     MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
     /* Instead of using default, pass in a decoder. */ 

     return Charset.defaultCharset().decode(bb).toString(); 
    } 
    finally { 
     stream.close(); 
    } 
} 

public void Convert2D() { 

    d2 = new String[d1.length][]; 
    int r = 0; 
    for (String row : d1) { 
     d2[r++] = row.split(","); 
    } 
} 

public void StringToDouble() { 

    unsorted = new double[d2.length][2]; 


    for(int i = 0; i < d2.length; i++) 
    { 
     unsorted[i][0] = Double.parseDouble(d2[i][0]); 
     System.out.println(d2[i][0]); 

     unsorted[i][1] = Double.parseDouble(d2[i][1]); 
    } 

} 


} 

И ошибка из консоли:

0.00965821033009 
Exception in thread "main" java.lang.NullPointerException 
at LoadAndSort.<init>(LoadAndSort.java:48) 
at Runner.main(Runner.java:13) 
+3

Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). Поместите трассировку стека как [редактирование вопроса] (http://stackoverflow.com/posts/15477983/edit). –

+0

Ошибка в какой строке? – Sach

+3

Пожалуйста, покажите фактические значения в 'd2'. –

ответ

1

Вы инициализировать unsorted в StringToDoubleunsorted = new double[d2.length][2];), но вызов функции в конструкторе в настоящее время закомментирована, так unsorted никогда не будет инициализирован.

Таким образом, это будет null и NullPointerException будет выброшено здесь: это

System.out.println(unsorted[0][0]); 

Не уверен, единственная проблема, но первые вещи первой.

+0

Ну, дерьмо. Это действительно перехватило дыхание. Спасибо друг. :) – chriskvik

1

Вы также можете использовать Streams API из Java 8

Double[][] c = Arrays.stream(stringArray).map(
       a -> Arrays.stream(a).map(
         b -> Double.valueOf(b) 
         ).toArray(Double[]::new) 
       ).toArray(Double[][]::new); 
Смежные вопросы