Comment utiliser Java comme un langage impératif ?
Pas de notion d’objet
Être capable de développer une application faisant appel à une série d’instructions évaluées les unes après les autres
Être capable d’utiliser des fonctions issues d’une bibliothèque externe
Être capable d’écrire et d’utiliser ses propres fonctions
Les impératifs dans un fichier Java
Création de fonctions
Introduction aux différents types en Java
Introduction aux opérations de base
Introduction aux instructions de flow control
Introduction à la fonction main
Fichier App.java:
import java.lang.System;
public class App {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
public class XXX
/ nom de fichierpublic static void main
: création d’une fonction main
public static
: élément à insérer avant la déclaration d’une fonction
void
: type de retour
main
: nom de la fonction
String[] args
: type et nom des arguments
Corps de la fonction entre les accolades
Une fonction ne peut retourner qu’un seul objet
ou rien (type void
)
System.out.println
: instruction pour afficher quelque chose dans le terminal
"Hello, World!"
: argument passé à la fonction println
(ici une chaîne de caractères)
Instruction ; // Ceci est un commentaire
/*
Ceci est un bloc de commentaires
Qui peut s'étendre sur plusieurs lignes
*/
Instruction_suivante ;
Se termine toujours par un point-virgule
Les commentaires sont avec les symboles //
(commentaire simple) ou /* ...*/
(bloc)
Java est un langage fortement typé.
8 types de base :
byte, short, int, long
float, double
boolean
char
byte : entier signé sur 8 bits [ − 128, 127]
short : entier signé sur 16 bits [ − 32768, 32767]
int : entier signé sur 32 bits [ − 231, 231 − 1]
long : entier signé sur 64 bits [ − 263, 263 − 1]
Par défaut des int (ex. : 1, 2, 3,…)
byte, short, int et long peuvent être initialisés avec un entier littéral
Les long avec des valeurs supérieures à 231 peuvent être initialisés avec des littéraux finissant par “L” (ex. : 1000000000L)
Possibilité d’ajouter des underscores "_" pour la lisibilité (ex. : 1_100)
float : Nombres flottants simple précision codés sur 32 bits
double : Nombres flottants double précision codés sur 64 bits.
Exemples :
boolean : ne peut valoir que true or false
À utiliser dans les tests logiques
“Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn’t something that’s precisely defined.”
char : caractère unicode codé sur 16 bits
Va de \u0000 à \uFFFF
Exemple :
Peut-on utiliser les caractères "
et '
?
Les échapper avec un backslash \
Un caractère utile : le retour à la ligne \n
Les tableaux (array) permettent de stocker un nombre connu d’objets en mémoire.
Ils peuvent être de n’importe quel type.
int[]
double[]
char[]
…
Déclaration :
Initialisation avec le mot-clé new
Accès : avec l’opérateur []
Une autre façon d’initialiser un tableau lorsqu’on connaît les éléments :
Les tableaux peuvent être modifiés directement :
Comment connaître la taille d’un tableau ?
Rappel : le type d’un tableau d’entier est int[] : la taille n’est pas mentionnée.
.length après le nom du tableau
Il est possible de créer des tableaux sur plusieurs dimensions. Il s’agit alors d’un tableau de tableau.
La classe String permet de manipuler les chaînes de caractère.
Deux opérations utiles…
length() : donne la longueur de la chaîne
Opérateur + : permet de concaténer deux chaînes
Déclaration : fournir le nom du type et de la variable
Affectation : avec le signe =
Combinaison déclaration/affectation :
Opérations mathématiques de base + , - , * , / (avec les priorités mathématiques habituelles)
Reste de la division entière %
Test d’égalité == ou de non égalité !=
Tests comparatifs <=, <, >= et >
Opération de négation !
Le ET et OU logique : && et ||
Si la condition vaut true, alors on retourne val1, sinon on retourne val2.
Exemple
Écrire en une instruction une fonction qui prend en entrée une note entre 0 et 20 et qui renvoie la lettre associée (char) en fonction de la répartition suivante :
[20 , 15] : A ]15 , 10] : B
]10 , 5] : C ]5, 0] : D
Il s’agit ici de définir l’ordre d’exécution des instructions.
Par défaut, au sein d’une méthode, les instructions sont exécutées les une après les autres.
Le mot-clé return permet d’interrompre définitivement l’exécution d’une méthode et de retourner la valeur précisée après le mot clé.
Ce mot clé est obligatoire pour les fonctions qui retournent autre chose que void
Si x = 4, on aura instruct1 → instruct2→ instruct4
Si x ≠ 4, on aura instruct1 → instruct3 → instruct4
On peut également avoir if sans else
Si x = 4, on aura instruct1 → instruct2
Si x ≠ 4, on aura instruct2
Réaliser des opérations un nombre défini de fois
Parcourir un tableau / une liste
Une fois la condition de fin réalisée, instructionsSuivante est exécutée
for comme en Python (foreach)
Attention : le contenu de la boucle ne doit pas modifier le tableau
Réaliser des opérations tant qu’une condition est réalisée
Si expressionTest vaut false lors de sa première évaluation, on passe à instructionsSuivantes
while(true) → boucle infinie
Une fois que expressionTest est faux, instructionsSuivantes est exécutée
Similaire à while
Mais garantit que le bloc instructions est exécuté au moins une fois.
Une fois que expressionTest est faux, instructionsSuivantes est exécutée
Permet de sortir d’un bloc d’instruction for, while ou do while prématurément
Permet de “sauter” l’itération courante d’un bloc d’instruction for, while ou do while.
Permet de placer le contrôle de flux à un endroit spécifique en fonction de la valeur d’une variable parmi un ensemble donné :
Dès qu’une des conditions est vérifiée, le code exécute toutes les instructions suivantes
Si variable = valeur2 alors instr3 → instr4 → instr5 → instr6
Penser à l’instruction break et à l’instruction default
Il ne vérifie pas la cohérence des valeurs
Le but des exceptions est de “signaler” les problèmes
Représente un cas particulier de contrôle de flux.
Résultat dans le terminal :
Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:3)
Je réalise une division par zéro avec des entiers
Il s’agit d’une erreur arithmétique détectée par la fonction qui encode la division des entiers
Cette fonction lève une exception et la transmet à la méthode appelante (ici main)
main reçoit cette exception. Par défaut, l’exécution de main s’arrête et le texte descriptif de l’exception s’affiche dans la console
C’est une mesure de protection pour éviter des comportements non prévus
Lorsqu’une exception est levée, la méthode appelante la reçoit. Si elle n’est pas traitée, l’exécution de la méthode est interrompue et l’exception remontre à la méthode appelante
Si l’exception n’est toujours pas traitée par la méthode principale (main), alors le programme s’arrête et le contenu de la pile d’exécution est affichée (on voit toutes les fonctions appelées)
J’attrappe l’exception e (de type Exception)
Je peux alors réaliser un traitement spécifique adapté à la situation
Attraper une exception spécifique
Traiter plusieurs exceptions
Par défaut, les exceptions sont vérifiées par le compilateur
Certaines exception étant très communes, les déclarer via throws est superflu. C’est le cas de ArithmeticException
Pour d’autres exceptions (ex. IOException), il faut les déclarer via throws sous peine d’erreur de compilation.
Utiliser le mot clé throw
Il est possible “d’exécuter” un fichier .java si et seulement si celui-ci contient une fonction main dont la signature est la suivante :
public static : nécessaire pour les fonctions
void : la fonction ne retourne rien.
String[] args : l’argument de main est un tableau de String.
Identification des arguments lors d’une commande textuelle dans un terminal
$ ls -l *.java (unix)
$ dir *.java (windows)
Liste tous les fichiers avec l’extension java et les présente sous forme de liste
$ ls -l *.java
Exemple avec la ligne de commande unix
ls : nom de la commande
-l : premier argument
*.java : deuxième argument
Du point de vue de la fonction main
:
args[0] = "-l"
args[1] = "*.java"
Se mettre dans le répertoire contenant le fichier .class (ex. MainClass.class) issu de la compilation à l’aide de la commande cd.
$ java MainClass argument1 argument2....
Comment traiter les exceptions ?
Il faut essayer !