Wie komme ich n
in Java zu den ersten Zeichen eines Strings, ohne vorher eine Größenprüfung durchzuführen (Inline ist akzeptabel) oder ein Risiko einzugehen IndexOutOfBoundsException
?
java
string
indexoutofboundsexception
antony.trupe
quelle
quelle
Antworten:
Hier ist eine gute Lösung:
Meinung: Diese Lösung ist zwar "ordentlich", aber meiner Meinung nach weniger lesbar als eine Lösung, die
if
/else
auf offensichtliche Weise verwendet. Wenn der Leser diesen Trick nicht gesehen hat, muss er genauer nachdenken , um den Code zu verstehen. IMO, die Bedeutung des Codes ist in derif
/else
Version offensichtlicher . Eine sauberere / besser lesbare Lösung finden Sie in der Antwort von @ paxdiablo.quelle
Das Rad nicht neu erfinden ...:
Javadoc sagt:
So:
quelle
StringUtils.substring(yourString, 0, n)
nicht dasselbe ist wieyourString.substring(0, n)
. Ersteres stammt vonStringUtils
, während Letzteres verwendetString.substring
(was eine Ausnahme darstellt, wenn der Endindex die Zeichenfolgenlänge überschreitet).if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
ist nicht len, sondern der Endindex.Apache Commons Lang hat hierfür eine
StringUtils.left
Methode.quelle
Es gibt eine Klasse von Fragen zu SO, die manchmal weniger als vollkommen sinnvoll sind. Diese Frage ist gefährlich nahe :-)
Vielleicht könnten Sie Ihre Abneigung gegen eine der beiden Methoden erklären, die Sie ausgeschlossen haben.
Wenn es nur darum geht, dass Sie Ihren Code nicht mit
if
Anweisungen oder Code zum Ausfangen von Ausnahmen überhäufen möchten , besteht eine Lösung darin, eine Hilfsfunktion zu verwenden, die sich um Sie kümmert, etwa:Dadurch werden die Längen im Voraus überprüft und entsprechend gehandelt (entweder kleinere Zeichenfolge oder Pad mit Leerzeichen zurückgeben).
Dann müssen Sie sich in Ihrem Code überhaupt keine Sorgen mehr machen. Rufen Sie einfach an:
anstatt:
Dies würde in dem Fall funktionieren, in dem Sie sich Sorgen zu machen scheinen (basierend auf Ihren Kommentaren zu anderen Antworten) und den Code-Fluss nicht unterbrechen, wenn Sie viele Zeichenfolgen erstellen.
quelle
Schrecklich, wenn
n
es sich um eine Variable handelt (Sie müssen also die Formatzeichenfolge erstellen), aber ziemlich klar, wenn eine Konstante:docs
quelle
Verwenden Sie die Teilzeichenfolgenmethode wie folgt:
Wenn n größer als die Länge der Zeichenfolge ist, wird eine Ausnahme ausgelöst, wie ein Kommentator hervorgehoben hat. Eine einfache Lösung besteht darin, all dies in die Bedingung
if(s.length()<n)
in Ihrerelse
Klausel einzuschließen. Sie können wählen, ob Sie nur den gesamten String drucken / zurückgeben oder auf andere Weise behandeln möchten.quelle
Wenn Sie das Glück haben, sich mit Kotlin zu entwickeln, können
Sie damit
take
Ihr Ziel erreichen.quelle
ApacheCommons hat mich überrascht,
StringUtils.abbreviate(String str, int maxWidth)
fügt "..." hinzu, es gibt keine Möglichkeit, Postfix zu ändern.WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
schaut zum nächsten leeren Raum auf.Ich werde das hier einfach lassen:
quelle
Kotlin: (Wenn jemand braucht)
quelle