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
Trả lời
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();
}
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à NullPointer
và ArrayOutOfBounds
.
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.
- 1. Android Performance - 'Tránh nội Getters/setters'
- 2. Tránh C# JIT trên không
- 3. Cách tránh sự cố createBitmap() trong android
- 4. Tránh android tắt màn hình trong khi ứng dụng (với Phonegap) là trên
- 5. Tránh xóa thư mục trên Web Publish
- 6. tránh hiển thị menu trên nút bấm
- 7. Android AsyncTask - tránh nhiều trường hợp đang chạy
- 8. Android - cách tránh nhiều triển khai giống nhau .jar
- 9. Làm thế nào để tránh LinearAlloc Vượt lỗi Dung android
- 10. Android: cách tránh khỏi quá trình bị giết
- 11. Cách tránh bàn phím ảo che phủ EditText trong android
- 12. Nút tròn trong android .. tránh nhấn "bên ngoài" nút?
- 13. Android: tránh phá vỡ dòng trong phần TextView Chuỗi
- 14. Tránh nội Getters/setters
- 15. Tránh apk nứt
- 16. Cách tránh lỗi khóa SQLiteException
- 17. cách serialize ArrayList trên android
- 18. Tránh nền màu xám trên IE 10 neo/liên kết
- 19. ASP.NET: tránh RequiredFieldValidator trên điều hướng nút postback
- 20. Tránh Windows Firewall bật lên với Ổ cắm trên localhost
- 21. Tránh các mục trùng lặp trên mảng Mongoose
- 22. Tránh hết thời gian chờ SSH trên Mac OS?
- 23. Tránh các thư trùng lặp trên JMS/ActiveMQ
- 24. Cách tránh các sự kiện nút trên Làm mới trang
- 25. Cách tránh IllegalMonitorStateException khi sử dụng lockInterruptibly trên Reentrantlock
- 26. Python: tránh vòng lặp lồng nhau trên mảng
- 27. Tránh các vấn đề về loại nội dung khi tải xuống tệp qua trình duyệt trên Android
- 28. Có thể tránh các trình phát video gốc trên thiết bị di động không?
- 29. Set khu vực mặc định - Tránh `, mới {diện tích = ""}` trên mỗi liên kết trên trang web
- 30. Alpha-gradient trên Android
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
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 đó. –
Điều Arhimed nói. Xem http://download.oracle.com/javase/tutorial/essential/exceptions/index.html – MatrixFrog