Publié par l'affiche originale : 2008-06-17 15:26:20
lJBS
1. Citez 10 avantages du langage JAVA
a : Gratuit, open source, multiplateforme (indépendance de la plateforme), facile à utiliser, fonctions complètes, orienté objet, robuste, multithread, neutre en termes de structure, plateforme mature pour les applications d'entreprise, applications sans fil
2. Répertoriez 10 termes de programmation orientée objet en JAVA
a : package, classe, interface, objet, attribut, méthode, constructeur, héritage, encapsulation, polymorphisme, abstraction, paradigme
3. Répertoriez 6 packages couramment utilisés en JAVA
Java.lang;java.util;java.io;java.sql;java.awt;java.net;java.applet;javax.swing
4. Quelles sont les fonctions et caractéristiques des identifiants en JAVA ? Fonction : Les identifiants sont utilisés pour nommer des variables, des classes et des méthodes. Caractéristiques : En plus de commencer par des lettres, des traits de soulignement « _ » et « $ », ils peuvent être suivis de. lettres, caractères ou chiffres de soulignement "_" et "$"
Java est sensible à la casse et les identifiants ne font pas exception
5.Quelles sont les caractéristiques des mots-clés en JAVA ? Listez au moins 20 mots-clés ?
Certains mots en Java qui ont une signification spécifique et sont utilisés à des fins spéciales sont appelés mots-clés.
Tous les mots-clés Java sont en minuscules, TURE, FALSE, NULL, etc. ne sont pas des mots-clés Java ;
goto et const, bien que jamais utilisés, sont réservés comme mots-clés Java ;
Il y a un total de 51 mots-clés Java dans •
résumé assert booléen pause octet continuer
cas catch char classe const double
par défaut, l'extension s'étend sinon le flotteur final
pour aller trop longtemps si implémente l'importation
nouvelle interface native d'instance nulle d'int
paquet privé protégé public retour court
Le super commutateur statique strictfp a synchronisé ceci
pendant que le vide lance un essai transitoire
volatil
6.Comment les types de données sont-ils classés en JAVA ?
Peut être divisé en types de données simples et types de données de référence :
Types de données simples : type numérique (byte, short, int, long, float double), type de caractère (char), type booléen (boolean) ;
Types de données de référence : classe, interface, tableau.
7. Classification et exemples d'opérateurs en JAVA
• Séparateur :,,;,[],()
• Opérateurs arithmétiques : +, ―, *, /, %, ++, ――
• Opérateurs relationnels : >, <, >=, <=, ==, !=
• Opérateurs logiques booléens : !, &, |, ^, &&, ||
• Opérateurs de bits : &, |, ^, ~, >>, < <, >>>
• Opérateur d'affectation : = Opérateur d'affectation étendue : +=, ―=, *=, /=
• Opérateur de concaténation de chaînes : +
• Opérateur de forme : ()
8.La fonction et l'utilisation des mots-clés super et this
• Utilisez super dans une classe Java pour faire référence aux composants de la classe parent.
– Peut être utilisé pour accéder aux attributs super définis dans la classe parent
– Peut être utilisé pour appeler la méthode membre super définie dans la classe parent
– Peut être utilisé pour appeler le constructeur de super classe super dans le constructeur de sous-classe
– La traçabilité ne se limite pas au super classe parent direct
Afin de résoudre le problème de conflit de nom et d'incertitude des variables, le mot-clé « this » est introduit pour représenter l'objet actuel de la méthode dans laquelle il se trouve. Java
– Le constructeur fait référence au nouvel objet créé par le constructeur
– La méthode fait référence à l’objet qui appelle la méthode
• Utilisation des mots-clés ceci
– Référencer les variables d’instance et les méthodes de la classe dans la méthode ou le constructeur de la classe elle-même
– Passer l’objet actuel en paramètre à d’autres méthodes ou constructeurs
– Utilisé pour appeler d’autres constructeurs surchargés
9. Qu'est-ce qu'une expression en JAVA ? Qu'est-ce que ça fait ?
• Une expression est une combinaison d’opérateurs et d’opérandes et constitue un élément clé de tout langage de programmation.
« Les expressions permettent aux programmeurs d'effectuer des calculs mathématiques, des comparaisons de valeurs, des opérations logiques et des manipulations d'objets en Java.
• Quelques exemples d’expressions :
–X
–X+10
– Y=x+10
–Arr[10]
– étudiant.geName()
10. Créez un tableau répertoriant tous les modificateurs en JAVA et leur champ d'application (peuvent-ils modifier les constructeurs, les propriétés, les blocs libres, etc.)
classe attribut méthode constructeur bloc libre classe interne
public AAAA OUI
protégé AAA O O
(Par défaut) AAAAAA
privé AAA O O
finale AAA O O
résumé O O O
statique O AA
11. Écrivez une méthode pour imprimer la table de multiplication à l'aide d'une boucle for
/**
*Une boucle for imprime la table de multiplication
*/
publicvoid nineNineMultiTable()
{
pour (int je = 1,j = 1; j <= 9; i++) {
System.out.print(i+"*"+j+"="+i*j+" ");
si(i==j)
{
je = 0 ;
j++;
System.out.println();
}
}
}
12. Étant donné un objet java.util.Date, comment le convertir en chaîne au format "2007-3-22 20:23:22"
/**
*Convertir une date en chaîne dans un format fixe
*@paramdate
*@returnstr
*/
chaîne publique dateToStr (java.util.Date date)
{
SimpleDateFormat sdf = new SimpleDateFormat("aaaa-MM-jj HH:mm:ss");
Chaîne str = sdf.format(date);
return str;
}
13. Écrivez une méthode permettant de déterminer si un nombre entier est premier.
/**
* Déterminer si un entier est premier
*@paramn
*@returnboolean
*/
publicboolean isPrimes(int n)
{
pour (int i = 2; i <= Math.sqrt(n); i++) {
si(n%i==0)
{
returnfalse ;
}
}
returntrue ;
}
14. Écrivez une méthode qui saisit n'importe quel entier et renvoie sa factorielle
/**
*Obtenez la factorielle de n'importe quel entier
*@paramn
*@retour !
*/
publicint factoriel(int n)
{
//récursion
si(n==1)
{
renvoyer 1 ;
}
return n*factorial(n-1);
//non récursif
//int multi = 1;
// pour (int i = 2; i <= n; i++) {
// multi*=i;
// }
// renvoie multi ;
}
15. Écrivez une méthode qui utilise la recherche binaire pour déterminer si un entier existe dans un tableau d'entiers. S'il existe, renvoyez sa position d'index dans le tableau. S'il n'existe pas, renvoyez -1.
/**
*Recherche binaire de la position d'un entier spécifique dans le tableau d'entiers (récursif)
*@paramdataset
*@paramdata
*@parambeginIndex
*@paramendIndex
*@indexderetour
*/
publicint binaireSearch (ensemble de données int [], données int, int startIndex, int endIndex)
{
int midIndex = (beginIndex+endIndex)/2;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex)return -1;
si (données <ensemble de données [midIndex])
{
return binaireSearch(dataset,data,beginIndex,midIndex-1);
}elseif(données>ensemble de données[midIndex])
{
return binaireSearch(dataset,data,midIndex+1,endIndex);
}autre
{
retourner midIndex ;
}
}
/**
*Recherche binaire de la position d'un entier spécifique dans le tableau d'entiers (non récursif)
*@paramdataset
*@paramdata
*@indexderetour
*/
publicint binaireSearch (ensemble de données int [], données int)
{
int débutIndex = 0;
int endIndex = dataset.length - 1;
int midIndex = -1 ;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex)return -1;
while(beginIndex <= endIndex) {
midIndex = (beginIndex+endIndex)/2;
si (données <ensemble de données [midIndex]) {
endIndex = midIndex-1 ;
} elseif(données>ensemble de données[midIndex]) {
débutIndex = midIndex+1 ;
}autre
{
retourner midIndex ;
}
}
renvoie -1 ;
}
16. Un exemple d'éleveur donnant de la nourriture aux animaux reflète la pensée orientée objet en JAVA et l'utilité des interfaces (classes abstraites)
paquet com.softeem.demo ;
/**
*@auteurleno
*Interface avec les animaux
*/
interface animaux
{
publicvoid manger(Nourriture alimentaire);
}
/**
*@auteurleno
*un type d'animal : chat
*/
classe Chat met en œuvre Animal
{
publicvoid manger(Nourriture alimentaire)
{
System.out.println("Le chaton mange"+food.getName());
}
}
/**
*@auteurleno
*un type d'animal : chien
*/
classe Chien met en œuvre Animal
{
publicvoid manger(Nourriture alimentaire)
{
System.out.println("Chiot à mâcher"+food.getName());
}
}
/**
*@auteurleno
*Cours de résumé alimentaire
*/
abstraitclasseAlimentation
{
Nom de chaîne protégé ;
chaîne publique getName() {
nom de retour ;
}
publicvoid setName (nom de la chaîne) {
this.name = nom ;
}
}
/**
*@auteurleno
*Un groupe alimentaire : le poisson
*/
classe Le poisson étend la nourriture
{
poisson public (nom de la chaîne) {
this.name = nom ;
}
}
/**
*@auteurleno
*Un groupe alimentaire : les os
*/
classe L'os étend la nourriture
{
os public (nom de la chaîne) {
this.name = nom ;
}
}
/**
*@auteurleno
*Catégorie Éleveur
*
*/
chargeur de classe
{
/**
*L'éleveur donne un certain type de nourriture à un certain type d'animal.
*@paramanimal
*@paramfood
*/
alimentation publique (Animal, Alimentation alimentaire)
{
animal.manger(nourriture);
}
}
/**
*@auteurleno
*Tester les éleveurs nourrissant les animaux avec de la nourriture
*/
publicclass TestFeeder {
publicstaticvoid main(String[] arguments) {
Feeder feeder=nouveau Feeder();
Animal animal=nouveau Chien();
Nourriture food=new Bone("os de viande");
feeder.feed(animal,food); //Donner de la viande et des os au chien
animal=nouveau chat();
food=nouveau poisson("poisson");
feeder.feed(animal,food); //Nourrir le poisson au chat
}
}
18. Créez une classe monomode et chargez le fichier de propriétés une seule fois
paquet com.softeem.demo ;
importer java.io.FileInputStream ;
importer java.io.FileNotFoundException ;
importer java.io.IOException ;
importer java.io.InputStream ;
importer java.util.Properties ;
/**
*@auteurleno
*Mode unique, garantissant que le fichier de propriétés de configuration n'est chargé qu'une seule fois pendant toute l'application
*/
classe publique Singleton {
instance Singleton statique privée ;
privatestaticfinal String CONFIG_FILE_PATH = "E:\config.properties";
Configuration des propriétés privées ;
Singleton privé()
{
config = nouvelles propriétés ();
InputStream est ;
essayer {
est = nouveau FileInputStream(CONFIG_FILE_PATH);
config.load(est);
est.close();
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
publicstatic Singleton getInstance()
{
si (instance == nul)
{
instance = nouveau Singleton();
}
instance de retour ;
}
Propriétés publiques getConfig() {
returnconfig;
}
publicvoid setConfig (configuration des propriétés) {
this.config = config;
}
}
lJ2SE
19. Copiez un répertoire (fichier) dans le chemin spécifié
/**
* Copiez un répertoire ou un fichier dans le chemin spécifié
*@paramsource
*@paramtarget
*/
copie publiquevoid (source du fichier, cible du fichier)
{
Fichier tarpath = new File(target,source.getName());
si(source.isDirectory())
{
tarpath.mkdir();
Fichier[] dir = source.listFiles();
pour (int i = 0; i < dir.length; i++) {
copier(dir[i],tarpath);
}
}autre
{
essayer {
InputStream est = new FileInputStream(source);
OutputStream os = nouveau FileOutputStream(tarpath);
octet[] buf = nouveloctet[1024];
int len = 0;
while((len = is.read(buf))!=-1)
{
os.write(buf,0,len);
}
est.close();
os.close();
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
20. Exemple de problème de retrait bancaire en utilisant le multi-threading en JAVA
packagecom.softeem.demo ;
/**
*@auteurleno
*Type de compte
*Il y a un solde par défaut et vous pouvez retirer de l'argent
*/
compte de classe {
solde flottant privé = 1000 ;
publicfloat getBalance() {
solde de retour ;
}
publicvoid setBalance (solde flottant) {
this.balance = solde ;
}
/**
*Les méthodes de retrait doivent être synchronisées
*@parammoney
*/
retraits publics synchronisés (argent flottant)
{
si (solde> = argent)
{
System.out.println("Pris"+argent+"Yuan!");
essayer {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
solde-=argent;
}
autre
{
System.out.println("Désolé, solde insuffisant !");
}
}
}
/**
*@auteurleno
*carte bancaire
*/
la classe TestAccount1 étend le fil {
compte de compte privé ;
public TestAccount1 (compte compte) {
this.account = compte ;
}
@Outrepasser
publicvoid run() {
compte.retraits (800);
System.out.println("Le solde est :"+account.getBalance()+"Yuan!");
}
}
/**
*@auteurleno
* Livret
*/
la classe TestAccount2 étend le fil {
compte de compte privé ;
public TestAccount2 (compte compte) {
this.account = compte ;
}
@Outrepasser
publicvoid run() {
compte.retraits (700);
System.out.println("Le solde est :"+account.getBalance()+"Yuan!");
}
}
Test de classe publique
{
publicstaticvoid main(String[] arguments) {
Compte compte = nouveau compte ();
TestAccount1 testAccount1 = nouveau TestAccount1(compte);
testAccount1.start();
TestAccount2 testAccount2 = nouveau TestAccount2(compte);
testAccount2.start();
}
}
21. Utilisez le multithreading en JAVA pour exemple un problème de vente de billets dans une gare
paquet com.softeem.demo ;
/**
*@auteurleno
*Vente de billets
*/
la classe SaleTicket implémente Runnable {
billets = 100 ;
publicvoid run() {
while (billets > 0) {
vente();
//Ou implémentez-le comme ceci
// synchronisé (ceci) {
// si (billets > 0) {
// System.out.println(Thread.currentThread().getName() + "Vendre le premier"
// + (100 - billets + 1) + "billets");
// billets--;
// }
// }
}
}
vente publiquesynchroniséevoid() {
si (billets > 0) {
System.out.println(Thread.currentThread().getName() + "Vendre en premier"
+ (100 - billets + 1) + "billets");
billets--;
}
}
}
publicclass TestSaleTicket {
publicstaticvoid main(String[] arguments) {
SaleTicket st = nouveau SaleTicket();
new Thread(st, "Fenêtre n°1").start();
new Thread(st, "Fenêtre n°2").start();
new Thread(st, "Fenêtre n°3").start();
new Thread(st, "Fenêtre n°4").start();
}
}
22. Exemple de problèmes de producteur et de consommateur utilisant le multi-threading en JAVA
paquet com.softeem.demo ;
Le producteur de classe implémente Runnable
{
pile SyncStack privée ;
producteur public (pile SyncStack) {
this.stack = pile ;
}
publicvoid run() {
pour (int i = 0; i < stack.getProducts().length; i++) {
Chaîne produit = "produit"+i ;
stack.push(produit);
System.out.println("Produit : "+produit);
essayer
{
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
la classe Consumer implémente Runnable
{
pile SyncStack privée ;
Consommateur public (pile SyncStack) {
this.stack = pile ;
}
publicvoid run() {
pour(int i=0;i <stack.getProducts().length;i++)
{
Produit de chaîne =stack.pop();
System.out.println("Consommé : "+produit);
essayer
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
classe SyncStack
{
produits private String[] = new String[10];
indice privé;
publicsynchronizedvoid push (produit String)
{
si(index==produit.length())
{
essayer {
attendez();
} catch (InterruptedException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
notifier();
produits[index]=produit ;
indice++;
}
publicsynchronized String pop()
{
si(index==0)
{
essayer {
attendez();
} catch (InterruptedException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
notifier();
indice--;
Chaîne produit = produits[index] ;
retourner le produit ;
}
public String[] getProducts() {
retourner les produits ;
}
}
publicclass TestProducerConsumer {
publicstaticvoid main(String[] arguments) {
Pile SyncStack=nouveau SyncStack();
Producteur p=nouveau producteur (pile);
Consommateur c=nouveau Consommateur(pile);
new Thread(p).start();
new Thread(c).start();
}
}
23. Programmation pour réaliser la transmission d'objets Student (sno, sname) sérialisés sur le réseau
paquet com.softeem.demo ;
importer java.io.IOException ;
importer java.io.ObjectInputStream ;
importer java.io.ObjectOutputStream ;
importer java.io.Serialisisable ;
importer java.net.ServerSocket ;
importer java.net.Socket ;
classe Student implémente Serialisable {
privé int sno;
nom de chaîne privé ;
public Student (int sno, String sname) {
this.sno = sno;
this.sname = sname;
}
public int getSno() {
retour sno;
}
public void setSno(int sno) {
this.sno = sno;
}
chaîne publique getSname() {
renvoyer le nom ;
}
public void setSname (String sname) {
this.sname = sname;
}
@Outrepasser
chaîne publique toString() {
return "Numéro d'étudiant :" + sno + ";Nom :" + sname ;
}
}
la classe MyClient étend le fil {
@Outrepasser
public void run() {
essayer {
Sockets = new Socket("localhost", 9999);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Étudiant stu = (Étudiant) ois.readObject();
System.out.println("Le programme client reçoit l'objet étudiant transféré du programme serveur >> " + stu);
ois.close();
s.close();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
la classe MyServer étend le fil {
@Outrepasser
public void run() {
essayer {
ServerSocket ss = nouveau ServerSocket (9999);
Prise s = ss.accept();
ObjectOutputStream ops = new ObjectOutputStream(s.getOutputStream());
Étudiant stu = nouvel étudiant (1, "Zhao Benshan");
ops.writeObject(stu);
ops.close();
s.close();
ss.close();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
classe publique TestTransfer {
public static void main (String[] arguments) {
new MonServeur().start();
new MonClient().start();
}
}
lJDBC
24. Utilisez le composant dom4j pour analyser les fichiers au format XML suivants :
<?xml version="1.0" encoding="UTF-8"?>
<générateur>
<nom de la table="login" opération="1">
<column name="username" handle="0">aaa </column>
<column name="password" handle="0">123 </column>
</table>
<nom de la table="login" opération="2">
<column name="id" handle="1">1 </column>
<column name="username" handle="0">bbb </column>
<column name="password" handle="0">444 </column>
</table>
<nom de la table="login" opération="3">
<column name="id" handle="1">4 </column>
</table>
</générateur>
Règles : <table>opération 1 insertion de table, mise à jour de table 2, suppression de table 3.
La table <column>handle 1 est utilisée comme condition Where, la table 0 est utilisée comme champ d'opération.
Condition requise : Générez trois instructions SQL selon les règles ! (C'est-à-dire créer une méthode pour analyser le fichier XML afin de générer une chaîne contenant trois instructions SQL)
/**
*Analyser le fichier XML pour générer une chaîne contenant des instructions SQL exécutables
*@paramxmlNomFichier
*@retourSQL
*/
chaîne publique parseXmltoSQL (chaîne xmlFileName) {
StringBuffer sbsql = new StringBuffer();
Lecteur SAXReader = new SAXReader();
essayer {
Document document = reader.read(new File(xmlFileName));
Élément element = document.getRootElement();
Itérateur it = element.elementIterator("table");
tandis que (it.hasNext()) {
element = (Élément) it.next();
//Récupère les opérations sur la table
String oper = element.attributeValue("opération");
//Obtenir le nom de la table
String tableName = element.attributeValue("name");
if ("1".equals(oper)) {
sbsql.append("insérer dans ").append(tableName);
Itérateur it2 = element.elementIterator("column");
Chaîne nom_colonne1 = null ;
Chaîne columnValue1 = null ;
Chaîne nom_colonne2 = null ;
Chaîne columnValue2 = null ;
si (it2.hasNext()) {
element = (Élément) it2.next();
columnName1 = element.attributeValue("nom");
columnValue1 = element.getText();
}
si (it2.hasNext()) {
element = (Élément) it2.next();
columnName2 = element.attributeValue("nom");
columnValue2 = element.getText();
}
sbsql.append("("+nomcolonne1+","+nomcolonne2+")"+" valeurs('"+valeurcolonne1+"','"+valeurcolonne2+"')n");
} elseif ("2".equals(oper)) {
sbsql.append("update ").append(tableName);
Itérateur it2 = element.elementIterator("column");
Chaîne nom_colonne1 = null ;
Chaîne columnValue1 = null ;
Chaîne nom_colonne2 = null ;
Chaîne columnValue2 = null ;
Chaîne nom_colonne3 = null ;
Chaîne columnValue3 = null ;
si (it2.hasNext()) {
element = (Élément) it2.next();
columnName1 = element.attributeValue("nom");
columnValue1 = element.getText();
}
si (it2.hasNext()) {
element = (Élément) it2.next();
columnName2 = element.attributeValue("nom");
columnValue2 = element.getText();
}
si (it2.hasNext()) {
element = (Élément) it2.next();
columnName3 = element.attributeValue("nom");
columnValue3 = element.getText();
}
sbsql.append(" set "+columnName2+"='"+columnValue2+"',"+columnName3+"='"+columnValue3+"' où "+columnName1+"="+columnValue1+"n");
}elseif ("3".equals(oper)) {
sbsql.append("supprimer de ").append(tableName);
Itérateur it2 = element.elementIterator("column");
Chaîne nom_colonne1 = null ;
Chaîne columnValue1 = null ;
si (it2.hasNext()) {
element = (Élément) it2.next();
columnName1 = element.attributeValue("nom");
columnValue1 = element.getText();
}
sbsql.append(" où "+columnName1+"="+columnValue1);
}
}
} catch (DocumentException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
return sbsql.toString();
}
lJSP/SERVLET
25. Écrivez les objets intégrés de JSP et expliquez leurs fonctions
request:request représente l'objet HttpServletRequest. Il contient des informations sur la requête du navigateur et fournit plusieurs méthodes utiles pour obtenir des données de cookies et d'en-tête. réponse:response représente l'objet HttpServletResponse et fournit plusieurs méthodes pour définir la réponse renvoyée au navigateur (telle que les cookies, les informations d'en-tête, etc.). L'objet out:out est une instance de javax.jsp.JspWriter et fournit plusieurs méthodes que vous peut utiliser pour renvoyer la sortie au navigateur. pageContext : pageContext représente un objet javax.servlet.jsp.PageContext. Il s'agit d'une API utilisée pour faciliter l'accès à diverses étendues d'espaces de noms et d'objets liés aux servlets, et elle encapsule les méthodes des fonctions courantes liées aux servlets. session:session représente un objet javax.servlet.http.HttpSession demandé. La session peut stocker des informations sur l'état de l'utilisateur. application:applicaton représente un objet javax.servle.ServletContext. Cela aide à trouver des informations sur le moteur de servlet et l'environnement de servlet. config:config représente un objet javax.servlet.ServletConfig. Cet objet permet d'accéder aux paramètres d'initialisation de l'instance de servlet. page:page représente une instance de servlet générée à partir de cette page.
exception : L'objet exception est un objet exception Lorsqu'une exception se produit lors de l'exécution d'une page, cet objet est généré. Si une page JSP souhaite utiliser cet objet, elle doit définir isErrorPage sur true, sinon elle ne pourra pas être compilée. C'est en fait le pendant de java.lang.Throwable