Cours Java
Cours Java
Master CIBD
2023 — 2024
Table des matières
1 Introduction 3
1.1 JAVA ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 JAVA Vs C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 JRE, JDK et JVM ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.1 JVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.2 JRE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.3 JDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4.1 Mark and Sweep Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1
3.3 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5 Java et JDBC 49
5.1 Connection JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2 Le couple Statement – ResultSet . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.3 Les requêtes préparées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4 La méthode executeUpdate() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.5 Limiter le nombre de connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.6 Gestion des transactions dans JDBC . . . . . . . . . . . . . . . . . . . . . . . . . 53
Java a été développé par Sun Microsystems (aujourd’hui filiale d’Oracle) en 1995. James Gosling
est connu comme le père de Java. Avant Java, son nom était Oak. Comme Oak était déjà une
société enregistrée, James Gosling et son équipe ont changé le nom d’Oak en Java.
Plate-forme : Tout environnement matériel ou logiciel dans lequel un programme s’exécute est
appelé plateforme. Comme Java dispose d’un environnement d’exécution (JRE) et d’une API, il
s’agit d’une plate-forme.
Hello World
public class HelloWorld {
1.1.1 Avantages
— Pas des pointeurs.
3
— Compilateur très strict car toutes les valeurs doivent être initialisées.
— Traitement des exceptions obligatoire.
— Les erreurs à l’exécution sont vérifiées tout comme les limites des tableaux.
— Sécurisé : Désallocation de la mémoire dynamique grâce au Garbage Collector
— Simple : Les points complexe dans c++ par exemple les pointeurs l’hiritage multiple ou
la surcharge des opérateures sont soit inexistants, soit traités implicitement en Java.
— Portable : Le compilateur Java génère du byte-code. Celui-ci constitue les instructions
pour la machine virtuelle JVM).
1.3.1 JVM
La JVM (Java Virtual Machine) est une machine abstraite. Elle est appelée machine virtuelle
parce qu’elle n’existe pas physiquement. Il s’agit d’une spécification qui fournit un environne-
ment d’exécution dans lequel le bytecode Java peut être exécuté. Elle peut également exécuter
les programmes écrits dans d’autres langages et compilés en bytecode Java.
Les JVM sont disponibles pour de nombreuses plates-formes matérielles et logicielles. La JVM, le
JRE et le JDK dépendent de la plate-forme car la configuration de chaque système d’exploitation
est différente. En revanche, Java est indépendant de la plate-forme. Il existe trois notions de JVM :
la spécification, l’implémentation et l’instance.newline
La JVM effectue les tâches principales suivantes :
— Chargement du code
— Vérification du code
— Exécution du code
— Fournit un environnement d’exécution
L’implémentation de la JVM est également diffusée activement par d’autres sociétés que Sun
Micro Systems.
1.3.3 JDK
JDK est l’acronyme de Java Development Kit (kit de développement Java). Le kit de dévelop-
pement Java (JDK) est un environnement de développement logiciel utilisé pour développer des
applications et des applets Java. Il existe physiquement. Il contient le JRE et les outils de déve-
Le JDK est une implémentation de l’une des plates-formes Java suivantes, publiées par Oracle
Corporation :
— Plate-forme Java édition standard
— Plate-forme Java édition entreprise
— Plate-forme Java Micro Edition
Le JDK contient une machine virtuelle Java (JVM) privée et quelques autres ressources telles
qu’un interpréteur/chargeur (java), un compilateur (javac), un archiveur (jar), un générateur de
documentation (Javadoc), etc. pour compléter le développement d’une application Java.
Phase de Sweep (Balayage) : Dans cette phase, le tas est parcouru pour trouver l’espace entre
les objets vivants. Ces espaces sont enregistrés dans la liste des objets libres et sont disponibles
pour l’allocation de nouveaux objets.
Class et Objet
class Account{
int acc_no;
String name;
float amount;
//Method to initialize object
void insert(int a,String n,float amt){
8
acc_no=a;
name=n;
amount=amt;
}
//deposit method
void deposit(float amt){
amount=amount+amt;
System.out.println(amt+" deposited");
}
//withdraw method
void withdraw(float amt){
if(amount<amt){
System.out.println("Insufficient Balance");
}else{
amount=amount-amt;
System.out.println(amt+" withdrawn");
}
}
//method to check the balance of the account
void checkBalance(){System.out.println("Balance is: "+amount);}
//method to display the values of an object
void display(){System.out.println(acc_no+" "+name+" "+amount);}
}
//Creating a test class to deposit and withdraw amount
class TestAccount{
public static void main(String[] args){
Account a1=new Account();
a1.insert(832345,"Ankit",1000);
a1.display();
a1.checkBalance();
a1.deposit(40000);
a1.checkBalance();
a1.withdraw(15000);
a1.checkBalance();
}}
Student(Student s){
id = s.id;
name =s.name;
}
s4.dispaly()
}
}
Variable static
//Java Program to demonstrate the use of static variable
class Student{
int rollno;//instance variable
String name;
static String college ="ITS";//static variable
//constructor
Student(int r, String n){
rollno = r;
name = n;
}
//method to display the values
void display (){System.out.println(rollno+" "+name+" "+college);}
}
//Test class to show the values of objects
public class TestStaticVariable1{
public static void main(String args[]){
Student s1 = new Student(111,"Karan");
Methode static
//Java Program to demonstrate the use of a static method.
class Student{
int rollno;
String name;
static String college = "ITS";
//static method to change the value of static variable
static void change(){
college = "BBDIT";
}
//constructor to initialize the variable
Student(int r, String n){
rollno = r;
name = n;
}
//method to display values
void display(){System.out.println(rollno+" "+name+" "+college);}
}
//Test class to create and display the values of object
public class TestStaticMethod{
public static void main(String args[]){
Student.change();//calling change method
//creating objects
Student s1 = new Student(111,"Karan");
Student s2 = new Student(222,"Aryan");
Student s3 = new Student(333,"Sonoo");
//calling display method
s1.display();
s2.display();
s3.display();
}
}
Block static
class A2{
static{System.out.println("static block is invoked");}
public static void main(String args[]){
System.out.println("Hello main");
2.2 Encapsulation
L’encapsulation en Java est un processus qui consiste à envelopper du code et des données dans
une unité unique, par exemple une capsule contenant plusieurs médicaments.
Nous pouvons créer une classe entièrement encapsulée en Java en rendant tous les membres de
la classe privés. Nous pouvons alors utiliser les méthodes setter et getter pour définir et obtenir
les données qu’elle contient.
2.3 Heritage
L’héritage en Java est un mécanisme par lequel un objet acquiert toutes les propriétés et tous les
comportements d’un objet parent. Il s’agit d’une partie importante des systèmes de programma-
tion orientés objets (OOP).
L’idée derrière l’héritage en Java est que vous pouvez créer de nouvelles classes qui sont construites
à partir de classes existantes. Lorsque vous héritez d’une classe existante, vous pouvez réutiliser
les méthodes et les champs de la classe mère. En outre, vous pouvez ajouter de nouvelles mé-
thodes et de nouveaux champs dans votre classe actuelle.
Heritage simple
class Employee{
float salary=40000;
}
class Programmer extends Employee{
int bonus=10000;
public static void main(String args[]){
2.4 Polymorphism
Le polymorphisme signifie "plusieurs formes" et se produit lorsque nous avons plusieurs classes
qui sont liées les unes aux autres par l’héritage.
Redifinition JAVA
class Vehicle{
//defining a method
void run(){System.out.println("Vehicle is running");}
En d’autres termes, elle ne montre que les éléments essentiels à l’utilisateur et cache les détails
internes, par exemple, l’envoi de SMS où vous tapez le texte et envoyez le message. Vous ne
connaissez pas le traitement interne de la livraison du message.
2.7.2 Interface
En Java, une interface est un modèle de classe. Elle possède des constantes statiques et des mé-
thodes abstraites.
L’interface en Java est un mécanisme permettant de réaliser l’abstraction. Il ne peut y avoir que
des méthodes abstraites dans l’interface Java, pas de corps de méthode. Elle est utilisée pour
réaliser l’abstraction et l’héritage multiple en Java.
interface Showable{
void show();
}
}
}
Nous utilisons les classes internes pour regrouper logiquement les classes et les interfaces en un
seul endroit afin d’en faciliter la lecture et la maintenance.
En outre, elle peut accéder à tous les membres de la classe externe, y compris les méthodes et
les données privées.
1. Sécurité des types : Les objets génériques ne peuvent contenir qu’un seul type d’objet.
2. La fonte de type n’est pas nécessaire : Il n’est pas nécessaire de procéder à un typage.
21
// Object of generic class Area with parameter Type
// as Double
Area<Double> circle = new Area<Double>();
rectangle.add(10);
circle.add(2.5);
System.out.println(rectangle.get());
System.out.println(circle.get());
}
}
private K key;
private V value;
3.2 Collections
La collection en Java est un cadre qui fournit une architecture pour stocker et manipuler un
groupe d’objets.
Les collections Java peuvent réaliser toutes les opérations que vous effectuez sur des données,
telles que la recherche, le tri, l’insertion, la manipulation et la suppression.
Une collection Java est une unité unique d’objets. Le cadre des collections Java fournit de nom-
breuses interfaces (Set, List, Queue, Deque) et classes (ArrayList, Vector, LinkedList, Priority-
Queueue, HashSet, LinkedHashSet, TreeSet).
3.2.1 List
List en Java permet de conserver une collection ordonnée. Elle contient des méthodes basées sur
un index pour insérer, mettre à jour, supprimer et rechercher les éléments. Elle peut également
contenir des éléments en double. Nous pouvons également stocker les éléments nuls dans la liste.
L’interface List se trouve dans le paquetage java.util et hérite de l’interface Collection. C’est une
fabrique de l’interface ListIterator. Grâce à ListIterator, nous pouvons itérer la liste en avant et
en arrière. Les classes d’implémentation de l’interface List sont ArrayList, LinkedList, Stack et
Vector. Les classes ArrayList et LinkedList sont largement utilisées dans la programmation Java.
La classe Vector est obsolète depuis Java 5.
ArrayList
La classe Java ArrayList utilise un tableau dynamique pour stocker les éléments. C’est comme
un tableau, mais il n’y a pas de limite de taille. Nous pouvons ajouter ou supprimer des éléments
à tout moment. Elle est donc beaucoup plus flexible qu’un tableau traditionnel. Il se trouve dans
le paquetage java.util. Il est semblable au vecteur en C++.
ArrayList
import java.util.*;
public class ArrayListExample2{
public static void main(String args[]){
ArrayList<String> list=new ArrayList<String>();//Creating arraylist
list.add("Mango");//Adding object in arraylist
list.add("Apple");
list.add("Banana");
list.add("Grapes");
//Traversing list through Iterator
Iterator itr=list.iterator();//getting the Iterator
while(itr.hasNext()){//check if iterator has the elements
System.out.println(itr.next());//printing the element and move to next
}
for(String fruit:list)
System.out.println(fruit);
System.out.println("Sorting numbers...");
//Creating a list of numbers
List<Integer> list2=new ArrayList<Integer>();
list2.add(21);
list2.add(11);
list2.add(51);
list2.add(1);
//Sorting the list
Collections.sort(list2);
//Traversing list through the for-each loop
for(Integer number:list2)
System.out.println(number);
}
}
}
LinkedList
La classe java LinkedList utilise une liste doublement liée pour stocker les éléments. Elle fournit
une structure de données de liste chaînée. Elle hérite de la classe AbstractList et met en œuvre
les interfaces List et Deque.
LinkedList
import java.util.*;
public class LinkedList1{
public static void main(String args[]){
Iterator<String> itr=al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
ArrayList LinkedList
ArrayList utilise en interne un tableau dyna- LinkedList utilise en interne une liste double-
mique pour stocker les éléments. ment chainée pour stocker les éléments.
La manipulation avec ArrayList est lente car La manipulation avec LinkedList est plus ra-
elle utilise en interne un tableau. Si un élé- pide que ArrayList car elle utilise une liste
ment est retiré du tableau, tous les autres doublement liée, de sorte qu’aucun déplace-
éléments sont déplacés en mémoire. ment de bits n’est nécessaire en mémoire.
La classe LinkedList peut agir à la fois
Une classe ArrayList ne peut agir que comme
comme une liste et une file d’attente, car elle
une liste car elle n’implémente que List.
met en œuvre les interfaces List et Deque.
La classe ArrayList est plus adaptée au sto- La classe LinkedList est plus adaptée à la
ckage et à l’accès aux données. manipulation des données.
L’emplacement en mémoire des éléments L’emplacement des éléments d’une liste liée
d’une liste en tableau est contigu. n’est pas contigu.
Généralement, lors de l’initialisation d’une
ArrayList, une capacité par défaut de 10 est Dans une LinkedList, une liste vide est créée
attribuée à l’ArrayList. Il n’y a pas de cas de lorsqu’une LinkedList est initialisée.
capacité par défaut dans une liste chaînée.
Pour être précis, une ArrayList est un ta- LinkedList implémente la liste doublement
bleau redimensionnable. chaînée de l’interface list.
Stack
La pile est une structure de données linéaire utilisée pour stocker une collection d’objets. Elle est
basée sur le principe du dernier entré-premier sorti (LIFO). La structure de collecte Java fournit
de nombreuses interfaces et classes pour stocker la collection d’objets. L’une d’entre elles est la
classe Stack qui fournit différentes opérations telles que push, pop, search, etc.
Stack
import java.util.Stack;
public class StackEmptyMethodExample
{
public static void main(String[] args)
{
//creating an instance of Stack class
Stack<Integer> stk= new Stack<>();
// checking stack is empty or not
boolean result = stk.empty();
System.out.println("Is the stack empty? " + result);
// pushing elements into stack
stk.push(78);
stk.push(113);
stk.push(90);
stk.push(120);
//prints elements of the stack
System.out.println("Elements in Stack: " + stk);
result = stk.empty();
System.out.println("Is the stack empty? " + result);
}
}
Vector
Vector est comme un tableau dynamique qui peut augmenter ou diminuer sa taille. Contraire-
ment aux tableaux, il est possible de stocker un nombre indéfini d’éléments, car il n’y a pas de
limite de taille. Il fait partie de la structure Java Collection depuis Java 1.2. Il se trouve dans le
paquetage java.util et implémente l’interface List, de sorte que nous pouvons utiliser toutes les
méthodes de l’interface List.
Vector
import java.util.*;
public class VectorExample {
public static void main(String args[]) {
//Create a vector
Vector<String> vec = new Vector<String>();
//Adding elements using add() method of List
vec.add("Tiger");
vec.add("Lion");
vec.add("Dog");
vec.add("Elephant");
3.2.2 Set
Set est une interface disponible dans le paquetage java.util. L’interface set étend l’interface Collec-
tion. Une collection ou une liste non ordonnée dans laquelle les doublons ne sont pas autorisés est
appelée interface Collection. L’interface set est utilisée pour créer un ensemble mathématique.
L’interface set utilise les méthodes de l’interface collection pour éviter l’insertion des mêmes
éléments. SortedSet et NavigableSet sont deux interfaces qui étendent l’implémentation des en-
sembles.
HashSet
La classe Java HashSet est utilisée pour créer une collection qui utilise une table de hachage pour
le stockage. Elle hérite de la classe AbstractSet et implémente l’interface Set.
TreeSet
La classe Java TreeSet met en œuvre l’interface Set qui utilise un arbre pour le stockage. Elle
hérite de la classe AbstractSet et implémente l’interface NavigableSet. Les objets de la classe
TreeSet sont stockés par ordre croissant.
— La classe Java TreeSet ne contient que des éléments uniques, comme HashSet.
— Les temps d’accès et de récupération de la classe Java TreeSet sont très rapides.
— La classe Java TreeSet n’autorise pas les éléments nuls.
— La classe Java TreeSet n’est pas synchronisée.
— La classe Java TreeSet maintient l’ordre croissant.
— La classe Java TreeSet ne contient que des éléments uniques, comme HashSet.
— Les temps d’accès et de récupération de la classe Java TreeSet sont assez rapides.
— La classe Java TreeSet n’autorise pas les éléments nuls.
— La classe Java TreeSet n’est pas synchronisée.
— La classe Java TreeSet maintient l’ordre croissant.
— Le TreeSet ne peut autoriser que les types génériques comparables.
TreeSet
import java.util.*;
class TreeSetExp{
public static void main(String args[]){
//Creating and adding elements
Navigable Tree
import java.util.*;
class TreeSetExp{
public static void main(String args[]){
TreeSet<String> set=new TreeSet<String>();
set.add("A");
set.add("B");
set.add("C");
set.add("D");
set.add("E");
System.out.println("Initial Set: "+set);
3.2.3 Queue
L’interface Queue est disponible dans le package java.util et étend l’interface Collection. Elle est
utilisée pour conserver les éléments qui sont traités selon la méthode FIFO (First In First Out).
Il s’agit d’une liste ordonnée d’objets, dans laquelle l’insertion d’éléments se fait à la fin de la
liste et la suppression d’éléments se fait au début de la liste.
Navigable Tree
import java.util.*;
class TestCollectionExp{
System.out.println("head:"+queue.element());
System.out.println("head:"+queue.peek());
queue.remove();
queue.poll();
}
}
3.2.4 Map
Map contient des valeurs sur la base d’une clé, c’est-à-dire une paire clé-valeur. Chaque paire de
clés et de valeurs est appelée entrée. Une carte contient des clés uniques.
Map est utile si on doit rechercher, mettre à jour ou supprimer des éléments sur la base d’une clé.
Map ne permet pas de dupliquer les clés, mais il est possible d’avoir des valeurs dupliquées.
HashMap et LinkedHashMap autorisent les clés et les valeurs nulles, mais TreeMap n’autorise
aucune clé ou valeur nulle.
Une Map ne peut pas être parcourue, vous devez donc la convertir en Set en utilisant les mé-
thodes keySet() ou entrySet().
La classe HashMap d’ava implémente l’interface Map qui nous permet de stocker des paires de
clés et de valeurs, où les clés doivent être uniques. Si vous essayez d’insérer une clé dupliquée, elle
remplacera l’élément de la clé correspondante. Il est facile d’effectuer des opérations en utilisant
l’index de la clé, comme la mise à jour, la suppression, etc. La classe HashMap se trouve dans le
paquetage java.util.
La classe HashMap en Java est semblable à la classe Hashtable héritée, mais elle n’est pas syn-
chronisée. Elle permet également de stocker les éléments nuls, mais il ne doit y avoir qu’une seule
clé nulle. Depuis Java 5, elle est désignée par HashMap<K,V>, où K représente la clé et V la
valeur. Elle hérite de la classe AbstractMap et implémente l’interface Map.
HashMap
import java.util.*;
public class MapExample {
public static void main(String[] args) {
Map map=new HashMap();
//Adding elements to map
map.put(1,"Amit");
map.put(5,"Rahul");
map.put(2,"Jai");
map.put(6,"Amit");
//Traversing Map
Set set=map.entrySet();//Converting to Set so that we can traverse
Iterator itr=set.iterator();
while(itr.hasNext()){
//Converting to Map.Entry so that we can get key and value separately
Map.Entry entry=(Map.Entry)itr.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}
for(Map.Entry m:map.entrySet()){
System.out.println(m.getKey()+" "+m.
getValue());
}
}
}
TreeMap
La classe Java TreeMap est une implémentation basée sur un arbre rouge-noir. Elle fournit un
moyen efficace de stocker des paires clé-valeur dans un ordre trié.
— Java TreeMap contient des valeurs basées sur la clé. Elle met en œuvre l’interface Navi-
gableMap et étend la classe AbstractMap.
— Java TreeMap ne contient que des éléments uniques.
for(Map.Entry m:map.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
3.2.5 HashTable
La classe ava Hashtable implémente une table de hachage, qui associe des clés à des valeurs. Elle
hérite de la classe Dictionary et implémente l’interface Map.
— Une table de hachage est un tableau de listes. Chaque liste est appelée "bucket". La position
du seau est identifiée en appelant la méthode hashcode(). Une table de hachage contient
des valeurs basées sur la clé.
— La classe Java Hashtable contient des éléments uniques.
— La classe Table de hachage Java n’autorise pas les clés ou les valeurs nulles.
— La classe Hashtable Java est synchronisée.
HashTable
import java.util.*;
class HashtableExp{
public static void main(String args[]){
Hashtable<Integer,String> hm=new Hashtable<Integer,String>();
hm.put(100,"Amit");
hm.put(102,"Ravi");
hm.put(101,"Vijay");
hm.put(103,"Rahul");
for(Map.Entry m:hm.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
L’interface Java Comparable est utilisée pour ordonner les objets de la classe définie par l’utili-
sateur. Cette interface se trouve dans le paquetage java.lang et ne contient qu’une seule méthode
appelée compareTo(Object). Elle ne fournit qu’une seule séquence de tri, c’est-à-dire que vous
pouvez trier les éléments sur la base d’un seul membre de données. Par exemple, il peut s’agir
d’un numéro de rôle, d’un nom, d’un âge ou de toute autre donnée.
public int compareTo(Object obj) : Cette méthode permet de comparer l’objet actuel à l’objet
spécifié. Elle renvoie
— Un nombre entier positif, si l’objet courant est plus grand que l’objet spécifié.
— Un nombre entier négatif, si l’objet courant est inférieur à l’objet spécifié.
— Zéro, si l’objet courant est égal à l’objet spécifié.
Tri des objets (Comparable)
import java.util.*;
}
}
public class TestSortExp {
public static void main(String[] args) {
ArrayList<Student> al=new ArrayList<Student>();
al.add(new Student("Viru"));
al.add(new Student("Saurav"));
al.add(new Student("Mukesh"));
al.add(new Student("Tahir"));
Collections.sort(al);
for (Student s : al) {
System.out.println(s.name);
}
}
}
L’interface Java Comparator est utilisée pour ordonner les objets d’une classe définie par l’utili-
sateur.
Cette interface se trouve dans le paquet java.util et contient deux méthodes : compare(Object
obj1,Object obj2) et equals(Object element).
Elle fournit plusieurs séquences de tri, c’est-à-dire que vous pouvez trier les éléments sur la base
de n’importe quel membre de données, par exemple, rollno, nom, âge ou autre.
class Student{
int rollno;
String name;
int age;
Student(int rollno,String name,int age){
this.rollno=rollno;
this.name=name;
this.age=age;
}
}
import java.util.*;
class AgeComparator implements Comparator{
public int compare(Object o1,Object o2){
Student s1=(Student)o1;
Student s2=(Student)o2;
if(s1.age==s2.age)
return 0;
else if(s1.age>s2.age)
return 1;
else
return -1;
}
}
import java.util.*;
class NameComparator implements Comparator{
public int compare(Object o1,Object o2){
Student s1=(Student)o1;
Student s2=(Student)o2;
return s1.name.compareTo(s2.name);
import java.util.*;
import java.io.*;
class Simple{
public static void main(String args[]){
System.out.println("Sorting by Name");
Collections.sort(al,new NameComparator());
Iterator itr=al.iterator();
while(itr.hasNext()){
Student st=(Student)itr.next();
System.out.println(st.rollno+" "+st.name+" "+st.age);
}
System.out.println("Sorting by age");
Collections.sort(al,new AgeComparator());
Iterator itr2=al.iterator();
while(itr2.hasNext()){
Student st=(Student)itr2.next();
System.out.println(st.rollno+" "+st.name+" "+st.age);
}
}
}
3.3 Exceptions
Une exception est une erreur se produisant dans un programme qui conduit le plus souvent à
l’arrêt de celui-ci. Le fait de gérer les exceptions s’appelle aussi « la capture d’exception ». Le
principe consiste à repérer un morceau de code (par exemple, une division par zéro) qui pourrait
générer une exception, de capturer l’exception correspondante et enfin de la traiter, c’est-à-dire
d’afficher un message personnalisé et de continuer l’exécution.
Les exceptions représentent le mécanisme de gestion des erreurs intégré au langage Java. Il se
compose d’objets représentant les erreurs et d’un ensemble de trois mots clés qui permettent de
détecter et de traiter ces erreurs ( try, catch et finally ) et de les lever ou les propager (throw et
throws).
mots-clés Description
Le mot-clé "try" est utilisé pour spécifier un bloc dans
lequel nous devons placer un code d’exception. Cela si-
try
gnifie que nous ne pouvons pas utiliser le bloc try seul.
Le bloc try doit être suivi par catch ou finally.
Le bloc "catch" est utilisé pour gérer l’exception. Il doit
être précédé du bloc try, ce qui signifie que nous ne pou-
catch
vons pas utiliser le bloc catch seul. Il peut être suivi plus
tard par le bloc finally.
Le bloc "finally" est utilisé pour exécuter le code néces-
finally saire du programme. Il est exécuté qu’une exception soit
gérée ou non.
throw Le mot-clé "throw" est utilisé pour lancer une exception.
Le mot-clé "throws" est utilisé pour déclarer des excep-
tions. Il spécifie qu’une exception peut se produire dans
throws
la méthode. Il ne lance pas d’exception. Il est toujours
utilisé avec la signature de la méthode.
Exception
class TestFinallyBlock {
public static void main(String args[]){
try{
//below code do not throw any exception
int data=25/5;
System.out.println(data);
}
//catch won't be executed
catch(NullPointerException e){
System.out.println(e);
}
//executed regardless of exception occurred or not
finally {
System.out.println("finally block is always executed");
}
Cependant, nous utilisons le multithreading plutôt que le multiprocessing parce que les threads
utilisent une zone de mémoire partagée. Ils n’allouent pas de zone de mémoire séparée, ce qui
permet d’économiser de la mémoire, et le changement de contexte entre les threads prend moins
de temps que le processus.
Le multithreading Java est principalement utilisé dans les jeux, les animations, etc.
Les threads sont indépendants. Si une exception se produit dans un thread, elle n’affecte pas les
autres threads. Ils utilisent une zone de mémoire partagée.
1. Il ne bloque pas l’utilisateur parce que les threads sont indépendants et qu’il est possible
d’effectuer plusieurs opérations en même temps.
2. Il est possible d’effectuer plusieurs opérations en même temps, ce qui permet de gagner
du temps.
3. Les threads étant indépendants, les autres threads ne sont pas affectés si une exception se
produit dans un seul thread.
39
4.2 Java Threads
Il existe deux façons de créer un fil de discussion :
— En étendant la classe Thread
— En implémentant l’interface Runnable.
Thread Class
Thread Class
class Multi extends Thread{
public void run(){
System.out.println("thread is running...");
}
Runnable Interface
Runnable Interface
class Multi3 implements Runnable{
public void run(){
System.out.println("thread is running...");
}
MultiThreads (Class)
public class TestThread extends Thread {
public TestThread(String name){
super(name);
}
public void run(){
for(int i = 0; i < 10; i++)
System.out.println(this.getName());
}
}
MultiThreads (Interface)
int n = 0 ;
while (n++ < 100) {
System.out.println("Je vogue aussi !") ;
try {
Thread.sleep(10) ;
} catch (InterruptedException e) {
// gestion de l'erreur
}
}
}
Le pool de threads Java représente un groupe de threads de travail qui attendent le travail et qui
sont réutilisés plusieurs fois.
Dans le cas d’un pool de threads, un groupe de threads de taille fixe est créé. Un thread du pool
de threads est extrait et se voit attribuer une tâche par le fournisseur de services. Une fois la
tâche terminée, le thread est à nouveau contenu dans le pool de threads.
MultiThreads (Pool)
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class WorkerThread implements Runnable {
private String message;
public WorkerThread(String s){
this.message=s;
}
public void run() {
System.out.println(Thread.currentThread().getName()+" (Start) message = "+
message);
processmessage();//call processmessage method that sleeps the thread for 2
seconds
System.out.println(Thread.currentThread().getName()+" (End)");//prints
thread name
}
private void processmessage() {
try { Thread.sleep(2000); } catch (InterruptedException e) { e.
printStackTrace(); }
}
}
class Bouncing_Balls
extends Frame implements MouseListener {
// initializing co-ordinates
int x = 40, y = 40, t1 = 1, t2 = 1;
int x1 = 200, y1 = 40, t12 = 1, t22 = 1;
int x2 = 100, y2 = 100, t13 = 1, t23 = 1;
Thread th;
// Making constructor
Bouncing_Balls()
{
setSize(700, 800);
setVisible(true);
try {
La synchronisation Java est la meilleure option lorsque nous voulons permettre à un seul thread
d’accéder à la ressource partagée.
4.3.1 Problème
problème d’utilisation du Threads non synchronisés pour acceder à un resource paratgée est la
non consistence des sortie (Access concurrent)
No Synchronization
public synchronized void withdraw (int amount)
{
if (amount <= balance)
{
balance -= amount;
System.out.println ("Compte débité de " + amount + " euros");
}
}
Supposons que User1 a commencé à exécuter la méthode withdraw, elle vient d’évaluer la condi-
tion du if. À ce moment, le scheduler décide d’arrêter User1 et de laisser User2 s’exécuter. Ce
dernier va donc tenter d’appeler la méthode withdraw, mais comme User1 est déjà occupée de-
dans, User2 va passer dans l’état bloqué, et ce jusqu’à ce que User1 ait fini d’exécuter la méthode.
Lock
Tous les objets possèdent un built-in lock. Ce lock est nécessaire à un thread qui souhaite accéder
à une méthode marquée synchronized. Un thread d’exécution va pouvoir prendre le lock d’un
objet, et une fois cela fait, il va pouvoir entrer librement dans toutes les méthodes marquées
synchronized. Une fois que le thread a terminé, il rend le lock de l’objet. Lorsqu’un thread tente
d’exécuter une méthode marquée synchronized, deux cas peuvent se produire. Soit le lock de
l’objet sur lequel la méthode est appelée est encore disponible et dans ce cas, le thread s’empare
du lock et peut exécuter la méthode. Dans l’autre cas, le lock a déjà été pris et le thread est
bloqué, en attente de la libération du lock.
No Synchronization
class Table{
void printTable(int n){//method not synchronized
for(int i=1;i<=5;i++){
System.out.println(n*i);
try{
Thread.sleep(400);
}catch(Exception e){System.out.println(e);}
}
}
}
}
class MyThread2 extends Thread{
Table t;
MyThread2(Table t){
this.t=t;
}
public void run(){
t.printTable(100);
}
}
class TestSynchronization1{
public static void main(String args[]){
Table obj = new Table();//only one object
MyThread1 t1=new MyThread1(obj);
MyThread2 t2=new MyThread2(obj);
t1.start();
t2.start();
}
}
}
}
Le mot-clé synchronized est utilisé pour rendre la classe ou la méthode thread-safe, ce qui signifie
qu’un seul thread peut avoir le verrou de la méthode synchronisée et l’utiliser, les autres threads
doivent attendre que le verrou se libère et que l’un d’entre eux acquière ce verrou.
— Des drivers JDBC de type 1 : JDBC-ODBC, ce type utilise l’interface ODBC pour se
connecter à une base de données (on en a déjà parlé) ; au niveau de la portabilité, on
trouve mieux ;
— Des drivers JDBC de type 2 : ils intègrent les pilotes natifs et les pilotes Java ; en fait,
la partie Java traduit les instructions en natif afin d’être comprises et interprétées par les
pilotes natifs ;
— Des drivers JDBC de type 3 : écrit entièrement en Java, ce type convertit les appels
en un langage totalement indépendant du SGBD ; un serveur intégré traduit ensuite les
instructions dans le langage souhaité par le SGBD ;
— Des drivers JDBC de type 4 : des pilotes convertissant directement les appels JDBC en
instructions compréhensibles par le SGBD ; ce type de drivers est codé et proposé par les
éditeurs de BDD.
La version actuelle de JDBC est basée sur l’interface de niveau d’appel X/Open SQL. Le pa-
quetage java.sql contient des classes et des interfaces pour l’API JDBC. Une liste des interfaces
populaires de l’API JDBC est donnée ci-dessous :
— Driver interface
— Connection interface
— Statement interface
— PreparedStatement interface
— CallableStatement interface
— ResultSet interface
— ResultSetMetaData interface
— DatabaseMetaData interface
— RowSet interface
49
5.1 Connection JDBC
JDBC Connection
public class Connect {
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver"); System.out.println("Driver O.K.");
String url = "jdbc:postgresql://localhost:5432/Ecole"; String user = "postgres";
String passwd = "postgres";
Connection conn = DriverManager.getConnection(url, user, passwd); System.out.
println("Connexion effective !");
} catch (Exception e) {
e.printStackTrace();
}
}}
L’objet Statement permet d’exécuter des instructions SQL, il interroge la base de données et
retourne les résultats. Ensuite, ces résultats sont stockés dans l’objet ResultSet, grâce auquel on
peut parcourir les lignes de résultats et les afficher.
JDBC Statment et ResultSet
public class Connect {
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost:5432/Ecole"; String user = "postgres";
String passwd = "postgres";
Connection conn = DriverManager.getConnection(url, user, passwd);
//Création d'un objet Statement
Statement state = conn.createStatement();
//L'objet ResultSet contient le résultat de la requête SQL ResultSet result = state
.executeQuery("SELECT * FROM classe"); //On récupère les MetaData
ResultSetMetaData resultMeta = result.getMetaData();
JDBC Singleton
public class SdzConnection{
//URL de connexion
private String url = "jdbc:postgresql://localhost:5432/Ecole"; //Nom du user
private String user = "postgres";
//Mot de passe de l'utilisateur
private String passwd = "postgres";
//Objet Connection
private static Connection connect;
Les propriétés ACID décrivent bien la gestion des transactions. ACID signifie Atomicité, Cohé-
rence, Isolation et Durabilité.
L’atomicité signifie que toutes les transactions sont réussies ou qu’aucune ne l’est.
La cohérence permet d’amener la base de données d’un état cohérent à un autre état cohérent.
La durabilité signifie qu’une fois qu’une transaction a été validée, elle le restera, même en cas
d’erreurs, de coupure de courant, etc.
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","
system","oracle");
con.setAutoCommit(false);
System.out.println("enter id");
String s1=br.readLine();
int id=Integer.parseInt(s1);
System.out.println("enter name");
String name=br.readLine();
System.out.println("enter salary");
String s3=br.readLine();
int salary=Integer.parseInt(s3);
ps.setInt(1,id);
ps.setString(2,name);
ps.setInt(3,salary);
ps.executeUpdate();
System.out.println("commit/rollback");
String answer=br.readLine();
if(answer.equals("commit")){
con.commit();
}
if(answer.equals("rollback")){
con.rollback();
}
}
con.commit();
System.out.println("record successfully saved");
}}
Java 8 utilise le mot clef default pour définir une implémentation par défaut au sein d’une in-
terface. C’est utile pour les développeurs d’API, c’était même indispensable pour la plupart des
nouveautés du langage sinon comment enrichir les interfaces comme java.util.Collection.
// default method
default void show()
{
System.out.println("Default Method Executed");
}
}
56
// default method executed
d.show();
}
}
Les méthodes par défaut ont été introduites pour assurer une compatibilité ascendante afin que
les interfaces existantes puissent utiliser les expressions lambda sans implémenter les méthodes
dans la classe d’implémentation. Les méthodes par défaut sont également appelées méthodes de
défense ou méthodes d’extension virtuelle.
// static method
static void show()
{
System.out.println("Static Method Executed");
}
}
interface TestInterface2
{
// Default method
default void show()
{
System.out.println("Default TestInterface2");
}
}
Lambda Expression
// A Java program to demonstrate simple lambda expressions
import java.util.ArrayList;
class Test {
public static void main(String args[])
{
// Creating an ArrayList with elements
// {1, 2, 3, 4}
ArrayList<Integer> arrL = new ArrayList<Integer>();
arrL.add(1);
arrL.add(2);
arrL.add(3);
arrL.add(4);
Lambda Expression
// Java program to demonstrate working of lambda expressions
public class Test {
// operation is implemented using lambda expressions
interface FuncInter1 {
int operation(int a, int b);
}
Java Stream
// Java program to demonstrate
// the use of stream in java
import java.util.*;
import java.util.stream.*;
class Demo {
public static void main(String args[])
{
// create a list of integers
List<Integer> number = Arrays.asList(2, 3, 4, 5);
System.out.println(show);
System.out.println(squareSet);
System.out.println(even);
}
}