không thể gọi String.isEmpty () trong android


80

Trong ứng dụng Android của mình, tôi không thể sử dụng hàm String.isEmpty () nằm trong JDK 1.6. Android 2.1 lib không có chức năng này trong lớp java.lang.String

Tôi đã cố gắng nhập thư viện Hệ thống JRE vào dự án của mình, vì nó có chức năng này, nhưng không có tác dụng.

Làm cách nào để giải quyết vấn đề này và cho phép ứng dụng của tôi sử dụng chức năng này?


11
isEmpty được thêm vào trong API Cấp 9. Xem ở đây developer.android.com/reference/java/lang/...
Mudassir

3
Thật kỳ lạ, tôi chưa gặp phải vấn đề này. Tuy nhiên, tôi tránh sử dụng .isEmpty (). Tôi chỉ thích sử dụng if (myString == null || myString.trim (). Size () == 0)
Ali

1
@Ali - ờ !! Có vẻ như mã bạn làm việc đang thực hiện một công việc không tốt trong việc chỉ định và kiểm tra các API / điều kiện trước và điều kiện hậu của giao diện.
Stephen C

Bằng cách này, bạn thậm chí có thể yêu cầu JavaC biên dịch mã để tương thích với một phiên bản rõ ràng của JRE. Tôi chưa bao giờ thử nó, nhưng tôi tự hỏi liệu nó có phải là một giải pháp dễ dàng hơn trong trường hợp này không. @Stephen: Tôi đã được kiến ​​trúc sư phần mềm của chúng tôi yêu cầu cụ thể là luôn kiểm tra giá trị rỗng khi nhận được giá trị từ lệnh gọi api. Ngoài ra, với đầu vào của người dùng, chúng tôi thường có sự không nhất quán trong đó giao diện người dùng có thể trả về null nếu một trường trống hoặc một chuỗi trống nếu người dùng tập trung vào trường nhưng không nhập bất kỳ thứ gì. Kỳ lạ là tôi biết.
Ali

2
@Ali - Tôi không ấn tượng với kiến ​​trúc sư của bạn. IMO, tốt hơn là bạn nên phát hiện và xử lý null tại nguồn thay vì ở mọi API. Ngoài ra, hãy coi các null không mong đợi như lỗi và để chúng biến thành NPE. Rắc rối khi kiểm tra rõ ràng các giá trị null là mã của bạn lộn xộn với các lần kiểm tra vô nghĩa và bạn có thể rơi vào bẫy "sửa chữa" các giá trị null bằng cách biến chúng thành các chuỗi trống (ví dụ).
Stephen C

Câu trả lời:


83

Làm cách nào để giải quyết vấn đề này và cho phép ứng dụng của tôi sử dụng chức năng này?

Bạn không thể.

Sử dụng String.length() == 0thay thế. Nó tương thích ngược hoàn toàn với JDK 1.0 ... và với J2ME.

String.equals("") là một thay thế khác.


Bạn có chắc rằng không có cách nào để cấu hình Eclipse để đưa vào một lớp mã từ các thư viện xác định không?

Không phải nếu bạn muốn ứng dụng của mình chạy trên thiết bị Android thực . Nền tảng Java / Android cố tình làm cho bạn khó điều chỉnh hoạt động của các thư viện lớp lõi. Để bắt đầu, bạn chỉ có thể làm điều đó bằng cách sửa đổi phần tương đương Davlik của bootclasspath hoặc rt.jartệp và cả hai điều này đều không thể thực hiện được trong một JVM đang chạy.

Kiểu mày mò đó có nguy cơ phá vỡ Java cho các ứng dụng khác. Ngay cả khi giả sử rằng bạn không thể thỏa hiệp trực tiếp việc phân tách ứng dụng Android (vì quá trình / phân tách uid được đề cập bên dưới), các chỉnh sửa độc hại đối với các lớp lõi Java (được chia sẻ) vẫn có thể cho phép một ứng dụng can thiệp hoặc lấy cắp thông tin từ một ứng dụng khác .


Vấn đề là tôi làm việc với JSONRPC, sử dụng các lớp từ thư viện miễn phí code.google.com/p/json-simple và có một hàm JSONRPC2Message.parse (String arg0), sử dụng phương thức String.isEmpty (), vì vậy khi Tôi chạy ứng dụng của mình thì nhận được ngoại lệ java.lang.noSuchMethodError. Bạn có chắc rằng không có cách nào để cấu hình Eclipse để đưa vào một lớp mã từ các thư viện xác định không? Ý tôi là nếu tôi muốn sử dụng lớp String không phải từ thư viện Android 2.1 mà từ thư viện Hệ thống JRE?
teoREtik Ngày

7
Json-simple là mã nguồn mở; tạo phiên bản thư viện của riêng bạn không sử dụng String.isEmpty (). Điều đó đơn giản hơn nhiều (và an toàn hơn) so với việc cố gắng điều chỉnh thư viện thời gian chạy android.
thoredge

Nếu họ không làm vậy, sẽ là chuyện nhỏ để một ứng dụng giả mạo phá hoại bảo mật - tôi thực sự nghi ngờ điều này. Mỗi ứng dụng chạy trong một quy trình Linux riêng biệt theo uid của riêng nó và bảo mật Android không dựa vào các biện pháp bảo vệ gói Java. Nếu một ứng dụng sửa đổi bản sao của chính Stringnó sẽ không ảnh hưởng đến các ứng dụng khác.
poolie

@poolie - OK, nhưng không có hộp cát nào trong "JVM" chạy ứng dụng? (Tôi tìm thấy nó một chút khó có thể tin rằng nó an ninh Linux cấp là chỉ bảo vệ bạn chống lại giả mạo các ứng dụng chạy trên điện thoại Android của bạn.)
Stephen C


120

Bạn có thể sử dụng android.text.TextUtils.isEmpty () để thay thế. Phương pháp này cũng kiểm tra xem Chuỗi có rỗng hay không và đã có sẵn kể từ API cấp 1.

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}

6

phương pháp này đã xuất hiện trong API9, vì vậy bạn không thể sử dụng nó trước Android2.3


5

Bạn có thể sử dụng cái này TextUtils.isEmpty(str). Điều này có sẵn kể từ API cấp 1 hoặc Bạn có thể tạo phương pháp của riêng mình như bên dưới

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

2
Tôi nghĩ đây nên là câu trả lời được chọn. Usint TextUtils là lựa chọn tốt nhất. Bạn không cần phải tạo chức năng của riêng mình để thực hiện điều tương tự.
Genaut

Bạn biết bạn có thể vừa viết return (str == null || str.length() == 0);, phải không?
Piovezan

@Piovezan vâng chúng ta có thể viết những dòng này cũng
Shan Xeeshi

4

Theo như tôi biết android hỗ trợ java 5, vì vậy không có isEmpty();bạn có thể sử dụng length()để mô phỏngisEmpty()


1

"" .equals (yourString); cũng cho hành vi tương tự như String.isEmpty ();


Đó thực sự là giải pháp tốt nhất vì nó cũng ngăn chặn NullPointerException
Lukas

Đây không phải là giải pháp tốt nhất, bởi vì bạn đang tạo một đối tượng Chuỗi mới mỗi lần bạn muốn so sánh, trong khi bạn với isEmpty đang kiểm tra null và độ dài.
Genaut

2
@ user1422434 - Không, bạn không phải vậy. Có một và chỉ một đối tượng đại diện cho chuỗi rỗng cho toàn bộ máy ảo.
Stephen C

Nhưng tôi cũng không đồng ý với @Lukas. Các giải pháp "ngăn chặn NPE" nói chung là một ý tưởng tồi. Ý tưởng tốt hơn là tìm ra nguyên nhân của điều không mong muốn nullvà khắc phục vấn đề đó . Phương "".equals(yourString)pháp này chỉ là một giải pháp tốt nếu một nullgiá trị cho yourStringlà có ý nghĩa ... và được mong đợi.
Stephen C

-4

Bạn phải nâng cấp API android lên cấp 9 hoặc sử dụng String.trim().length()==0hoặc String.equals("")thay vào đó, nó sẽ hoạt động đối với cấp API android và phiên bản JDK của bạn.


Gì? Chuỗi " "không trống! Tại sao bạn đề nghị cắt bớt chuỗi?
ruX

1
@ruX " ".trim()sẽ trống !!! Bạn thậm chí có biết điều đó ?? Đừng đánh giá xuống nếu bạn KHÔNG hiểu mô tả của tôi !!!
Động cơ Bai

@Eugenie Bai String.trim().length()==0String.equals("")trả về các kết quả khác nhau khi String = " ". Đoạn mã thứ hai đúng
ruX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.