Quản lý lỗi và gom rác
Chia sẻ bởi Nguyễn Việt Vương |
Ngày 29/04/2019 |
149
Chia sẻ tài liệu: Quản lý lỗi và gom rác thuộc Bài giảng khác
Nội dung tài liệu:
Chương 4
Quản lý lỗi và gom rác
Mục tiêu
Định nghĩa được exception là gì.
Phân loại được các exception
Sử dụng được cú pháp try..catch..finally
Biết cách tự quản lý exception
Giải thích được cơ chế gom rác của Java
Nội dung
4.1- Ôn tập.
4.2- Exception là gì?
4.3- Cấu trúc quản lý lỗi của Java
4.4- Mô hình try catch finally
4.5- Sử dụng throws
4.6- Tự định nghĩa exceptions
4.7- Cơ chế gom rác
4.8- Tóm tắt-trắc nghiệm-bài tập
4.1- Ôn tập
Lớp là mô hình biểu diễn cho 1 tập các đối tượng có cấu trúc giống nhau.
interface là 1 tên gọi cho một tập các KHAI BÁO dữ liệu hằng và hành vi hình thành nên một mô hình xử lý, các hành vi chưa được hiện thực cần hiện thực ở các lớp.
Lớp trừu tượng là lớp khai báo với từ khóa abstrat và có ít nhất 1 hành vi abstract
Hành vi abstract là hành vi chỉ mới được khai báo mà chưa hiện thực.
Ôn tập
Lớp abstract và interface khác nhau ở chỗ: 1 lớp chỉ có thể thừa kế từ 1 lớp kah1c nhưng lại có thể là 1 hiện thực của nhiều interface.
Gói là 1 khai báo cho 1 tập các lớp, các interface và các gói cấp thấp hơn.
Gói là 1 thư mục có tên trùng với tên gói.
4.2- Exception là gì?
Java là ngôn ngữ mạnh, có nghĩa là tối thiểu hóa được lỗi và khi có lỗi thì chúng có thể được quản lý.
Lỗi có 2 loại: Lỗi lúc biên dịch (compile-time error-lỗi cú pháp), lỗi lúc thực thi (run-time error- giải thuật sai, không dự đoán được tình huống).
Exception= runtime-error
Thí dụ: thực hiện phép chia mà mẫu số là 0
Khi 1 exception xẩy ra, chương trình kết thúc đột ngột và điều khiển được trả lại cho OS Cần phải quản lý được các tình huống này.
4.3- Cấu trúc các class quản lý lỗi của Java
Object
Throwable
Exception
Error
AWTError
ThreadDead
…
SQLException
ClassNotFoundException
…
RuntimeException
ArithmaticException
NullPointerException
NumberFormatException
Khi 1 error/exception xẩy ra, ta nói rằng nó bị “thrown” (throw)
…
Tham khảo JavaHelp
Cấu trúc các class quản lý lỗi của Java(tt)
Exception: lớp nền của phân cấp exception.
RuntimeException: Lớp nền của nhiều lớp trong java.lang.exceptions.
ArithmaticException: Quản lý lỗi tóan học như chia cho 0.
IllegalArgumentException : Lỗi sai đối số.
ArrayIndexOutOfBoundsException: Lỗi sai chỉ số của mảng
NullPointerException: Lỗi đã truy xuất 1 đối tượng chưa khởi tạo
SecurityException : Lỗi không được quyền truy cập.
ClassNotFoundException: Lỗi không thể nạp 1 lớp vì không có lớp này
Cấu trúc các class quản lý lỗi của Java(tt)
NumberFormatException: Lỗi chuyển String ->float.
AWTException: Lỗi Abstract Windowing Toolkit
ArithmaticException: Quản lý lỗi tóan học như chia cho 0.
IOException : Lớp nền của IO exception.
FileNotFoundException: Lỗi không có file đã đặc tả
EOFException: Lỗi cố truy xuất dữ liệu mà file đã hết
IllegalAccessException : Lỗi truy xuất đến 1class bị cấm.
NoSuchMethodException: Lỗi không có method đã đặc tả
InterruptedException: luồng bị ngắt
4.4- Mô hình try catch finally
Có thể thử thực thi 1 tác vụ (try), nếu xuất 1 lỗi thì bẫy lỗi (catch) để xử lý tình huống lỗi và cuối cùng thực thi tiếp (finally).
Cú pháp
( Không có các cặp {} Lỗi: ‘{‘ expected )
try {….}
catch (Exception e) { …}
finally { …}
…
Mô hình try catch finally(tt)
import java.io.*; // TryCatchDemo.java
class TryCatchDemo
{ static double Divide ( double a, double b) { return a/b;}
public static void main(String args[])
{ try { System.out.println(Divide(5,0));}
catch( Exception e)
{ System.out.println("System exception:"+ e.toString());}
finally
{ System.out.println("I tried to divide 5 by 0");}
System.out.println("End!");
}
}
Infinity
I tried to divide 5 by 0
End!
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ static String S;
static void Out() { System.out.println(S);}
public static void main(String args[])
{ try { Out(); }
catch (NullPointerException e)
{ System.out.println("Exception occured:");}
finally { int a[]= { 1,2,3,4,5};
try { System.out.println(a[7]);}
catch(ArrayIndexOutOfBoundsException e2)
{ System.err.println("Out of bounds");}
}
}
}
null
Out of bounds
4.5- Sử dụng throw
Tóan tử throw cho phép chỉ thị 1 exception đã xẩy ra. Kết qủa là 1 đối tượng của 1 lớp dẫn xuất của lớp Throwable.
Tình huống: method X() gọi method Y(), Y() thực thi gây ra 1 exception mà không được quản lý, exception này lan về cho phương thức gọi là X() . Nếu trong X() cũng không quản lý lỗi Lỗi truyền về cho nơi đã gọi X()
Cách giải quyết:
a) Trong Y() có quản lý lỗi;
b) Trong X() có có cấu trúc try…catch để quản lý lỗi.
Sử dụng throw/throws ...
Cú pháp sinh 1 Exception trong hàm
ReturnType Method (…) throws ExceptionClass
{ if (…) throw ExceptionClass(“Message”);
else { …… }
}
Thí dụ về lan truyền exception
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= new ArrayCatch(); Obj.OutElement(7); }
void OutElement(int i) { System.out.println (a[i]); }
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at ArrayCatch.OutElement(ArrayCatch.java:10)
at ArrayCatch.main(ArrayCatch.java:7)
lỗi truyền lên
Kích thước của mảng: 5
Chỉ số truy xuất: 7
Cách sửa 1- Try catch bẫy lỗi trong main(…)
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= new ArrayCatch();
try { Obj.OutElement(7);}
catch (ArrayIndexOutOfBoundsException e)
{ System.out.println("Illegal index");}
}
void OutElement(int i) { System.out.println (a[i]); }
}
Illegal index
Press any key…
Bẫy lỗi
Cách sửa 2- Try catch bẫy lỗi trong OutElement(…)
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= new ArrayCatch();Obj.OutElement(7);}
void OutElement(int i) throws
ArrayIndexOutOfBoundsException
{ if (i<0 || i>=n) throw new
ArrayIndexOutOfBoundsException
(" Index is out of array");
else System.out.println (a[i]);
}
}
Phát sinh 1 đối tượng Exception trong phân cấp
Nội dung thông báo lỗi tự chọn thay cho thông báo hệ thống
Khai báo có bẫy lỗi
Try catch bẫy lỗi trong OutElement(…) - tt
Kết qủa:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
Index is out of array
at ArrayCatch.OutElement(ArrayCatch.java:9)
at ArrayCatch.main(ArrayCatch.java:6)
4.6- Tự định nghĩa exceptions
User-defined Exception: Tạo ra 1 lớp con của các lớp Error hoặc Exception
import java.io.*; // ArrayCatch.java
class MyException extends ArrayIndexOutOfBoundsException
{ MyException() { super(" Index is out of array");}}
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= newArrayCatch();Obj.OutElement(7);}
void OutElement(int i) throws MyException
{ if (i<0 || i>=n) throw new MyException();
else System.out.println (a[i]);
}
}
4.7- Cơ chế gom rác
Là cơ chế tự động của Java để hủy bỏ các đối tượng không còn dùng nữa.
Hiện thực bằng heap động (xem lại chương 1).
Dù có thủ công gọi trình gom rác bằng System.gc() cũng không bảo đảm việc gom rác được thực thi ngay lập tức.
Có thể thủ công tắt trình gom rác bằng chỉ thị
java –noasyncgc File.class
nhưng có thể phải trả giá là thiếu bộ nhớ do số đối tượng sinh ra trong chương trình khó tiên liệu Hiệu suất chương trình kém.
Cơ chế gom rác- finalize() method
Java cung cấp phương thức finalize() họat động như 1 Destructor của C++ để hủy các quá trình trước khi qúa trình trả điều khiển về cho hệ điều hành.
Chú ý: Chỉ có đối tượng mới bị gom rác chứ tham khảo đến đối tượng không bị gom.
Cú pháp:
protected void finalize() throws Throwable
Thí dụ:
Object a= new Object(); Object b=a; a=null;
a, b là các references của 1 đối tựơng.
a=null, nghĩ rằng đối tượng không còn dùng nữa Sai vì b vẫn tham khảo đến nó
Object c= new Object();
c=null ; // đối tượng này bây giờ là rác
Object d= new Object();
d=new Object();
Thí dụ:
Trong chương trình trên
Lớp RunTime mô tả hệ thống lúc thực thi
Dùng hành vi static getRunTime để khởi tạo 1 đối tượng RunTime
Một số methods của lớp Runtime
Methodes của lớp RunTime
4.8- Tóm tắt-trắc nghiệm-bài tập
Có hai lọai lỗi: Lỗi lúc biên dịch và lỗi khi thực thi.
Lỗi biên dịch là lỗi ………………………
Lỗi lúc thực thi còn gọi là ………………..
Nếu không quản lý Exception, chương trình sẽ ngắt đột ngột và điều khiển được trả về cho ……………………………………..
Hòan tòan có thể bẫy được các ……………………………..
Quản lý exception cho phép xử lý lỗi đúng lúv (true/false)
5 từ khóa được dùng để bẫy lỗi : …………………………………..
Từ khóa throws cho phép dùng đối với các exception mà 1 hàm có thể xử lý (true/false)
Từ khóa throw chỉ thị rằng 1 exception đã xẩy ra (true/false)
Từ khóa finally chỉ thị nơi bắt đầu 1 khối phát biểu không phụ thuộc vào 1 lỗi có xẩy ra hay không (true./false)
Ta có thể tự tạo ra 1 Exception class (true/false)
System.gc() sẽ yêu cầu hệ thống …………………………..
Bài tập
1- Viết chương trình chạy bằng đối số dòng lệnh buộc nhập các tham số cho chương trình là các ký số. Nếu nhập ký tự thì báo lỗi “Không nhập ký tự”
Lưu ý: Cú pháp java file.class arg1, arg2, …
2- Viết chương trình nhập vào 1 mảng số int, nhập 1 vị trí i, xuất phần tử thứ i nếu i hợp lệ. Ngược lại xuất thông báo “Ngòai tầm phủ sóng”. Gợi ý: xem lại chương 2 về nhập số int, xem trong chương này về Exception ứng với tình huống ngòai tầm phủ sóng:” này.
Quản lý lỗi và gom rác
Mục tiêu
Định nghĩa được exception là gì.
Phân loại được các exception
Sử dụng được cú pháp try..catch..finally
Biết cách tự quản lý exception
Giải thích được cơ chế gom rác của Java
Nội dung
4.1- Ôn tập.
4.2- Exception là gì?
4.3- Cấu trúc quản lý lỗi của Java
4.4- Mô hình try catch finally
4.5- Sử dụng throws
4.6- Tự định nghĩa exceptions
4.7- Cơ chế gom rác
4.8- Tóm tắt-trắc nghiệm-bài tập
4.1- Ôn tập
Lớp là mô hình biểu diễn cho 1 tập các đối tượng có cấu trúc giống nhau.
interface là 1 tên gọi cho một tập các KHAI BÁO dữ liệu hằng và hành vi hình thành nên một mô hình xử lý, các hành vi chưa được hiện thực cần hiện thực ở các lớp.
Lớp trừu tượng là lớp khai báo với từ khóa abstrat và có ít nhất 1 hành vi abstract
Hành vi abstract là hành vi chỉ mới được khai báo mà chưa hiện thực.
Ôn tập
Lớp abstract và interface khác nhau ở chỗ: 1 lớp chỉ có thể thừa kế từ 1 lớp kah1c nhưng lại có thể là 1 hiện thực của nhiều interface.
Gói là 1 khai báo cho 1 tập các lớp, các interface và các gói cấp thấp hơn.
Gói là 1 thư mục có tên trùng với tên gói.
4.2- Exception là gì?
Java là ngôn ngữ mạnh, có nghĩa là tối thiểu hóa được lỗi và khi có lỗi thì chúng có thể được quản lý.
Lỗi có 2 loại: Lỗi lúc biên dịch (compile-time error-lỗi cú pháp), lỗi lúc thực thi (run-time error- giải thuật sai, không dự đoán được tình huống).
Exception= runtime-error
Thí dụ: thực hiện phép chia mà mẫu số là 0
Khi 1 exception xẩy ra, chương trình kết thúc đột ngột và điều khiển được trả lại cho OS Cần phải quản lý được các tình huống này.
4.3- Cấu trúc các class quản lý lỗi của Java
Object
Throwable
Exception
Error
AWTError
ThreadDead
…
SQLException
ClassNotFoundException
…
RuntimeException
ArithmaticException
NullPointerException
NumberFormatException
Khi 1 error/exception xẩy ra, ta nói rằng nó bị “thrown” (throw)
…
Tham khảo JavaHelp
Cấu trúc các class quản lý lỗi của Java(tt)
Exception: lớp nền của phân cấp exception.
RuntimeException: Lớp nền của nhiều lớp trong java.lang.exceptions.
ArithmaticException: Quản lý lỗi tóan học như chia cho 0.
IllegalArgumentException : Lỗi sai đối số.
ArrayIndexOutOfBoundsException: Lỗi sai chỉ số của mảng
NullPointerException: Lỗi đã truy xuất 1 đối tượng chưa khởi tạo
SecurityException : Lỗi không được quyền truy cập.
ClassNotFoundException: Lỗi không thể nạp 1 lớp vì không có lớp này
Cấu trúc các class quản lý lỗi của Java(tt)
NumberFormatException: Lỗi chuyển String ->float.
AWTException: Lỗi Abstract Windowing Toolkit
ArithmaticException: Quản lý lỗi tóan học như chia cho 0.
IOException : Lớp nền của IO exception.
FileNotFoundException: Lỗi không có file đã đặc tả
EOFException: Lỗi cố truy xuất dữ liệu mà file đã hết
IllegalAccessException : Lỗi truy xuất đến 1class bị cấm.
NoSuchMethodException: Lỗi không có method đã đặc tả
InterruptedException: luồng bị ngắt
4.4- Mô hình try catch finally
Có thể thử thực thi 1 tác vụ (try), nếu xuất 1 lỗi thì bẫy lỗi (catch) để xử lý tình huống lỗi và cuối cùng thực thi tiếp (finally).
Cú pháp
( Không có các cặp {} Lỗi: ‘{‘ expected )
try {….}
catch (Exception e) { …}
finally { …}
…
Mô hình try catch finally(tt)
import java.io.*; // TryCatchDemo.java
class TryCatchDemo
{ static double Divide ( double a, double b) { return a/b;}
public static void main(String args[])
{ try { System.out.println(Divide(5,0));}
catch( Exception e)
{ System.out.println("System exception:"+ e.toString());}
finally
{ System.out.println("I tried to divide 5 by 0");}
System.out.println("End!");
}
}
Infinity
I tried to divide 5 by 0
End!
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ static String S;
static void Out() { System.out.println(S);}
public static void main(String args[])
{ try { Out(); }
catch (NullPointerException e)
{ System.out.println("Exception occured:");}
finally { int a[]= { 1,2,3,4,5};
try { System.out.println(a[7]);}
catch(ArrayIndexOutOfBoundsException e2)
{ System.err.println("Out of bounds");}
}
}
}
null
Out of bounds
4.5- Sử dụng throw
Tóan tử throw cho phép chỉ thị 1 exception đã xẩy ra. Kết qủa là 1 đối tượng của 1 lớp dẫn xuất của lớp Throwable.
Tình huống: method X() gọi method Y(), Y() thực thi gây ra 1 exception mà không được quản lý, exception này lan về cho phương thức gọi là X() . Nếu trong X() cũng không quản lý lỗi Lỗi truyền về cho nơi đã gọi X()
Cách giải quyết:
a) Trong Y() có quản lý lỗi;
b) Trong X() có có cấu trúc try…catch để quản lý lỗi.
Sử dụng throw/throws ...
Cú pháp sinh 1 Exception trong hàm
ReturnType Method (…) throws ExceptionClass
{ if (…) throw ExceptionClass(“Message”);
else { …… }
}
Thí dụ về lan truyền exception
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= new ArrayCatch(); Obj.OutElement(7); }
void OutElement(int i) { System.out.println (a[i]); }
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at ArrayCatch.OutElement(ArrayCatch.java:10)
at ArrayCatch.main(ArrayCatch.java:7)
lỗi truyền lên
Kích thước của mảng: 5
Chỉ số truy xuất: 7
Cách sửa 1- Try catch bẫy lỗi trong main(…)
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= new ArrayCatch();
try { Obj.OutElement(7);}
catch (ArrayIndexOutOfBoundsException e)
{ System.out.println("Illegal index");}
}
void OutElement(int i) { System.out.println (a[i]); }
}
Illegal index
Press any key…
Bẫy lỗi
Cách sửa 2- Try catch bẫy lỗi trong OutElement(…)
import java.io.*; // ArrayCatch.java
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= new ArrayCatch();Obj.OutElement(7);}
void OutElement(int i) throws
ArrayIndexOutOfBoundsException
{ if (i<0 || i>=n) throw new
ArrayIndexOutOfBoundsException
(" Index is out of array");
else System.out.println (a[i]);
}
}
Phát sinh 1 đối tượng Exception trong phân cấp
Nội dung thông báo lỗi tự chọn thay cho thông báo hệ thống
Khai báo có bẫy lỗi
Try catch bẫy lỗi trong OutElement(…) - tt
Kết qủa:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
Index is out of array
at ArrayCatch.OutElement(ArrayCatch.java:9)
at ArrayCatch.main(ArrayCatch.java:6)
4.6- Tự định nghĩa exceptions
User-defined Exception: Tạo ra 1 lớp con của các lớp Error hoặc Exception
import java.io.*; // ArrayCatch.java
class MyException extends ArrayIndexOutOfBoundsException
{ MyException() { super(" Index is out of array");}}
class ArrayCatch
{ int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[])
{ ArrayCatch Obj= newArrayCatch();Obj.OutElement(7);}
void OutElement(int i) throws MyException
{ if (i<0 || i>=n) throw new MyException();
else System.out.println (a[i]);
}
}
4.7- Cơ chế gom rác
Là cơ chế tự động của Java để hủy bỏ các đối tượng không còn dùng nữa.
Hiện thực bằng heap động (xem lại chương 1).
Dù có thủ công gọi trình gom rác bằng System.gc() cũng không bảo đảm việc gom rác được thực thi ngay lập tức.
Có thể thủ công tắt trình gom rác bằng chỉ thị
java –noasyncgc File.class
nhưng có thể phải trả giá là thiếu bộ nhớ do số đối tượng sinh ra trong chương trình khó tiên liệu Hiệu suất chương trình kém.
Cơ chế gom rác- finalize() method
Java cung cấp phương thức finalize() họat động như 1 Destructor của C++ để hủy các quá trình trước khi qúa trình trả điều khiển về cho hệ điều hành.
Chú ý: Chỉ có đối tượng mới bị gom rác chứ tham khảo đến đối tượng không bị gom.
Cú pháp:
protected void finalize() throws Throwable
Thí dụ:
Object a= new Object(); Object b=a; a=null;
a, b là các references của 1 đối tựơng.
a=null, nghĩ rằng đối tượng không còn dùng nữa Sai vì b vẫn tham khảo đến nó
Object c= new Object();
c=null ; // đối tượng này bây giờ là rác
Object d= new Object();
d=new Object();
Thí dụ:
Trong chương trình trên
Lớp RunTime mô tả hệ thống lúc thực thi
Dùng hành vi static getRunTime để khởi tạo 1 đối tượng RunTime
Một số methods của lớp Runtime
Methodes của lớp RunTime
4.8- Tóm tắt-trắc nghiệm-bài tập
Có hai lọai lỗi: Lỗi lúc biên dịch và lỗi khi thực thi.
Lỗi biên dịch là lỗi ………………………
Lỗi lúc thực thi còn gọi là ………………..
Nếu không quản lý Exception, chương trình sẽ ngắt đột ngột và điều khiển được trả về cho ……………………………………..
Hòan tòan có thể bẫy được các ……………………………..
Quản lý exception cho phép xử lý lỗi đúng lúv (true/false)
5 từ khóa được dùng để bẫy lỗi : …………………………………..
Từ khóa throws cho phép dùng đối với các exception mà 1 hàm có thể xử lý (true/false)
Từ khóa throw chỉ thị rằng 1 exception đã xẩy ra (true/false)
Từ khóa finally chỉ thị nơi bắt đầu 1 khối phát biểu không phụ thuộc vào 1 lỗi có xẩy ra hay không (true./false)
Ta có thể tự tạo ra 1 Exception class (true/false)
System.gc() sẽ yêu cầu hệ thống …………………………..
Bài tập
1- Viết chương trình chạy bằng đối số dòng lệnh buộc nhập các tham số cho chương trình là các ký số. Nếu nhập ký tự thì báo lỗi “Không nhập ký tự”
Lưu ý: Cú pháp java file.class arg1, arg2, …
2- Viết chương trình nhập vào 1 mảng số int, nhập 1 vị trí i, xuất phần tử thứ i nếu i hợp lệ. Ngược lại xuất thông báo “Ngòai tầm phủ sóng”. Gợi ý: xem lại chương 2 về nhập số int, xem trong chương này về Exception ứng với tình huống ngòai tầm phủ sóng:” này.
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Nguyễn Việt Vương
Dung lượng: |
Lượt tài: 4
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)