Java 将二维字符串数组转换为二维双精度数组

Java 将二维字符串数组转换为二维双精度数组,java,arrays,nullpointerexception,Java,Arrays,Nullpointerexception,我现在有点困惑。我使用此函数将2D字符串数组重写为2D双数组。但它正在抛出空指针异常。d2中的数据格式如下: 字符串[i][0/1],其中0和1是格式为“0.3343434”的数字 public void StringToDouble(){ 未排序=新的双精度[d2.长度][2]; 对于(int i=0;i

我现在有点困惑。我使用此函数将2D字符串数组重写为2D双数组。但它正在抛出空指针异常。d2中的数据格式如下: 字符串[i][0/1],其中0和1是格式为“0.3343434”的数字

public void StringToDouble(){
未排序=新的双精度[d2.长度][2];
对于(int i=0;i
打印未排序的[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]);
    }

}


}
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.nio.MappedByteBuffer;
导入java.nio.channels.FileChannel;
导入java.nio.charset.charset;
导入java.util.ArrayList;
导入java.util.Scanner;
公共类LoadAndSort{
生丝;
双[]数据;
字符串[]数据字符串;
//二维转换
字符串[]d1;
字符串[][]d2;
双[][]未排序;
双[][]排序;
String path=“src/data.dat”;
public LoadAndSort()引发IOException{
//#从磁盘读取文件并存储到变量。
数据=读取文件(路径);
//#拆分内容,并将其排序为包含相关变量的巨大字符串。
//#在换行符上拆分以对行进行排序。
d1=数据分割(\\r?\\n”);
//#在逗号上拆分以转换为二维数组。
Convert2D();
//#镜像2D阵列,因为Mikal是同性恋。
//镜像阵列();
//StringToDouble();
System.out.println(未排序的[0][0]);
System.out.println(未排序的[0][1]);
}
私有静态字符串读取文件(字符串路径)引发IOException{
FileInputStream=新FileInputStream(新文件(路径));
试一试{
FileChannel fc=stream.getChannel();
MappedByteBuffer bb=fc.map(FileChannel.MapMode.READ_ONLY,0,fc.size());
/*不使用默认值,而是传入解码器*/
返回Charset.defaultCharset().decode(bb.toString();
}
最后{
stream.close();
}
}
公共空间(){
d2=新字符串[d1.长度][];
int r=0;
用于(字符串行:d1){
d2[r++]=行分割(“,”);
}
}
public void StringToDouble(){
未排序=新的双精度[d2.长度][2];
对于(int i=0;i
以及控制台中的错误:

 0.00965821033009
 Exception in thread "main" java.lang.NullPointerException
at LoadAndSort.<init>(LoadAndSort.java:48)
at Runner.main(Runner.java:13)
0.00965821033009
线程“main”java.lang.NullPointerException中出现异常
在LoadAndSort。(LoadAndSort.java:48)
位于Runner.main(Runner.java:13)

您在
StringToDouble
中初始化
unsorted
(使用
unsorted=new double[d2.length][2];
),但构造函数中的函数调用当前已注释掉,因此将永远不会初始化
unsorted

因此,它将是
null
,并在此处抛出
NullPointerException

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

不确定这是否是唯一的问题,但首先要做的是。

您也可以使用Java8中的Streams API

Double[][] c = Arrays.stream(stringArray).map(
                a -> Arrays.stream(a).map(
                        b -> Double.valueOf(b)
                        ).toArray(Double[]::new)
                ).toArray(Double[][]::new);

为了更快地获得更好的帮助,请发布一个。将堆栈跟踪发布为。请在
d2
@SachinPasalkar中显示实际值,如果OP回答“第42行”,您能解决这个问题吗?SSCCE与堆栈跟踪相结合提供了准确的信息。最有可能的是
d2
,它的一行或一个单元格是
null
。安德鲁·汤普森:我知道,但是如果nullPointerException被抛出unsorted=new double[d2.length][2];我们可以说d2没有初始化。在上面的代码中,这是第一个导致空指针异常的部分。那一次真的让我大吃一惊。谢谢,伙计。:)如何使用原语
double
类型执行此操作?
Double[][] c = Arrays.stream(stringArray).map(
                a -> Arrays.stream(a).map(
                        b -> Double.valueOf(b)
                        ).toArray(Double[]::new)
                ).toArray(Double[][]::new);