2016-12-22 3 views
2

Hallo Ich arbeite mit einem alten Projekt mit einigen Validierungsregel.iOS Ziel c substringToIndex Absturz

Mein Problem mit wenigen Barcode-Scan-Zeichenfolge, die weniger als bestimmte Zeichen hat. das Programm wird für die folgende Codezeile abstürzen

if ([[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]){ 

} 

Hier ist das Fehlerprotokoll (unten ist Bildausschnitt enthalten)

2016-12-22 14:51:56.019324 SAMKiosk[1008:476815] -[ScanAndPayVC checkBarCodeDetail]: sBarcodeValues 11.10 
2016-12-22 14:51:56.019839 SAMKiosk[1008:476815] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSTaggedPointerString substringToIndex:]: Index 6 out of bounds; string length 5' 
*** First throw call stack: 
(0x1889611b8 0x18739855c 0x188961100 0x189386e80 0x1002ad930 0x1002a8320 0x1002a5bb8 0x19019ca54 0x19019c5f0 0x18b2b1d94 0x18b2d0dcc 0x10070d218 0x100719334 0x100727f94 0x10070f300 0x10071a8ac 0x100710ce0 0x10071205c 0x18890e810 0x18890c3fc 0x18883a2b8 0x18a2ee198 0x18e87a7fc 0x18e875534 0x1000e0414 0x18781d5b8) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

enter image description here

sein kann, weil String nur enthalten 5 Zeichen, wenn die Prüfung erfordert 6. Wie können wir verhindern, dass dieser Absturz passiert? Hilfe ist sehr zu schätzen. danke

+2

Sie greifen direkt auf einen Bereich zu, der länger ist als die Länge der Zeichenfolge – Joshua

+0

Sie können versuchen, if ([sBarcodeValues ​​containsString: @ "2C2C2P"]) ' – iphonic

+1

@iphonic Nein, das ist nicht die gleiche Prüfung. – rmaddy

Antwort

5

Sie sind richtig, dass der Absturz jederzeit geschehen wird sBarcodeValues ist weniger als 6 Zeichen.

Sie können eine zusätzliche Kontrolle für die Länge:

if (sBarcodeValues.length >= 6 && [[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]) { 
} 

oder Sie können einfach tun:

if ([sBarcodeValues hasPrefix:@"2C2C2P"]) { 
} 

Dieses egal funktioniert, wie lange sBarcodeValues ist.

+0

Funktioniert das, wenn 2C2C2P am Anfang der Zeichenfolge ist? – Himanth

+0

@himanth Ja, das hat 'hasPrefix'. Es gibt "YES" zurück, wenn der Empfänger mit der angegebenen Zeichenfolge beginnt. – rmaddy

+0

Dies sollte akzeptiert werden Antwort – Himanth

1

Es empfiehlt sich, die Zeichenfolgenlänge vor der Teilzeichenfolge zu überprüfen.

Sie können überprüfen, ob Sie wie folgt vor:

if (sBarcodeValues.length>=6 && [[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]){ 

} 

Edit:

Wenn Sie nur substringToIndex dann Längenprüfung verwenden möchten, ist notwendig Absturz zu verhindern.

Ansonsten wird hasPrefix die Arbeit tun.

+0

danke denkst du mit check wie oben unsere hasPrefix ist besser? –

+0

Ja, 'hasPrefix' überprüft das Starten des Strings auf das angegebene Präfix, also sind die Überprüfung von Länge und Präfix beide bessere Optionen @ LêKhánhVinh –