Partage
  • Partager sur Facebook
  • Partager sur Twitter

ArrayStoreException

On découvre de nouvelles erreurs tous les jours !

Sujet résolu
    3 mars 2015 à 1:11:44

    Bonjour,

    Je suis en train d'implémenter (de manière assez sale) quelques tables de hachages. Le tout en utilisant des classes abstraites.

    Petit problème, je suis tombé sur une exception bizarre, je m'explique.

    Il y a d'abord une classe abstraite qui va représenter les éléments de la table de hachage, j'ai nommé "Abstract Entry"

    public abstract class AbstractEntry {
    	protected String value;
    	protected String key;
    	
    	public AbstractEntry (String value, String key)
    	{
    		this.value = value;
    		this.key = key;
    	}
    }

    à Partir de cette classe abstraite, on l'implémente grâce à la classe "Simple Entry"

    public class SimpleEntry extends AbstractEntry {
    
    	public SimpleEntry(String value, String key) {
    		super(value, key);
    		// TODO Auto-generated constructor stub
    	}
    
    }
    

    Mais aussi, on va pouvoir implémenter une classe abstraite concernant la table de hachage !

    abstract class AbstractHashMap {
    	protected AbstractEntry[] hashTable = new ChainingEntry[30];
    	
    	protected abstract String hashFunction(String k);
    	public abstract void put(String k, String v) throws Exception;
    	public abstract String get(String k) throws Exception;
    	
    }

    Ce qui va permettre d'implémenter une table de hachage de type "OpenAddressing" (où, plus communément appelé "Si la case est déjà prise, alors essaie de mettre l'élement en question dans la case suivante de ton vecteur)

    public class OpenAdressingHashMap extends AbstractHashMap {
    
    	
    	//CONSTRUCTOR
    	public OpenAdressingHashMap(){
    		super();
    	}
    	
    	//AWESOME HASH FUNCTION !
    	@Override
    	protected String hashFunction(String k) {
    		// TODO Auto-generated method stub
    		int result = Integer.parseInt(k) % hashTable.length;
    		return Integer.toString(result);
    	}
    	
    	//PUT METHOD
    	@Override
    	public void put(String k, String v) throws Exception {
    		// TODO Auto-generated method stub
    		String hashKey = hashFunction(k);
    		SimpleEntry e = new SimpleEntry(k,v);
    		int i = 0;
    		while (i<hashTable.length && hashTable[(Integer.parseInt(hashKey)+ i)%hashTable.length] != null ) {
    			i++;
    		}
    		if (i == hashTable.length) {
    			throw new Exception("HASTABLE IS FULL, PUT FUNCTION CANNOT WORKS");
    		} else {
    			hashTable[(Integer.parseInt(hashKey)+i)%hashTable.length] = e;
    		}	
    	}
    
    	//GET METHOD
    	@Override
    	public String get(String k) throws Exception {
    		String key = hashFunction(k);
    		return hashTable[Integer.parseInt(key)].value;
    	}
    
    }
    


    Et c'est dans la méthode put que se trouve le problème à la ligne :

    hashTable[(Integer.parseInt(hashKey)+i)%hashTable.length] = e;

    Lorsque j'essaie cette méthode dans un test unitaire:

    public void testOpenAdressingHashMap() throws Exception{
    		OpenAdressingHashMap oah = new OpenAdressingHashMap();
    		
    		oah.put("1", "alpha");
    		//oah.put("2", "beta");
    		//assertEquals(oah.get("1"), "alpha");
    		
    	}
    }

    Je me retrouve avec une ArrayStoreException.

    Après moulte recherches, il semblerait que ce soit un problème de typage car j'essaie d'insérer un type "SimpleEntry" dans un tableau de "AbstractEntry". Cependant, le type "SimpleEntry" est bien une implémentation de la classe "AbstractEntry".

    Voilà, je sais très bien qu'il existe déjà des tableaux de hachages tout prêt et que mon code peut paraître affreux. Mais j'avais envie de tester le pouvoir de l'abstrait.

    Merci à ceux qui m'aideront :D

    • Partager sur Facebook
    • Partager sur Twitter
      3 mars 2015 à 9:12:38

      Bonjour peux-tu afficher une partie de l'erreur qui s'affiche afin que nous puissions mieux cibler le problème.

      Merci

      • Partager sur Facebook
      • Partager sur Twitter
      A toi de jouer !
        5 mars 2015 à 23:22:43

        java.lang.ArrayStoreException: SimpleEntry
        	at OpenAdressingHashMap.put(OpenAdressingHashMap.java:31)
        	at Test.testOpenAdressingHashMap(Test.java:19)
        	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.lang.reflect.Method.invoke(Method.java:606)
        	at junit.framework.TestCase.runTest(TestCase.java:164)
        	at junit.framework.TestCase.runBare(TestCase.java:130)
        	at junit.framework.TestResult$1.protect(TestResult.java:106)
        	at junit.framework.TestResult.runProtected(TestResult.java:124)
        	at junit.framework.TestResult.run(TestResult.java:109)
        	at junit.framework.TestCase.run(TestCase.java:120)
        	at junit.framework.TestSuite.runTest(TestSuite.java:230)
        	at junit.framework.TestSuite.run(TestSuite.java:225)
        	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
        	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
        
        • Partager sur Facebook
        • Partager sur Twitter
          6 mars 2015 à 10:28:53

          Tu as déclaré un tableau de ChainingEntity, pas de SimpleEntity (dans ta classe abstraite).
          • Partager sur Facebook
          • Partager sur Twitter
            10 mars 2015 à 14:01:35

            Ah merci je n'avais pas vu ! Il semblerait que ce soit ça, ça fonctionne !
            • Partager sur Facebook
            • Partager sur Twitter

            ArrayStoreException

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown