2012-05-17 74 views
5

Tôi đã thử nhiều cách khác nhau để sửa lỗi này, nhưng tôi không thể sửa chữa nó. Tôi cố gắng để có được giá trị Boolean của một Object qua bên phương pháp này một Checkbox:Cách lấy giá trị Boolean từ Object

public boolean onPreferenceChange(Preference preference, Object newValue) 
{ 
    final String key = preference.getKey(); 
    referenceKey=key; 
    Boolean changedValue=!(((Boolean)newValue).booleanValue()); //ClassCastException occurs here 
} 

tôi nhận được:

java.lang.ClassCastException: java.lang.String không thể là đúc để java.lang.Boolean

+1

Trước tiên, bạn giả định giá trị mới là loại Boolean. Bạn có thể sử dụng instanceof để kiểm tra kiểu newValue. Nếu nó là một boolean, với autounboxing, bạn không có vấn đề gì. Nếu đó là một chuỗi, bạn có thể so sánh (bỏ qua trường hợp) cho các giá trị "true", "false", sau đó tạo biểu diễn boolean thích hợp. – horbags

Trả lời

9

Thay vì đúc nó, bạn có thể làm điều gì đó như

Boolean.parseBoolean(string); 
+0

bạn cũng có thể kiểm tra instanceof Boolean và instanceof String nếu bạn cần xử lý từng trường hợp ... nhưng không giống như ở đây –

+0

Điều này chỉ lấy chuỗi không phải là đối tượng – rsavchenko

+0

Và anh ta chỉ làm việc với chuỗi dung dịch. – OmniOwl

4

Đây là một số mã nguồn cho lớp Boolean trong java.

// Boolean Constructor for String types. 
public Boolean(String s) { 
    this(toBoolean(s)); 
} 
// parser. 
public static boolean parseBoolean(String s) { 
    return toBoolean(s); 
} 
// ... 
// Here's the source for toBoolean. 
// ... 
private static boolean toBoolean(String name) { 
    return ((name != null) && name.equalsIgnoreCase("true")); 
} 

Vì vậy, bạn có thể thấy, bạn cần phải chuyển một chuỗi với giá trị "true" để giá trị boolean là true. Nếu không thì đó là sai.

assert new Boolean("ok") == false; 
assert new Boolean("True") == true; 
assert new Boolean("false") == false; 

assert Boolean.parseBoolean("ok") == false; 
assert Boolean.parseBoolean("True") == true; 
assert Boolean.parseBoolean("false") == false; 
2

Từ mã bạn đã đăng và kết quả bạn nhìn thấy, nó không giống như newValue là boolean. Vì vậy, bạn cố gắng truyền sang một Boolean, nhưng nó không phải là một, do đó, lỗi xảy ra.

Không rõ bạn đang cố gắng làm gì. Tốt nhất là bạn nên tạo newValue một boolean. Nếu bạn không thể làm điều đó, điều này sẽ hoạt động:

boolean newValue; 
if (newValue instanceof Boolean) { 
    changedValue = newValue; // autoboxing handles this for you 
} else if (newValue instanceof String) { 
    changedValue = Boolean.parseBoolean(newValue); 
} else { 
    // handle other object types here, in a similar fashion to above 
} 

Lưu ý rằng giải pháp này không thực sự lý tưởng và hơi yếu. Trong một số trường hợp đó là OK, nhưng nó có lẽ là tốt hơn để đánh giá lại các yếu tố đầu vào để phương pháp của bạn để làm cho họ sạch hơn một chút. Nếu bạn không thể, thì mã ở trên sẽ hoạt động. Nó thực sự là một cái gì đó chỉ có bạn có thể quyết định trong bối cảnh của giải pháp của bạn.

1

Nếu bạn biết rằng PreferenceCheckBoxPreference, thì bạn có thể gọi isChecked(). Nó trả về một boolean, không phải là Boolean, nhưng đó có thể là đủ gần.

Dưới đây là một số mã từ mẫu APIDemos Device Administration (DeviceAdminSample.java).

private CheckBoxPreference mDisableCameraCheckbox; 

public void onResume() { 
    ... 
    mDPM.setCameraDisabled(mDeviceAdminSample, mDisableCameraCheckbox.isChecked()); 
    ... 
} 

public boolean onPreferenceChange(Preference preference, Object newValue) { 
... 
    boolean value = (Boolean) newValue; 
... 
    else if (preference == mDisableCameraCheckbox) { 
     mDPM.setCameraDisabled(mDeviceAdminSample, value); 
     reloadSummaries(); 
    } 
    return true; 
} 
Các vấn đề liên quan