Forum Clubic

Aide programmation en java

Bonjour, je débute en java et surtout avec les classes. J’ai un problème de Null pointer exception. Pouvez vous me dire d’où vient-elle ? Sachant que la classe CaseMur implémente la classe Icase. colonnes est quant à lui initialisé dans le main.

class Plateau {
Icase plateau [][] ;

void tableau() {

for(int i=0; i<colonnes + 2; i++){
this.plateau [ i ] [1]=new CaseMur();
this.plateau [i ][colonnes+2]=new CaseMur();
}
}
Edité le 22/11/2013 à 17:26

Mais la portée des variables est limitée. Je pense que “colonnes” n’est pas visible depuis l’intérieur de Plateau.

Tu as une NullPointException (NPE) parce que tu fais :

this.tableau[i][1] = …;

Sauf que tu ne dois pas avoir initialisé tableau (ex: this.tableau = new Icase[10]);

Si j’initialise colonnes dans plateau, ça ne change rien malheureusement.

Pour initialiser tableau, il faut que j’initialise chaque entité du tableau comme ça ?

for (int i=0; i< colonnes +2; i++){
for (int j=0;j<rangees +2;j++){
this.plateau [ i][j] = new Icase [i ][j];
}
}

Parce que ça ne marche pas non plus !

Pour plus de détails, j’ai :

interface Icase {
}

class CaseMur implements Icase {

}

class Plateau {
Icase plateau [][];
int colonnes = 26;
int rangees = 29;
void tableau() {
for(int i=0; i<colonnes + 2; i++){
this.plateau [ i] [1]=new CaseMur();
this.plateau[ i][colonnes+2]=new CaseMur();
}
Edité le 22/11/2013 à 23:50

Non. Plutôt comme ça : je te mâche le boulot, mais en gros, tu as un tableau de tableau : tu dois initialiser ce dernier, puisque chaque tableau contenu dans ce tableau, d’où une double boucle :

class Plateau {
	Icase plateau [][];
	int colonnes = 26;
	int rangees = 29;
	void tableau() {
		this.plateau = new Icase[rangees][];
		for(int i=0; i< tableau.length; i++){
			this.plateau[i] = new Icase[colonnes];
			for(int j=0; j< colonnes; j++){
				this.plateau[i][j]=new CaseMur();
			}
		}
	}
}

Bon je vais passer pour le noob de service mais c’est comme ça qu’on apprends.
J’y comprends pas grand chose… tableau.length, je ne sais même pas ce que c’est. :confused: D’ailleurs processing ne reconnait pas non plus.
Je comprends pas pourquoi on initialise seulement la Icase [rangees][], et pourquoi this.plateau[i] = new Icase [colonnes].

Jusque là je n’avais jamais utilisé le système de classe mais j’y suis contraint pour faire des programmes un peu plus poussés.
Merci de l’aide !
Edité le 23/11/2013 à 01:16

En fait j’ai trouvé pouruqoi tableau.length n’était pas reconnu, il fallait mettre plateau.length. :slight_smile:

eminar : je m’en rends compte, mais vu que tu sembles apprendre le langage dans le cadre d’un cursus scolaire, il faudrait que tu regardes tes cours car je ne crois pas qu’on te balancerait là dessus sans cette connaissance.

En java, un tableau a toujours un attribut spécial, length, qui permet de donner sa dimension/taille.


int n = 10;
int[] toto = new int[n];
if (n != toto.length) {
	System.out.println("Erreur!");
}

Et la notation Type[][] correspond à un tableau à deux dimensions, que le langage ne va pas initialiser pour toi : c’est à toi de le faire, d’où le parcours élément par élément pour initialiser les sous tableaux.

(et oui, je me dis trompé sur la variable, bref :))

Ben en fait c’est dans le cadre de l’ISN de terminale, chacun va à son rythme sur son projet, et comme cours on a juste les bases du java, mais on ne nous a pas appris les classes, je m’y suis plongé avec le site du zéro.
En tout cas merci de l’aide, je ne savais pas trop où poser des questions de débutant. :slight_smile:

Sachant que les classes sont à Java ce que les casseroles sont à la cuisine, je me demande ce qu’il reste comme bases à enseigner si on ne vous parle pas des classes.

Il y a essentiellement 2 approches de la programmation :

  • programmation fonctionnelle
  • programmation orientée objet

Un cursus classique d’études de la programmation se découpe ainsi :

  • 2-3 heures d’algorithmique pour t’expliquer le principe des boucles,
  • un peu de pratique de la programmation fonctionnelle avec un langage qui ressemble à l’algorithmique (Pascal, Basic, etc.) où tu apprends à manipuler des variables et des procédures/fonctions.
  • un cours littéral sur les bases de la programmation orientée objet où on t’explique les bienfaits des objets, l’héritage et le passage de variables par valeur ou par référence
  • un peu de pratique sur un langage orienté objet (C++ ou Java)

Je sais que quand on est étudiant, c’est pas facile de renoncer à toutes les distractions pour lire un bouquin, mais lire un livre d’informatique c’est extrêmement formateur. Donc je te recommande de chopper un bouquin de Java et de mettre la tête dedans. A défaut d’en acheter un toi-même (parce que 45 ou 50€ l’unité c’est un investissement conséquent), la bibliothèque de ton établissement en aura probablement un à trainer, ou bien un autre étudiant. Tu peux aussi tester des sites de tutoriels comme OpenClassrooms.

Il manque une approche Jaidee, la plus ancienne et importante d’ailleurs : la programmation “impérative”

Mouais, je rejoins Jaidee : c’est la base du langage.

T’as qu’à dire à ton prof que c’est un peu comme apprendre les maths sans savoir compter, je suis sûr qu’il saura apprécier :slight_smile:

Ta méthode est super intéressante acidbao, je vais essayer avec :super:
Concernant nos cours, je suis tout à fait d’accord avec vous, on ne connaissait rien au java, on n’a vu que le principe des boucles, de l’algorythmie très proche de ce qu’on fait sur calculatrice (du BASIC je crois), et je m’en suis rendu compte très vite quand j’ai débuté mon projet. Merci à tous pour vos commentaires, c’est très instructif !

Etant donné que l’un des profs est également prof de maths, je suis sûr qu’il appréciera ! :smiley:

Le column major ou le row major order, c’est bien, mais pour débuter, c’est pas forcément le plus clair :wink: