Problème avec les types de variables en java

Résolu/Fermé
Chabanus Messages postés 978 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 11 novembre 2011 - 20 mars 2009 à 16:36
Chabanus Messages postés 978 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 11 novembre 2011 - 20 mars 2009 à 17:30
Bonsoir,
Je n'arrive pas a enlever l'erreur sur cette ligne:

long binaire[]= new long[(long) Math.pow(2, nb[0].length())];


Avec int y a pas d'erreurs mais quand je mets long y a une erreur, j'ai mis long a cause de cette erreur:

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at ip.main(ip.java:106)

Vous pouvez m'expliquer svp merci
Cordialement

A voir également:

7 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 mars 2009 à 16:50
Salut,
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
Ceci signifie que l'application tente d'allouer un tableau plus grand que la taille du heap.

Que vaut nb[0].length() ?

Cdlt
0
Chabanus Messages postés 978 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 11 novembre 2011 70
20 mars 2009 à 16:53
Merci d'avoir répondu :D

Voici le programme :

import java.util.Scanner;


public class ip {

	public static void main(String[] args){
		char carac = ' ';
		char choix = ' ';
		do {
		System.out.println("Entrez une adresse ip !");
		Scanner sc = new Scanner(System.in);
		String ip = sc.nextLine();
		if(!ip.matches("^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"))
			   System.err.println("Votre addresse ip  est incorrecte");	 
		else {
			String str[]=ip.split("\\.");
		
		
		int categorie = Integer.parseInt(str[0]);
		int H1 = Integer.parseInt(str[1]);
		int H2 = Integer.parseInt(str[2]);
		int H3 = Integer.parseInt(str[3]);
		
		
		  
			
			
			   
		   
		 
		char classe = ' ';
		if(categorie < 127 && categorie > 0) {
			System.out.println("Votre addresse ip  est de Catégorie A");
		classe = 'A';
		}
		else if(categorie < 192 && categorie > 127) {
			System.out.println("Votre addresse ip  est de Catégorie B");
			classe = 'B';
		}	
		else if(categorie < 223 && categorie > 192) {
			System.out.println("Votre addresse ip  est de Catégorie C");
			classe = 'C';
		}
		
		
		sc = new Scanner(System.in);
		System.out.println("En combien de sous-réseaux voulez-vous le décomposer ? !");
		int sr = sc.nextInt();
		int bit=0;
		int tableau[] = {1,2,4,8,16,32,64,128,256,512};
		

			
			
			for(int i=0; i < 9; i++) {
				if(sr == tableau[i] && sr == Math.pow(2,i)) bit = i;
				else if (sr < tableau[i+1] && sr > tableau[i-1]) bit = i;
				
				
				
			}
			System.out.println("Le nombre de bit est "+bit);
		
			
			
			
if(classe == 'A') {

System.out.println("Address du réseau est :"+categorie+".0.0.0");
		
				if(bit < 8) {
					String h1 = "00000000" ;
		            String h2 = "00000000";
		            String h3 = "00000000";
					String nb[] = new String[h1.length()];
					
					nb[0]=h1.substring(0,bit);
					nb[1]=h1.substring(bit,h1.length());
					
					
					long binaire[]= new long[(long) Math.pow(2, nb[0].length())];
					long chaines[]= new long[(long) Math.pow(2, binaire.length)];
					long machine[]= new long[(long) Math.pow(2, nb[1].length())];
					long chainem[]= new long[(long) Math.pow(2, machine.length)];
					
			

			String zero ="0";
			
			
            for(int i=0; i < binaire.length; i++){
            	
            	do{
            	String chaine =Integer.toBinaryString(i);
            	String chaine2 = zero.concat(chaine);
            	chaines[i]=Integer.parseInt(chaine2);
            	
            	}while(chaines[i] != binaire.length);
            	
            	
            		 
            		
            		 String chain1 = Long.toString(chaines[i]);          		 
                     String result = chain1.concat(nb[1]);
                    
                     int decimal = Integer.parseInt(result,2);
                    
                     String résultat = nb[1].replaceAll("0","1");
                     String resultt = chain1.concat(résultat);
                     
                     int decima = Integer.parseInt(resultt,2);
                    
                     System.out.println("Address broadcast du sous réseau :"+i+" est :"+categorie+"."+decimal+".0.0");
                     System.out.println("Le sous réseau "+i+" accepte des address entre :"+categorie+"."+decimal+".0.1 a "+categorie+"."+decima+".255.254" );
            	
            	System.out.println("Address broadcast du sous réseau :"+i+" est :"+categorie+"."+decima+".255.255");
            
            }
			
            
				
			}
				System.out.println("Address broadcast est :"+categorie+".255.255.255");
			}
			
			
			
			
			
		
			
		}
			
		
		System.out.println("Voulez-vous recommencer ? O/N");
		sc = new Scanner(System.in);
		carac= sc.next().charAt(0);
        
		}while(carac == 'O');
		
		   }
	
	

	}



0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 mars 2009 à 17:00
Il faut bien mettre : long binaire[]= new long[(int) Math.pow(2, nb[0].length())];

Mais j'aurais bien aimé savoir la valeur de nb[0].length() qui a provoqué l'exception ?
Lorsque tu lances ton code, utilise : java -Xms32m -Xmx128m (ce sont les valeurs par défaut du heap) et dis moi si t'obtiens encore l'erreur.

Cdlt
0
Utilisateur anonyme
20 mars 2009 à 17:04
Salut,

Tu n'as certainement pas assez de place en memoire virtuelle pour loger ton tableau de long avec le nombre d'éléments obtenus avec [(long) Math.pow(2, nb[0].length())];

Soit il faut revoir la formule, soit augmenter la taille de la mémoire virtuelle.

Qu'y a-t-il dans nb[0] ?

Cordialement,

Dan
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Chabanus Messages postés 978 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 11 novembre 2011 70
20 mars 2009 à 17:16
J'ai déjà essayer de mettre (int) mais a chaque fois cela me mets cette erreur pendant l'exécution :

Entrez une adresse ip !
5.22.22.33
Votre addresse ip  est de Catégorie A
En combien de sous-réseaux voulez-vous le décomposer ? !
23
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at ip.main(ip.java:82)
Le nombre de bit est 5
Address du réseau est :5.0.0.0


Vous avez essayer d'exécuter le programme ?

pour 5 bits c'est 2puissance(2puissance(5)) donc 2 puissance 32 = 4294967296

0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 mars 2009 à 17:24
binaire.length vaut 32.
Tu alloues donc un tableau de 2 puissance 32 (4294967296). Alors que par défaut, la taille maximale du heap de ta VM est de 128m. D'où l'exception.
Tu n'as pas besoin d'allouer autant de place.
Un tableau de 32 ne serait-il pas suffisant ?
0
Chabanus Messages postés 978 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 11 novembre 2011 70
20 mars 2009 à 17:30
Oui je mettais tromper en fait dans le code
long binaire[]= new long[(int) Math.pow(2, nb[0].length())];
long chaines[]= new long[(int) binaire.length];
long machine[]= new long[(int) Math.pow(2, nb[1].length())];
long chainem[]= new long[(int) machine.length];

Merci
0