2011-01-01 28 views
6

Tôi mới trong môi trường Android và tôi đã bắt đầu viết một số mã để thực hiện một số truy vấn trên cơ sở dữ liệu. Khi tôi phải xử lý các trường hợp ngoại lệ, tôi không biết cách thích hợp để làm điều đó - từ Android tôi đã sử dụng để khai báo throws về phương pháp nhưng có vẻ như không cho phép throws trong Android? Chỉ try-catch? Tôi nói điều này bởi vì nhật thực không đề nghị tôi thêm tuyên bố throws như khi tôi ra khỏi môi trường Android, tôi đoán rằng nó có liên quan đến extends Activity. Vì vậy, cách thích hợp để xử lý ngoại lệ trong Android là gì? Xung quanh mỗi câu với try-catch làm cho mã của tôi trông khủng khiếp và đó không thực sự là những gì tôi muốn làm.Tránh thử/bắt trên Android

+0

Bạn đang nói về các phương pháp ghi đè/triển khai? Và "mã khủng khiếp" đó chỉ có nghĩa là bạn đã chuẩn bị cho mọi tình huống có thể xảy ra. Oh, nhân tiện: Đối với 'RuntimeException' và các lớp con của nó, bạn không cần" ném ". – thejh

+8

Android sử dụng ngôn ngữ Java, do đó, xử lý ngoại lệ là THE CÙNG như trong bất kỳ dự án Java nào khác. Ngoài ra, rất khó để đoán trường hợp của bạn, vì vậy có lẽ bạn có thể cụ thể hơn trong câu hỏi của mình, ví dụ: bạn có thể đưa ra một mẫu mã để làm nổi bật vấn đề của bạn. Tôi tin rằng nó có thể được giải thích đúng cho bạn sau đó. –

+0

Điều Arhimed nói. Xem http://download.oracle.com/javase/tutorial/essential/exceptions/index.html – MatrixFrog

Trả lời

2

Lý do bạn không thể "thêm ném trong android qua nhật thực" là vì bạn không phải là người xác định giao diện hoặc siêu lớp. Nếu bạn muốn thêm một ngoại lệ cho chữ ký phương thức (như bạn nói bạn làm bình thường) nó cũng cần phải được thêm vào giao diện và bạn không kiểm soát được chúng để bạn không thể thay đổi nó.

Ví dụ: phương pháp

bảo vệ void onCreate (Bundle savedInstanceState);

mà bạn ghi đè trong hoạt động, nếu bạn muốn ném một ngoại lệ chữ ký phương pháp sẽ cần phải được thay đổi để (ví dụ)

protected void onCreate (Bundle savedInstanceState) ném MyException;

nhưng sau đó nó cũng sẽ cần phải thay đổi nơi onCreate được xác định, trong lớp Activity - và đó là một lớp bạn không thể thay đổi (vì nó được cung cấp bởi thư viện android).

Vì vậy, lựa chọn duy nhất của bạn là bắt ngoại lệ và làm điều gì đó với nó (hoặc chỉ bỏ qua nó). Bạn có thể làm cho một bánh mì nướng để hiển thị errror

catch (Exception e) { 
    Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT); 
    toast.show(); 
} 
13

Nếu phương pháp bạn đang sử dụng đã ném một ngoại lệ, bạn có thể muốn chỉ cần tái ném ngoại lệ như các loại mới:

public void someMethod() throws IOException { 
    try { 
     // Do database operation 
    } catch (MyException e){ 
     throw new IOException(e.toString()); 
    } 
} 

// Or, if there is no exception, use an unchecked exception: 

public void otherMethod() { 
    try { 
     // DB operation 
    } catch (MyException e){ 
     throw new RuntimeException(e); 
    } 
} 

Các tùy chọn khác là thực hiện MyException mở rộng RuntimeException. Sau đó trình biên dịch sẽ không buộc bạn bắt hoặc thêm nó vào chữ ký phương thức. RuntimeExceptions được gọi là ngoại lệ không được kiểm soát có nghĩa là bạn không phải kiểm tra chúng xảy ra bằng cách thử/nắm bắt. Ví dụ về các trường hợp này là NullPointerArrayOutOfBounds.

4

Tôi chỉ băn khoăn về việc xử lý lạ "ném" trong môi trường Android và tìm thấy câu hỏi cũ này ở đây. Asker Jon "bắt đầu viết một số mã để thực hiện một số truy vấn trên cơ sở dữ liệu", vì vậy có thể anh ta nhận thấy giống như tôi đã làm.

này biên dịch mà không có lỗi:

public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL(DbMeta.T_DISGUISED.T_CREATE); 
} 

Mặc dù tuyên bố này (trong javadoc sổ popup):

void android.database.sqlite.SQLiteDatabase.execSQL(String sql) throws SQLException 

Vì vậy, đầu tiên, monkjack đã đúng khi ông chỉ ra rằng chữ ký onCreate phương pháp của không thể thay đổi bằng cách kế thừa các triển khai. Và thứ hai, Zeki là chỉ báo chính xác sự khác biệt giữa các ngoại lệ đã chọn và không được kiểm tra.

Và bây giờ thứ ba, tôi muốn thêm rằng sự nhầm lẫn lớn là do SQLException.

SQLException được sử dụng trong ví dụ trên là loại Android android.database.SQLException và thừa kế java.lang.RuntimeException - đó là một ngoại lệ không được kiểm soát! Không yêu cầu khai báo!

Đó không phải là số cổ điển java.sql.SQLException - là java.lang.Exception và yêu cầu thử/nắm bắt/ném.

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