繁体   English   中英

iOS Objective C substringToIndex崩溃

[英]iOS Objective C substringToIndex crash

我正在使用具有某些验证规则的旧项目。

我的问题是条形码扫描字串少,但字符数少。 该程序将因以下代码行而崩溃

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

}

这是错误日志(下面的图片包含详细信息):

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) 

在此处输入图片说明

可能是因为当检查要求6时,字符串仅包含5个字符。如何防止这种崩溃的发生?

您很正确地认为, sBarcodeValues少于6个字符,就会发生崩溃。

您可以添加额外的长度检查:

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

或者您可以简单地执行以下操作:

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

无论sBarcodeValues有多长,这都将起作用。

最好在子字符串之前检查字符串长度。

您可以检查如下:

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

}

编辑:

如果只想使用substringToIndex则必须进行长度检查以防止崩溃。

否则, hasPrefix将完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM