【问题标题】:exception in thread on KMeans clustering [error]KMeans 聚类中的线程异常 [错误]
【发布时间】:2012-02-07 19:18:12
【问题描述】:

我在 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);      */


   }
 }

【问题讨论】:

  • 至少,向我们展示发生 NPE 的确切代码行。如果我将您的代码复制并粘贴到编辑器中,我得到的第 144 行可能与异常无关。
  • @aix 显然,每一行都没有错误标志,但我总是得到异常导致程序运行不正常。这是错误消息'在 general.kmeangeneral.main(kmeangeneral.java:144) Java Result: 1 BUILD SUCCESSFUL (total time: 4 seconds)'的线程“main” java.lang.NullPointerException 中的异常'
  • 您也可以提交一个示例 t1.txt 吗? -谢谢
  • 能否请您指出文件的第 144 行? (您粘贴的代码中没有行号,当我尝试找到它时,似乎 System.out.println("Initial Cluster Array"); 是行,这极不可能导致 NPE。
  • 可怕的格式、命名和设计。您使用的是 java 1.4?

标签: java cluster-analysis k-means


【解决方案1】:

你没有正确初始化你的数组。

Vector [][] FinalClusters = new Vector[k][lines*words];

创建一个仅包含 null 指针的数组。

FinalClusters[i][j].add(String. valueOf(Clusters[i][j]));

然后必然会在 null 值上调用 add,因此是 NullPointerException。如果您想要一个存储实际向量的数组,则必须对其进行初始化。现在,它是一个能够存储向量的数组。

【讨论】:

  • 能否请您提供答案的示例代码?我是java的新手。提前致谢
  • 对于每个ij,执行一次Cluster[i][j] = new Vector&lt;String&gt;(); 以初始化数组。
猜你喜欢
  • 2016-02-02
  • 2017-12-19
  • 2020-02-04
  • 2013-02-22
  • 2012-06-30
  • 2023-03-13
  • 2019-11-29
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多