2013-11-26 17 views
21

tôi cảm thấy như tôi phải mất một cái gì đó đơn giản, nhưng tôi nhận được một NumberFormatException vào đoạn mã sau:Integer.parse Ngoại lệ định dạng số không?

System.out.println(Integer.parseInt("howareyou",35)) 

Ideone

Nó có thể chuyển đổi String yellow từ căn cứ 35, I don' Tôi hiểu tại sao tôi sẽ nhận được một số NumberFormatException trên Chuỗi này.

+0

Từ các tài liệu: "phân tích các tham số chuỗi như một số nguyên ký trong radix xác định bởi đối số thứ hai Các nhân vật trong chuỗi tất cả phải chữ số của cơ số quy định (được xác định bởi việc Character.digit (. char, int) trả về giá trị không âm), ngoại trừ ký tự đầu tiên có thể là dấu trừ ASCII '-' ('\ u002D') để biểu thị giá trị âm hoặc dấu cộng '+' ('\ u002B') với ASCII Giá trị số nguyên kết quả được trả về. " – HectorLector

+2

Số được tạo ra quá lớn đối với số nguyên java, dùng Long ... –

Trả lời

29

Vì kết quả sẽ nhận được lớn hơn Integer.MAX_VALUE

Hãy thử điều này

System.out.println(Integer.parseInt("yellow", 35)); 
System.out.println(Long.parseLong("howareyou", 35)); 

và cho

Long.parseLong("abcdefghijklmno",25) 

bạn cần BigInteger

Hãy thử điều này và bạn sẽ thấy lý do tại sao

System.out.println(Long.MAX_VALUE); 
System.out.println(new BigInteger("abcdefghijklmno",25)); 
+0

Điều này có vẻ đúng. Tuy nhiên, tôi đã gặp phải một vấn đề mới của 'Long.parseLong (" abcdefghijklmno ", 25)'. Bất kỳ ý tưởng về cách tôi có thể phân tích cú pháp số lớn hơn vì không có parseBigDecimal? – Danny

+5

@Danny, Vì điều đó bạn cần, 'BigInteger big = new BigInteger (" abcdefghijklmno ", 25);' – Masudul

5

Từ JavaDocs:

Một ngoại lệ của loại NumberFormatException được ném nếu một trong các trường hợp sau đây xảy ra:

  • Đối số đầu tiên là null hoặc là một chuỗi có độ dài bằng không. FALSE: "howareyou" không phải là null và trên 0 chiều dài
  • Cơ số nhỏ hơn Character.MIN_RADIX hoặc lớn hơn Character.MAX_RADIX. FALSE: 35 nằm trong khoảng [2,36]
  • Bất kỳ ký tự nào của chuỗi không phải là chữ số của dấu xác định, ngoại trừ ký tự đầu tiên có thể là dấu trừ '-' ('\ u002D') hoặc dấu cộng '+' ('\ u002B') với điều kiện là chuỗi dài hơn chiều dài 1. FALSE: tất cả các nhân vật của "howareyou" nằm trong phạm vi radix [0, 'y']
  • ==> Giá trị được biểu thị bằng chuỗi không phải là giá trị của loại int. TRUE: Lý do ngoại lệ. Giá trị quá lớn cho một số int.

Hoặc Long hay BigInteger nên được sử dụng

+1

Điều này không thực sự trả lời câu hỏi, bạn chỉ cần đổ 4 tùy chọn mà không làm rõ một là nguyên nhân (và tại sao). –

+0

Cách tiếp cận Shotgun vẫn sai ở đây. Có một và chỉ có một câu trả lời đúng. Chỉ vì bạn đã thêm nó vào với 3 người khác hoàn toàn sai trái không trả lời đúng. – dm78

+2

@DavidMays Việc đầu tiên rõ ràng là sai với tôi - vì vậy trích dẫn các tài liệu java đầy đủ nên đã giúp nếu OP sử dụng quá trình loại bỏ - nhưng chỉnh sửa cho rõ ràng bây giờ –

5

Nó có thể được rằng số là>Integer.MAX_VALUE? Nếu tôi thử mã của bạn với Long thay vào đó, nó hoạt động.

2

Như bạn có thể thấy, bạn đang hết dung lượng trong số Integer. Bằng cách hoán đổi nó ra cho một Long, bạn sẽ có được kết quả mong muốn. Here is the IDEOne Link to the working code.

System.out.println(Integer.parseInt("YELLOW",35)); 
System.out.println(Long.parseLong("HOWAREYOU",35)); 
5

Số là nhận được lớn hơn Integer.MAX_VALUE

Hãy thử điều này:

System.out.println(Integer.parseInt("yellow", 35)); 
System.out.println(Long.parseLong("howareyou", 35)); 

Như đã thấy trong René liên kết bình luận của bạn đang tìm kiếm một cái gì đó như thế này sử dụng một BigInteger:

BigInteger big=new BigInteger("abcdefghijklmno", 25); 

Something như thế này:

System.out.println(Long.MAX_VALUE); 
System.out.println(new BigInteger("abcdefghijklmno",25)); 
2

Số sản xuất là quá lớn đối với một Integer Java, sử dụng một Long.

2

Câu trả lời trước của parseLong sẽ chính xác, nhưng đôi khi cũng không đủ lớn để tùy chọn khác sẽ sử dụng BigInteger.

Long.parseLong("howareyou", 35) 
new BigInteger("howareyou", 35) 
Các vấn đề liên quan