Nếu tôi muốn chuyển đổi chuỗi thành int trong java, bạn có biết cách nào để tôi phát hiện tràn không?
Có. Việc loại trừ các ngoại lệ phân tích cú pháp sẽ là cách tiếp cận chính xác, nhưng khó khăn ở đây là Integer.parseInt(String s)
ném một số NumberFormatException
cho bất kỳ lỗi nào trong số phân tích cú pháp, bao gồm tràn. Bạn có thể xác minh bằng cách xem mã nguồn Java trong tệp src.zip
của JDK. May mắn thay, có một hàm tạo BigInteger(String s)
sẽ ném các ngoại lệ phân tích cú pháp giống hệt nhau, ngoại trừ cho các giới hạn phạm vi, bởi vì BigInteger
không có giới hạn. Chúng ta có thể sử dụng kiến thức này để bẫy các trường hợp tràn bộ nhớ:
/**
* Provides the same functionality as Integer.parseInt(String s), but throws
* a custom exception for out-of-range inputs.
*/
int parseIntWithOverflow(String s) throws Exception {
int result = 0;
try {
result = Integer.parseInt(s);
} catch (Exception e) {
try {
new BigInteger(s);
} catch (Exception e1) {
throw e; // re-throw, this was a formatting problem
}
// We're here iff s represents a valid integer that's outside
// of java.lang.Integer range. Consider using custom exception type.
throw new NumberFormatException("Input is outside of Integer range!");
}
// the input parsed no problem
return result;
}
Nếu bạn thực sự cần để tùy chỉnh này cho chỉ đầu vào vượt quá Integer.MAX_VALUE, bạn có thể làm điều đó ngay trước khi ném ngoại lệ tùy chỉnh, bằng cách sử dụng @ Sergej của gợi ý. Nếu ở trên là quá mức cần thiết và bạn không cần phải tách biệt trường hợp tràn, chỉ cần loại bỏ ngoại lệ bằng cách bắt nó:
int result = 0;
try {
result = Integer.parseInt(s);
} catch (NumberFormatException e) {
// act accordingly
}
http://stackoverflow.com/questions/8030485/java-integer-parseint-failed- to-parse-a-string –
@darkmist Cảm ơn. Biết nó ném một ngoại lệ giúp. Tôi vẫn còn những gì để biết loại ngoại lệ và như vậy ... Bạn có thể chỉ cho tôi tài liệu mô tả hành vi? – yangsuli
'NumberFormatException' (' parseInt' được khai báo là 'public static int parseInt (String s, int radix) ném NumberFormatException'). BTW, có một mẫu trong http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html cho số quá dài không vừa với 'int'. –