我正在使用一个带有一些验证规则的旧项目。
我的问题是几乎没有条形码扫描字符串,这个字符串具有较小的特定字符。对于以下代码行,该程序将崩溃
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)
可能因为字符串在检查需要时只包含5个字符.6。我们如何防止这种崩溃发生?
答案 0 :(得分:5)
您是正确的,任何时候sBarcodeValues
少于6个字符都会发生崩溃。
您可以添加额外的长度检查:
if (sBarcodeValues.length >= 6 && [[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]) {
}
或者您可以这样做:
if ([sBarcodeValues hasPrefix:@"2C2C2P"]) {
}
无论sBarcodeValues
多长时间,这都会有效。
答案 1 :(得分:1)
最好在子字符串之前检查字符串长度。
您可以按如下方式检查:
if (sBarcodeValues.length>=6 && [[sBarcodeValues substringToIndex:6] isEqualToString:@"2C2C2P"]){
}
<强> 编辑: 强>
如果您只想使用substringToIndex
,则需要进行长度检查以防止崩溃。
否则,hasPrefix
将完成工作。