lundi 14 septembre 2009

Exercice Certification SCJP : les bases Main

Vous devez connaître par coeur la signature de la méthode main.
Le test va essayer de vous induire en erreur. Si vous cherchez des livres et
exercices, allez voir cette page : Certification Sun SCJP

Voici une série d'exercices possibles (Les solutions sont à la fin) :


Exercice 1 :

Given the following :

public class Test {
public static void main(String args) {
System.out.println("Helllo");
}

}

What is the result ? (choose one)


A Helllo
B Hell
C Compilation fails
D An exception is thrown at runtime




Exercice 2 :

Given the following :


public class Test {

public static void main(String [] arg) {

System.out.println("Helllo");

}

}


What is the result ? (choose one)


A Helllo

B Hel

C Compilation fails

D An exception is thrown at runtime


Exercice 3 :

Given the following :

public class Test {
public void main(String [] argS) {
System.out.println("Helllo");
}
}

What is the result ? (choose one)

A Helllo
B Hel
C Compilation fails
D An exception is thrown at runtime


Exercice 4 :

Given the following :

public class Test {
public static void main(String [] test) {
System.out.println(test[0]);
}
}

and the command line evocation is
java Test X 1 t
What is the result ? (choose one)

A Test
B X
C 1
D t
C Compilation fails
D An exception is thrown at runtime


Correction Exercice 1 :

Pour que la méthode main soit valide, il manque les [] : public static void main(String [] args) {
Dans notre cas, il n'y a pas d'erreur de compilation car pour le compilateur c'est la signature d'une méthode.
Par contre, à l'éxecution, il y aura une exception lancée car la classe Test ne contiendra pas de méthode main.
La réponse correcte est donc la D.

Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: packet/Test)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: Test. Program will exit.

Correction Exercice 2 :

Il va s'afficher Helllo. En effet, le nom de l'argument de la méthode main peut être changé sans aucun problème.

Correction Exercice 3 :

La réponse correcte est la D car le compilateur cherche la signature de la méthode main et ne la trouve pas : public static void main(String [] args) {

Correction Exercice 4 :

La bonne solution est X.