Problema eccezioni nullpointerexception

di il
4 risposte

Problema eccezioni nullpointerexception

Ciao a tutti,
sto svolgendo un programma sui cluster, pensando di aver fatto bene la classe Data, invece quando lo faccio girare mi esce l'eccezione:

Exception in thread "main" java.lang.NullPointerException
at data.Data.<init>(Data.java:59)
at data.Data.main(Data.java:207)

Perchè? potreste aiutarmi?
grazie in anticipo

il codice è il seguente:

package data;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.text.AttributeSet;

import database.DatabaseConnectionException;
import database.DbAccess;
import database.EmptySetException;
import database.Example;
import database.NoValueException;
import database.QUERY_TYPE;
import database.TableData;
import database.TableSchema;
import database.TableSchema.Column;

public class Data {

	private List<Example> data;
	private int numberOfExamples;// cardinalita' dell'insieme di transazioni (numero di righe in data)
	private List<Attribute> attributeSet;// un vettore degli attributi in ciascuna tupla (schema della tabella di dati)

	public Data(String table) throws EmptyDatasetException, DatabaseConnectionException,SQLException, EmptySetException, NoValueException{

		//data
		data = new ArrayList<Example>();
		DbAccess db = new DbAccess();
		TableData tableData=new TableData(db);
		data = tableData.getDistinctTransazioni(table);

		int index=0;
		db.initConnection();
		
		TableSchema sch;
		
		try{
			sch = new TableSchema(new DbAccess(), table);
			data = tableData.getDistinctTransazioni(table);
			numberOfExamples = data.size();
			attributeSet = new LinkedList<Attribute>();
			

			for (Column c: sch){ //exception...at data.Data.<init>(Data.java:59)
				if (c.isNumber()){
					attributeSet.add(new ContinuousAttribute(c.getColumnName(),index, (Double) tableData.getAggregateColumnValue(table, c, QUERY_TYPE.MIN), (Double) tableData.getAggregateColumnValue(table, c, QUERY_TYPE.MAX)));
					index++;
				} else{ 
					String[] x = (String[]) tableData.getDistinctColumnValues(table, c).toArray(new String[0]);
					attributeSet.add(new DiscreteAttribute(c.getColumnName(),index, x));
					index++;
				}
			}
			
		} catch (SQLException e){
			e.printStackTrace();}
		
		DbAccess.closeConnection();
	}	

	public int getNumberOfExamples(){
		return numberOfExamples;
	}

	public int getNumberOfExplanatoryAttributes(){
		return attributeSet.size();
	}

	int getNumberOfAttributes(){
		return attributeSet.size();
	}


	public Object getAttributeValue(Object array, int attributeIndex){
		return data.get((Integer) array).get(attributeIndex);
	}

	Attribute getAttribute(int index){
		return attributeSet.get(index); 
	}

	public Tuple getItemSet(int index){
		Tuple tuple = new Tuple(attributeSet.size()); 
		for(int i = 0; i < attributeSet.size(); i++){
			if(attributeSet.get(i) instanceof DiscreteAttribute)
			// tuple.add(new DiscreteItem((DiscreteAttribute) attributeSet.get(i), (String)getAttributeValue(index,i)) ,i);
			   tuple.add(new DiscreteItem((DiscreteAttribute)(attributeSet.get(i)),(String)(data.get(index).get(i))), i);
			else
			// tuple.add(new ContinuousItem((ContinuousAttribute) attributeSet.get(i), (double)getAttributeValue(index,i)) ,i);
				tuple.add(new ContinuousItem((ContinuousAttribute)(attributeSet.get(i)), (double)(data.get(index).get(i))), i);
		}
		return tuple;
	}

	public String toString(){
		String container = new String();
		for(Attribute a: attributeSet){
			container = container + a + " ";
		}
		container += "\n";
		for(int i=0; i<getNumberOfExamples(); i++)
		{
			container += i;
			container += ": ";
			// for(int j=0; j<attributeSet.size(); j++){
			for(int j = 0; j<getNumberOfExplanatoryAttributes(); j++){
				container += data.get(i).get(j);
				if(j < getNumberOfExplanatoryAttributes() - 1){
					container+= ",";
				}
			}
			container += "\n";
		}
		return container;
	}

	public static void main(String args[]) throws DatabaseConnectionException, SQLException, EmptySetException, NoValueException{
		Data trainingSet;
		try {
			trainingSet = new Data("playtennis");
			System.out.println(trainingSet); //exception...at data.Data.main(Data.java:207)
		} catch (EmptyDatasetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			
	}
}

4 Risposte

  • Re: Problema eccezioni nullpointerexception

    Aleba ha scritto:


    
    			for (Column c: sch){ //exception...at data.Data.<init>(Data.java:59)
    
    L'unica cosa che si riesce a dedurre (ovviamente con la visione limitata che io posso avere di quello che devi fare) è che sch sicuramente non è null (istanzi TableSchema poco prima) ma se sch è il "target" di un for-each, vuol dire che TableSchema deve implementare Iterable ed avere un iterator().
    Quindi innanzitutto prova a verificare questa tua implementazione.
  • Re: Problema eccezioni nullpointerexception

    Si penso di aver fatto bene pure questo con iterable ecc..
    boh non ho idea
    
    package database;
    
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    
    
    public class TableSchema implements Iterable<database.TableSchema.Column>{
    	DbAccess db;
    	public class Column{
    		private String name;
    		private String type;
    		Column(String name,String type){
    			this.name=name;
    			this.type=type;
    		}
    		public String getColumnName(){
    			return name;
    		}
    		public boolean isNumber(){
    			return type.equals("number");
    		}
    		public String toString(){
    			return name+":"+type;
    		}
    	}
    	List<Column> tableSchema=new ArrayList<Column>();
    
    	public TableSchema(DbAccess db, String tableName) throws SQLException{
    		this.db=db;
    		HashMap<String,String> mapSQL_JAVATypes=new HashMap<String, String>();
    		//http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html
    		mapSQL_JAVATypes.put("CHAR","string");
    		mapSQL_JAVATypes.put("VARCHAR","string");
    		mapSQL_JAVATypes.put("LONGVARCHAR","string");
    		mapSQL_JAVATypes.put("BIT","string");
    		mapSQL_JAVATypes.put("SHORT","number");
    		mapSQL_JAVATypes.put("INT","number");
    		mapSQL_JAVATypes.put("LONG","number");
    		mapSQL_JAVATypes.put("FLOAT","number");
    		mapSQL_JAVATypes.put("DOUBLE","number");
    
    		Connection con=db.getConnection();
    		DatabaseMetaData meta = con.getMetaData();
    		ResultSet res = meta.getColumns(null, null, tableName, null);
    
    		while (res.next()) {
    			if(mapSQL_JAVATypes.containsKey(res.getString("TYPE_NAME")))
    				tableSchema.add(new Column(res.getString("COLUMN_NAME"), mapSQL_JAVATypes.get(res.getString("TYPE_NAME"))));   
    		}
    		res.close();
    	}
    
    
    	public int getNumberOfAttributes(){
    		return tableSchema.size();
    	}
    
    	public Column getColumn(int index){
    		return tableSchema.get(index);
    	}
    
    
    	@Override
    	public Iterator<Column> iterator() {
    		// TODO Auto-generated method stub
    		return null;
    	}		
    }
    
    
  • Re: Problema eccezioni nullpointerexception

    Aleba ha scritto:


    si penso di aver fatto bene pure questo con iterable ecc..
    	@Override
    	public Iterator<Column> iterator() {
    		// TODO Auto-generated method stub
    		return null;
    	}		
    }
    Restituisce un null fisso ...... e ti sembra sensato?? Ma hai capito cosa sono Iterable/Iterator?
    Il iterator() deve restituire un nuovo Iterator per scorrere i Column.

    Ripeto che io posso avere una visione limitata del tuo progetto ma vedo che i column sono in un

    List<Column> tableSchema

    che è inizializzato con un ArrayList (quindi mai null).

    Pertanto perlomeno prendi il iterator del ArrayList e restituisci quello! (praticamente il tuo iterator farebbe solo da "passacarte" per tirar fuori l'iterator della lista).

    Se è appropriato o meno, per la tua architettura ..... non lo posso sapere io su due piedi.
  • Re: Problema eccezioni nullpointerexception

    Ti ringrazio vedo cosa posso fare, purtroppo sono alle prime armi
Devi accedere o registrarti per scrivere nel forum
4 risposte