Rechercher : dans
Par :

Problème avec les types de variables en java

Dernière réponse le 20 mar 2009 à 17:30:12 Chabanus, le 20 mar 2009 à 16:36:27 
 Signaler ce message aux modérateurs

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

Il faut faire partie de la solution et non du problème ;-)
Configuration: Windows Vista
Firefox 3.0.7

Meilleures réponses pour « Problème avec les types de variables en java » dans :
Java - Les types de données Voir Les primitives Java est un langage orienté objet, c'est-à-dire que les éléments manipulés sont des classes, ou plus exactement des objets, c'est-à-dire des instances de classes. Toutefois ces objets contiennent des données possèdant un type (et...
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Les variables en C++ VoirLes variables en C++ 1. Les différents types de variables 1.1 bool 1.2 char 1.3 unsigned short int 1.4 short int 1.5 unsigned long int 1.6 long int 1.7 int (16 bits) 1.8 int (32 bits) 1.9 unsigned int (16 bits) 1.10 unsigned int (32...
Java: les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Java sont typées, c'est-à-dire que les données contenues dans...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...
VBScript - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Il s'agit en fait d'une zone de la mémoire réservée pour le stockage d'une valeur. Les...

1

fiddy, le 20 mar 2009 à 16:50:42

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
Google is your friend

Répondre à fiddy

2

Chabanus, le 20 mar 2009 à 16:53:28

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');
		
		   }
	
	

	}



Il faut faire partie de la solution et non du problème ;-)

Répondre à Chabanus

3

fiddy, le 20 mar 2009 à 17:00:36

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
Google is your friend

Répondre à fiddy

4

danimo, le 20 mar 2009 à 17:04:34

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

Répondre à danimo

5

Chabanus, le 20 mar 2009 à 17:16:39

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

Il faut faire partie de la solution et non du problème ;-)

Répondre à Chabanus

6

fiddy, le 20 mar 2009 à 17:24:27

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 ?
Google is your friend

Répondre à fiddy

7

 Chabanus, le 20 mar 2009 à 17:30:12

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 Il faut faire partie de la solution et non du problème ;-)

Répondre à Chabanus