Pourquoi est “hors de portée” ne sont pas jetés pour 'substring(startIndex, endIndex)'
En Java, je suis en utilisant le substring()
méthode et je ne suis pas sûr de savoir pourquoi il n'est pas à jeter un "hors de l'indice d'erreur".
La chaîne abcde
a l'index de démarrage de 0 à 4, mais le substring()
méthode prend startIndex et endIndex que les arguments basés sur le fait que je peux appeler foo.substring(0) et d'obtenir "abcde".
Alors pourquoi ne substring(5) de travail? Cet indice devrait être hors de portée. Quelle est l'explication?
/*
1234
abcde
*/
String foo = "abcde";
System.out.println(foo.substring(0));
System.out.println(foo.substring(1));
System.out.println(foo.substring(2));
System.out.println(foo.substring(3));
System.out.println(foo.substring(4));
System.out.println(foo.substring(5));
Ce code affiche:
abcde
bcde
cde
de
e
//foo.substring(5) output nothing here, isn't this out of range?
Lorsque je remplace 5 à 6:
foo.substring(6)
Puis j'obtiens l'erreur:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: -1
Vous devez vous connecter pour publier un commentaire.
Selon la API Java doc, substring déclenche une erreur lors de l'index de début est supérieure à la Longueur de la Chaîne.
En fait, ils donnent un exemple un peu comme le vôtre:
Je suppose que cela signifie qu'il est préférable de penser à un Java Chaîne comme le suivant, où un index est enveloppé dans
|
:Qui est-à-dire une chaîne de caractères a à la fois un début et la fin de l'index.
IndexOutOfBoundsException
eu lieu si beginIndex=String.longueur().Lorsque vous ne
foo.substring(5)
, il obtient la sous-chaîne commençant à la position juste après le "e" et se terminant à la fin de la chaîne. D'ailleurs, le début et la fin sont les mêmes. Ainsi, la chaîne vide. Vous pouvez penser à l'index, comme n'étant pas un caractère réel dans la chaîne, mais d'une position entre les deux personnages.C'est parce que la fonction retourne une sous-chaîne "inclusive" sous-chaîne. De sorte que l'indice 5 points pour un emplacement AVANT la fin de la chaîne, mais APRÈS le dernier affichage de caractères de la chaîne.
Cela est indiqué dans la documentation:
http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#substring(int)
Je sais que ce fil est assez ancien mais c'est un problème fondamental que je pense qu'il mérite une clarification.
La question est bien sur place. Je considère cela comme une panne de logiciel en Java Chaîne.substring(int beginIndex, int endIndex) méthode.
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int,%20int%29.
De la Java Docs https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
Java/C/C++ et de toute autre langue que je connais de ne PAS afficher l'index de tableau comme le "diviseur" entre les éléments du tableau.
Paramètres:
beginIndex - le début de l'indice, inclusivement.
endIndex - l'index de fin de, exclusif.
Soit endIndex est mal nommée, parce que la langue ne permet pas l'accès à la mémoire à l'adresse à endIndex + 1 qui est tenue d'inclure le dernier élément de tableau OU endIndex est mal défini et doit être:
endIndex - l'index de fin inclus.
Il est probable que le second paramètre a été mal nommée. Il devrait être:
longueur - la longueur de la chaîne désirée début à beginIndex.
Nous savons que Gosling en fonction de la syntaxe Java sur les langages C/C++ pour la connaissance. À partir de C+++ classe string http://www.cplusplus.com/reference/string/string/substr/ nous voyons la définition de la méthode est:
chaîne substr (size_t pos = 0, size_t len = osbl) const;
Noter que le deuxième paramètre dans la définition de la méthode est 'len' pour la longueur.
len
Nombre de caractères à inclure dans la sous-chaîne (si la chaîne est plus courte, autant de caractères que possible sont utilisés).
chaîne de test a 10 caractères, les positions d'index de 0 à 9. La spécification d'un endIndex de 10 doit toujours jeter la IndexOutOfBoundsException() parce que la chaîne de test n'a pas de endIndex de 10.
Si nous testons la méthode de la JUnit avec une valeur concrète à la recherche à la C++ méthode, nous nous attendons:
Chaîne de caractères chaîne de test = "test";
assertThat(chaîne de test.substring(4, 6), equalTo("String"));
mais bien sûr, nous vous Prévu: "String", mais "St"
La longueur de la chaîne de test à partir de l'indice 0 à char 'g' en 'String' est de 10 caractères.
Si nous utilisons 10 comme le " endIndex paramètre,
Chaîne de caractères chaîne de test = "test";
assertThat(chaîne de test.substring(4, 10), equalTo("String"));
"Pass" de JUnit.
Si nous renommer le paramètre 2 de "lengthOfSubstringFromIndex0" vous n'avez pas à faire la endIndex - 1 chef d'accusation, et il ne jette la IndexOutOfBoundsException() qui est attendu lors de la spécification d'un endIndex, 10, qui est hors de portée pour le tableau. http://docs.oracle.com/javase/7/docs/api/java/lang/IndexOutOfBoundsException.html
C'est juste un de ces moments que vous devez vous rappeler la singularité de cette méthode. Le second paramètre n'est pas nommé correctement. La Java de la signature de la méthode devrait être:
Ou la méthode redéfinie pour correspondre à C++ string::substr méthode. La redéfinition de cours signifierait la réécriture de l'ensemble de l'internet, de sorte qu'il n'est pas probable.
De la Chaîne d'API javadoc:
Exemples:
Paramètres:
====
Donc, c'est par la conception. Si vous donnez l'indice de la taille de la chaîne, elle renvoie une chaîne vide.
substring(5) points à un index existant...il arrive juste à point pour une chaîne vide. substring(6), d'autre part, est juste un délire. 🙂