29
décembre
2005
SCJP 5.0 Défi 7.1; Manipulation des objets String
décembre
2005
Un article de vbrabant
7 Commentaires
Pour vous préparer à la Certification Java SCJP 5.0, nous vous proposons quelques défis.
Aujourd’hui, je vous propose un défi concernant la classe String
Imaginez le code suivant:
public class TestString {
public static void main(String[] args) {
String str = "123456";
System.out.println(str.substring(6));
System.out.println(str.charAt(6));
}
}
public static void main(String[] args) {
String str = "123456";
System.out.println(str.substring(6));
System.out.println(str.charAt(6));
}
}
Quel sera le résultat à la console (pour autant que le programme compile) ?
Et pourquoi ?
7 Commentaires + Ajouter un commentaire
Commentaires récents
Archives
- janvier 2012
- novembre 2010
- février 2009
- janvier 2009
- décembre 2008
- septembre 2008
- août 2008
- décembre 2007
- octobre 2007
- septembre 2007
- juillet 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- avril 2006
- février 2006
- janvier 2006
- décembre 2005
- novembre 2005
- octobre 2005
- septembre 2005
- août 2005
- juillet 2005
- juin 2005
- mai 2005
- avril 2005
Catégories
- Certification
- Défis
- Devoxx
- Devoxx 2008
- Devoxx 2010
- Devoxx France 2012
- Divers
- Événements Java
- Fiches
- Hardware
- In English
- Java
- JavaDay 2006
- JavaFX
- JavaOne 2005
- JavaOne 2006
- JavaOne 2007
- Javapolis 2005
- Javapolis 2006
- Javapolis 2007
- JBoss
- Livres
- Mac
- NetBeans
- OpenJDK
- Pensée
- Performance
- Perles
- Sun Tech Days Paris 2007
- Traduction
La raison pour laquelle une chaine vide est renvoyee, et non une exception, est que c’est le seul tres rare cas en Java où l’index est 1-based (on commence à 1) et non 0-based.
Pour la version de substring qui prend deux index, substring(start_index,end_index), le premier est zero-based, le deuxieme est one-based.
Cette facon d’expliquer (kathy sierra) enlève toute amiguité sur une eventuelle exception levée.
Le programme compile, la ligne System.out.println(str.substring(6)); lancera l’exception StringIndexOutOfBoundsException puisque l’index est plus grand que la taille de la chaîne.
Le code suivant n’est pas exécuté (mais produirait également une StringIndexOutOfBoundsException pour la même raison que précédemment).
La compilation s’effectuera sans problème.
A l’exécution,
l’appel à la méthode substring(6) retournera une chaine vide.
l’appel à la méthode charAt(6) provoquera quant à lui une « StringIndexOutOfBoundsException ».
Voila…
correction : « l’index 5 est gardé dans la chaine restante »
normalement pas le premier, substring ne devrait pas planter dans ce cas, la raison ? je tente le coup :
substring exclu l’index spécifié de la chaine soustraite donc le seul moyen ici de soustraire la totalité de la chaine est de faire substring(6) car si on fait substring(5), l’index 6 est gardé dans la chaine restante, on aurait alors « 6 » affiché. Donc le zentil codeur de la méthode substring a pensé à ce cas extrême en autorisant de mettre l’index à length et non length-1 comme souvent.
Donc, comme soustraire la totalité de la chaine revient à garder une chaine vide, le programme affiche « ».
les deux sont outOfbounds non ?
Je dirais que le programme affiche d’abord une chaîne vide (substring(6)) puis une exception est levée à cause du charAt en dehors des limites du tableau (indexoutofbounds). Alors c’est ça ?