2012-02-26 50 views
5

nếu tôi muốn chuyển đổi một chuỗi thành một int trong java bạn có biết nếu có cách nào để tôi phát hiện tràn không? do đó tôi có nghĩa là chuỗi chữ thực sự đại diện cho một giá trị lớn hơn MAX_INT?Làm thế nào để phát hiện tràn khi chuyển đổi chuỗi thành số nguyên trong java

java doc không đề cập đến nó .. nó chỉ nói rằng nếu chuỗi không thể được phân tích như một số nguyên, nó sẽ qua FormatException không đề cập đến một lời nào về tràn ..

+0

http://stackoverflow.com/questions/8030485/java-integer-parseint-failed- to-parse-a-string –

+0

@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

+0

'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'. –

Trả lời

8

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 
} 
+0

Đánh bắt và ném 'Ngoại lệ' là Thực hành Xấu. –

+0

@ Khi nghe có vẻ thú vị. Bất kỳ lời giải thích hoặc tham khảo? – paislee

+0

@paislee Cảm ơn. Tôi đoán tôi chỉ muốn hỏi NFE phát hiện tràn, như java doc đã không đề cập đến nó. Nhưng biết cách cô lập trường hợp cũng giúp ích. Tuy nhiên, điều đáng ngạc nhiên đối với tôi là mã nguồn (không phải loại tiêu chuẩn nào) là khu nghỉ mát cuối cùng cho thông tin ... – yangsuli

0

Cast Chuỗi giá trị dài và so sánh Giá trị dài với Integer.Max_value

String bigStrVal="3147483647";   
    Long val=Long.parseLong(bigStrVal); 
    if (val>Integer.MAX_VALUE){ 
     System.out.println("String value > Integer.Max_Value"); 
    }else 
     System.out.println("String value < Integer.Max_Value"); 
+0

Đó là những gì tôi đã làm ... Nhưng tôi đoán đây là một giải pháp xấu xí ... – yangsuli

+1

@yangsuli Quấn nó vào một chức năng và bạn sẽ không phải nhìn vào nó một lần nữa. IMHO này khá thanh lịch .. ngoại trừ Long có MAX_VALUE là tốt, do đó, nó vẫn không được bảo đảm để phân tích cú pháp. – paislee

+0

@paislee Long.Max_Value chính xác lý do tại sao nó không phải là một giải pháp ... Bắt một ngoại lệ có vẻ thanh lịch hơn với tôi ở đây (tất nhiên, nếu Java cho phép tôi làm như vậy ...) – yangsuli

0

Bạn không cần phải làm gì cả.

Khi Javadoc cho Integer.parseInt(str, radix) tiểu bang, một NumberFormatException được ném nếu giá trị đại diện bởi các chuỗi không phải là biểu diễn như một giá trị int; tức là nếu độ lớn của nó quá lớn. Điều này được mô tả như một trường hợp riêng biệt trong trường hợp str bị định dạng sai, do đó, rõ ràng (với tôi) rằng đây là ý nghĩa của nó. (Và bạn có thể xác nhận điều này bằng cách đọc mã nguồn.)

+0

Nó có thể được mô tả là một trường hợp riêng biệt, nhưng trong thực tế không có cách nào để phân biệt các trường hợp. Phương thức này ném các ngoại lệ trong 6 trường hợp, và tất cả chúng đều là ngoại lệ giống hệt nhau. Xem mã 'src'. – paislee

+0

Nhưng OP hỏi về * phát hiện * tràn, không * phân biệt * nó từ các vấn đề khác. NFE * có * phát hiện tràn, và tôi nghĩ đó là những gì thực sự liên quan đến OP. –

Các vấn đề liên quan