2016-09-27 19 views
22

Tôi có chức năng lưu dữ liệu Android trong sqlite nhưng tôi phải chuyển đổi dữ liệu String thành số Integer.Chuyển đổi chuỗi thành int. Đặt int thành 0 nếu String là null

Bất cứ khi nào Stringnull tôi muốn save as 0

Sau đây là mã của tôi mà không bất cứ khi nào giá trị là null

int block_id = Integer.parseInt(jsonarray.getJSONObject(i).getString("block_id")); 

Các block_id trên được chuyển đổi thành một Integer.

Đây là những gì tôi đã quyết định thực hiện nhưng vẫn không thể chuyển đổi giá trị chuỗi thành 0 bất cứ khi nào null.

int block_id = Converttoint(jsonarray.getJSONObject(i).getString("block_id")); 

Sau đó, chức năng convertToInt

public static Integer convertToInt(String str) { 
    int n=0; 
    if(str != null) { 
     n = Integer.parseInt(str); 
    } 
    return n; 
} 

Làm thế nào tôi nên thay đổi nó, để làm cho nó hoạt động?

+4

Vui lòng đăng [mcve]. Tôi nghi ngờ chuỗi của bạn không phải là 'null' nhưng trống. – Tunaki

+4

Mã đó trông giống như nó sẽ hoạt động, mặc dù tôi muốn trả về 'int' thay vì' Integer', và đổi tên phương thức thành 'convertToInt' (hoặc' parseIntOrNull') –

+0

Sau khi bạn kiểm tra xem chuỗi có phải là 'null không 'Tôi cũng sẽ kiểm tra xem chuỗi chỉ chứa các số:' str.matches ("[0-9] +"); '. Hoặc bạn chỉ cần bắt được ngoại lệ phân tích cú pháp. – Blobonat

Trả lời

15

Thay vì viết chức năng của riêng bạn, hãy sử dụng xây dựng inbuild của try-catch. Vấn đề của bạn là, jsonarray hoặc jsonarray.getJSONObject(i) hoặc bản thân giá trị là null và bạn gọi một phương thức có tham chiếu null. Hãy thử các cách sau:

int block_id = 0;  //this set's the block_id to 0 as a default. 
try { 
    block_id = Integer.parseInt(jsonarray.getJSONObject(i).getString("block_id")); //this will set block_id to the String value, but if it's not convertable, will leave it 0. 
} catch (Exception e) {}; 

Trong Java Ngoại lệ được sử dụng để đánh dấu các tình huống không mong muốn. Ví dụ: phân tích cú pháp số không String thành một số (NumberFormatException) hoặc gọi phương thức trên tham chiếu null (NullPointerException). Bạn có thể bắt chúng bằng nhiều cách.

try{ 
    //some code 
} catch (NumberFormatException e1) { 
    e.printStackTrace()  //very important - handles the Exception but prints the information! 
} catch (NullPointerException e2) { 
    e.printStackTrace(); 
} 

hoặc sử dụng thực tế, rằng tất cả họ đều mở rộng Exception:

try { 
    //somecode 
} catch (Exception e) { 
    e.printStackTrace; 
}; 

hoặc kể từ Java 7:

try { 
    //somecode 
} catch (NullPointerException | NumberFormatException e) { 
    e.printStackTrace; 
}; 

Note

Như tôi tin rằng bạn sẽ đọc kỹ câu trả lời, xin lưu ý rằng trên StackOverflow, chúng tôi yêu cầu Minimal, Complete, and Verifiable example bao gồm StackTrace của ngoại lệ của bạn. Trong trường hợp của bạn, nó có thể bắt đầu với những điều sau đây:

Exception in thread "main" java.lang.NullPointerException 

Sau đó, gỡ lỗi dễ dàng hơn nhiều. Không có nó, nó chỉ đoán thôi.

Edit:Theo câu trả lời chấp nhận

Câu trả lời được chấp nhận là tốt và sẽ làm việc càng lâu, như giá trị được lưu trữ với chính: block_id sẽ là số. Trong trường hợp không phải là số, ứng dụng của bạn sẽ bị lỗi.

Thay vì:

JSONObject jObj = jsonarray.getJSONObject(i); 
int block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0; 

Một nên sử dụng:

int block_id; 
try{ 
    JSONObject jObj = jsonarray.getJSONObject(i); 
    block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0; 
} catch (JSONException | NullPointerException e) { 
    e.printStackTrace(); 
} 
23

Đơn giản chỉ cần sử dụng được xây dựng trong phương pháp JSONObject#getInt(String), nó sẽ tự động chuyển đổi các giá trị cho một int bằng cách gọi đằng sau những cảnh Integer.parseInt(String) nếu đó là số String hoặc bằng cách gọi Number#intValue() nếu đó là Number. Để tránh ngoại lệ khi khóa của bạn không có sẵn, chỉ cần kiểm tra trước nếu khóa JSONObject của bạn có khóa bằng cách sử dụng JSONObject#has(String), điều này đủ để an toàn vì khóa không thể có giá trị null, hoặc giá trị này tồn tại với giá trị không null hoặc không không tồn tại.

JSONObject jObj = jsonarray.getJSONObject(i); 
int block_id = jObj.has("block_id") ? jObj.getInt("block_id") : 0; 
9

Có một cách khác để thực hiện việc này ngoài các phương pháp được đưa ra trong phần còn lại của câu trả lời.

8

Bạn có thể kiểm tra NumberFormatException. Integer.parseInt() sẽ ném NumberFormatException đối với trường hợp:

  • Stringnull
  • String trống ("")
  • String không thể được chuyển đổi sang int đối với bất kỳ lý do nào khác (nói String"aff" hoặc "1.25")

Về cơ bản, nó sẽ xử lý tất cả có thể không trường hợp n-số nguyên.

Mã số Ví dụ:

private static int convertStringToInt(String str){ 
    int x = 0; 
    try{ 
     x = Integer.parseInt(str); 
    }catch(NumberFormatException ex){ 
     //TODO: LOG or HANDLE 
    } 
    return x; 
} 
7

Bạn có thể sử dụng phương pháp sau đây,

String id = jsonarray.getJSONObject(i).getString("block_id") 
int blockId = getBlockId(id); 

@NonNull 
private Integer getBlockId(String id) { 
    Integer blockId= 0; 
    try { 
     blockId= Integer.parseInt(id); 
    } catch (NumberFormatException e) { 
     e.printStackTrace(); 
    } 
    return blockId; 
} 
6
String toBeParsedStr="1234"; 
int parsedInt=toBeParsedStr!=null&&toBeParsedStr.matches("[0-9]+")?Integer.parseInt(toBeParsedStr):0; 
-1

Chức năng của bạn sẽ làm việc tốt chỉ khi param là một sản phẩm nào string thay vì null Nếu thông số trống rỗng string, Integer.parseInt sẽ ném NumberFormatException thay vì return 0

6

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

int block_id = (jsonarray.getJSONObject(i).has(block_id)) ? jsonarray.getJSONObject(i).getInt("block_id") : 0; 
3

bạn có thể sử dụng Integer.getInteger("30").intValue()

1
String str = "..."; 
// suppose str becomes null after some operation(s). 
int number = 0; 
try 
{ 
    if(str != null) 
     number = Integer.parseInt(str); 
} 
catch (NumberFormatException e) 
{ 
    number = 0; 
} 
1

Thông báo ..bạn cũng có thể viết nó như thế

public static Integer convertToInt(String str) { 
    int n=0; 
    if(str != null && str.length()>0) { 
     n = Integer.parseInt(str); 
    } 
    return n; 
} 

nhưng phương pháp try/catch là cách hiệu quả hơn và đơn giản và sẽ không gây ra một lối ra hệ thống nếu thư được bên trong String (chỉ đáng nói)

cũng , điều quan trọng là phải nhận thấy rằng cách viết phương trình tương tự như thế:

if(str != null & str.length()>0) {} 

hay như thế:

if(str.length()>0 && str != null) {} 

có thể gây ra các hoạt động thất bại bởi vì nó sẽ cố gắng để đếm String ngay cả khi nó là null

Hope Tôi trả lời cho tất cả những câu hỏi của

2
int block_id_0 = jObj.optInt("block_id"); 

Các ternary điều kiện và nhiều mã đơn giản có thể được thay thế bằng optInt hoạt động trong một dòng, đơn giản là

1.) returndefault value hoặc 0 nếu không có giá trị (phụ thuộc vào biến thể bạn đang sử dụng).

2.) Hãy thử để chuyển đổi các giá trị, nếu giá trị có sẵn như là string

3.) Đơn giản chỉ cần Không có ngoại lệ null hoặc NumberFormat ở tất cả trong trường hợp mất tích

docs Android khóa hoặc giá trị

int optInt (String name)

int optInt (String name, int fallback)

Maven-Trung

int optInt(String key, int defaultValue)

Để có được một giá trị mặc định xác định nếu không có giá trị có sẵn

Nhận một giá trị int tùy chọn kết hợp với một chìa khóa, hoặc mặc định nếu không có chìa khóa như vậy hoặc nếu giá trị không phải là số. Nếu giá trị là một chuỗi, một nỗ lực sẽ được thực hiện để đánh giá nó là một số.

jObj.optInt("block_id",defaultvalue); 

hoặc

Để có được một giá trị mặc định là 0 nếu không có giá trị có sẵn

Nhận một giá trị int tùy chọn kết hợp với một chìa khóa, hoặc không có nếu có không quan trọng như vậy hoặc nếu giá trị không phải là số. Nếu giá trị là một chuỗi, một nỗ lực sẽ được thực hiện để đánh giá nó là một số.

jObj.optInt("block_id"); 

e.g

int block_id = jObj.optInt("block_id",5); 

block_id sẽ là 5 nếu không có chìa khóa/giá trị có sẵn

int block_id_0 = jObj.optInt("block_id"); 

block_id_0 sẽ là 0 nếu không có chìa khóa/giá trị có sẵn

Có biến thể khác của chức năng này có sẵn cho các kiểu dữ liệu khác là tốt, hãy thử liên kết docs ở trên.

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