我在Kmeans集群上遇到问题,我实际上需要将来自记事本的数据输入集群到一些集群中。但是我遇到异常并且cpde运行不正常。请帮忙解决这个错误
Exception in thread "main" java.lang.NullPointerException
at general.kmeangeneral.main(kmeangeneral.java:144)
我希望有人可以帮助我,这是我的代码
import java.*;
import java.lang.*;
import java.io.*;
import java.util.*;
import java.lang.String.*;
import java.awt.event.*;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.StringReader.*;
import java.util.Vector;
import java.util.Iterator;
import javax.swing.table .*;
public class kmeangeneral{
public static void main(String args[])throws Exception{
int words = 0;
int chars = 0;
int lines = 0;
String s,sp1;
StringTokenizer st;
ArrayList x=new ArrayList();
FileReader fr = new FileReader("t1.txt");
BufferedReader buf=new BufferedReader(fr);
while((s=buf.readLine())!=null)
{
lines++;
st=new StringTokenizer(s," ,;:.");
while(st.hasMoreTokens())
{
words++;
s=st.nextToken();
chars+=s.length();
Double y=new Double(s);
x.add(y);
}
}
System.out.println("Word Count : "+words/lines);
System.out.println("Line Count : "+lines);
Double ct[] = new Double[0];
ct = (Double []) x.toArray(ct);
/* Input array, values to be read in successively, float*/
double[][] indat = new double[lines][lines*words];
int inval =0;
BufferedReader buf1=new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter K-Value : ");
sp1=buf1.readLine();
Integer ky=new Integer(sp1);
int k= ky;
System.out.println("K == "+ k);
// Now read in input array values, successively
for (int i = 0; i < lines; i++) {
for (int j = 0; j < words/lines; j++) {
indat[i][j] = ct[inval];
inval++;
System.out.print(indat[i][j]);
System.out.print("\t");
}System.out.println();
}
// Vector <Vector <String>> MyVector;
// MyVector= new Vector <Vector <String>>(5,5);
// MyVector.add("1");
// Vector clst = convertToVector(Object[k][words] indat);
// Initial Clusters
System.out.println(" " );
System.out.println(k + " seed points " );
double[][] Clusters = new double[k][lines*words];
double[][] calcnt = new double[lines][words];
double[][] array = new double[k][lines*words];
// int pos=0;
for (int i = 0; i < k; i++) {
for (int j = 0; j < words/lines; j++) {
Clusters[i][j] = indat[i][j];
// pos= j;
System.out.print(Clusters[i][j]);
System.out.print("\t");
}System.out.println();
}
Vector [][] FinalClusters = new Vector[k][lines*words];
for (int i = 0; i < k; i++) {
for (int j = 0; j < words/lines; j++){
FinalClusters[i][j].add(String. valueOf(Clusters[i][j]));
}
}
// Inital Cluster Array
System.out.println("Initial Cluster Array");
int b=0;
double [] arr = new double[lines*(words/lines)];
for (int i = 0; i < k; i++) {
for (int j = 0; j < words/lines; j++) {
arr[b]= Clusters[i][j]; // = indat[i][j];
System.out.print(arr[b]);
System.out.print("\t");
b++;
}
}System.out.println();
// System.out.print("Position ="+pos);
// System.out.println();
// System.out.println("MAGIC 1");
// Claculate Centroids
System.out.println("Centroids");
for (int i = 0; i < k; i++) {
for (int j = 0; j < words/lines; j++) {
calcnt[i][j] =(Clusters[i][j]+ indat[k][j])/2;
System.out.print(calcnt[i][j]);
System.out.print("\t");
}
}
// Claculate Distances
// System.out.println("MAGIC # 3");
double[]dist = new double[k];
for (int i = 0; i < k; i++) {
double dis=0;
for (int j = 0; j < words/lines; j++) {
dis = dis + (Math.pow(Clusters[i][j]- indat[k][j],2));
}
dist[i] = (Math.sqrt(dis));
System.out.println("From Cluster K = " + i + "\t"+ "Distance" + dist[i]);
}
System.out.println("To Find Minimum Distance ");
double min = dist[0];
int y=0;
for (int m = 0; m < k; m++) {
if(dist[m] < min){
min = dist[m];
y=m;
}
} System.out.print("Min Value =" + min +"\t"+"For Cluster :"+y);
System.out.println();
System.out.print("Added Cluster =");
double [] temp = new double[lines*(words/lines)];
for (int j = 0; j < words/lines; j++) {
temp[j]= indat[k][j];
System.out.print(temp[j]);
System.out.print("\t");
}System.out.println();
Vector[] vector = new Vector[k];
for (int i = 0; i < k; i++){
vector[i] = new Vector();
}
for (int i = 0; i < words/lines; i++){
vector[y].add(String.valueOf(temp[i]));
}
System.out.println(Arrays.toString(vector));
/*
Vector v = new Vector ();
for(int z=0; z<y;z++ )
v.add(Clusters[k][z]);
for(int a=pos; a< (pos + (words/lines));a++){
System.out.println(Clusters[y][a]);
//Clusters[y][a] = indat[k][a];
pos = a;
}
System.out.println(pos); */
}
}
答案 0 :(得分:2)
您没有正确初始化数组。
Vector [][] FinalClusters = new Vector[k][lines*words];
创建一个只包含null
个指针的数组。
FinalClusters[i][j].add(String. valueOf(Clusters[i][j]));
然后绑定在add
值上调用null
,即NullPointerException
。如果需要存储实际向量的数组,则必须对其进行初始化。现在,它是一个存储Vector的数组 。