- 索引越界错误
- 识别:当使用
chars
、bytes
或get
方法访问字符串元素时,如果提供的索引超出字符串的有效范围,Rust会抛出IndexOutOfBounds
错误。例如,对于字符串s = "hello"
,尝试访问s.chars().nth(10)
就会出现此错误。
- 处理:在访问字符串元素之前,先检查索引是否在有效范围内。可以使用
len
方法获取字符串长度,然后在访问前进行条件判断。例如:
let s = "hello";
let index = 10;
if index < s.len() {
let char_at_index = s.chars().nth(index);
} else {
println!("Index out of bounds");
}
- UTF - 8编码错误
- 识别:Rust的
String
类型和&str
切片都要求是有效的UTF - 8编码。如果尝试从无效的UTF - 8字节序列创建String
或&str
,会出现错误。例如,let s = String::from_utf8(vec![0xFF]).unwrap();
会因为0xFF
不是有效的UTF - 8字节而导致from_utf8
方法返回Err
。
- 处理:在创建字符串时,使用
from_utf8_lossy
方法替代from_utf8
,它会将无效字节转换为\uFFFD
(替换字符)来生成一个有效的字符串。或者在读取字节序列时,先验证字节序列是否为有效的UTF - 8编码,例如使用is_utf8
方法:
let bytes = vec![0x48, 0x65, 0x6C, 0x6C, 0x6F];// "Hello" 的UTF - 8字节
if bytes.is_utf8() {
let s = String::from_utf8(bytes).unwrap();
} else {
println!("Invalid UTF - 8 sequence");
}
- 字符串拼接错误
- 识别:在使用
+
运算符或format!
宏进行字符串拼接时,如果类型不匹配可能会出现错误。例如,let s1 = "hello"; let s2 = 5; let result = s1 + s2;
会报错,因为+
运算符要求两侧操作数都为&str
类型。
- 处理:确保参与拼接的类型正确。如果要拼接不同类型,如数字和字符串,使用
format!
宏进行格式化。例如:
let s1 = "hello";
let num = 5;
let result = format!("{}{}", s1, num);
- 字符串转换错误
- 识别:当尝试将字符串转换为其他类型(如数字)时,如果字符串格式不正确会出现错误。例如,
let num = "abc".parse::<i32>().unwrap();
会因为"abc"
不能解析为i32
而导致parse
方法返回Err
。
- 处理:使用
parse
方法时,使用Result
类型来处理可能的错误。例如:
let s = "abc";
match s.parse::<i32>() {
Ok(num) => println!("Parsed number: {}", num),
Err(e) => println!("Parse error: {}", e),
}