Tải bản đầy đủ (.pdf) (89 trang)

chapter 3 exception lập trình java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.21 MB, 89 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>Chương 3</b>

<b>NGOẠI LỆ</b>

<b>IS216 - LẬP TRÌNH JAVA</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>LAMBDA EXPRESSIONS VÀ INNERCLASS</b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>Lambda Expressions</b>

● Ứng dụng:

● Sử dụng với các API Stream:

● filter(), map(), forEach()

● Viết code ngắn gọn hơn:

● Thay thế cho các anonymous inner class

● Tăng khả năng đọc code:

● Code dễ hiểu và dễ bảo trì hơn

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<small>List<String> languages = Arrays.asList("Java", "C#", "C++", "PHP", "Javascript");Collections.sort(languages, (String o1, String o2) -> {</small>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>Lambda Expressions</b>

● Một biểu thức Lambda (Lambda expression) trong Java gồm các phần chính sau:

● No name: khơng có tên phương thức, nó là một phương thức ẩn danh (anonymous method).

● Parameter list: danh sách các tham số.

● Body: biểu thức, câu lệnh xử lý.

● No return type: không có kiểu trả về tường minh, trình biên dịch có thể tự suy luận ra kiểu dữ liệu trả về dựa vào code thực thi.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

● Là class được định nghĩa bên trong một class khác (hoặc 1 interface khác).

● Có hai loại:

● Static inner class:

○ Được định nghĩa bằng static keyword

○ Có thể truy cập các biến static của outer class

● Non-static inner class:

○ Khơng được định nghĩa bằng static keyword

○ Có thể truy cập tất cả các biến của outer class

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

● Ứng dụng:

● Tạo các class nhỏ gọn để sử dụng trong một class khác

● Tạo các class ẩn danh để sử dụng với các API như

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<small>public static void main(String[] args) {</small>

<small>OuterClass outerClass = new OuterClass();</small>

<small>OuterClass.InnerClass innerClass = outerClass.new InnerClass();innerClass.print();</small>

<small>}}</small>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>NGOẠI LỆ</b>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>Ngoại lệ</b>

<b>Ngoại lệ (Exception)</b>

: là một sự kiện xảy ra trong tiến trình thực thi của một chương trình, nó làm ngưng tiến trình bình thường của chương trình.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>Ngoại lệ</b>

● Khi xảy ngoại lệ, nếu khơng xử lý chương trình sẽ kết thúc ngay.

mạng bị ngắt trong quá trình thực hiện giao tác, JVM hết bộ nhớ, Truy cập vượt ngoài chỉ số của mảng …

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>Ngoại lệ</b>

● Dựa vào tính chất các vấn đề, người ta chia ngoại lệ thành ba loại:

○ Ngoại lệ được kiểm tra (Checked Exceptions).

○ Ngoại lệ không được kiểm tra (Unchecked Exceptions).

○ Lỗi (Error).

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>Ngoại lệ</b>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b>Ngoại lệ</b>

● <b>Error: là những lỗi nghiêm trọng xảy ra đối khi chương trình hoạt </b>

động mà lập trình viên khơng thể kiểm sốt. Ví dụ như lỗi phần cứng, tràn bộ nhớ, hay lỗi của JVM.

viết code, vì nó được kiểm tra bởi trình biên dịch Javac. Ví dụ: ClassNotFoundException, NoSuchFieldException...

trình chạy, nghĩa là trình biên dịch Javac không "phát hiện" ra khi biên dịch, do vậy programmer không thể xử lý khi viết code. Ví dụ: NullPointerException, ArrayIndexOutOfBoundsException,

DivideByZeroException...

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b>XỬ LÝ NGOẠI LỆ</b>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>Xử lý ngoại lệ</b>

● <b>Sử dụng các mệnh đề điều kiện kết hợp với các giá trị cờ.</b>

○ <b>Mục đích: thơng qua tham số, giá trị trả lại hoặc giá trị cờ để</b>

viết mã xử lý tại nơi phát sinh lỗi.

■ Làm chương trình thêm rối, gây khó hiểu.

■ Dễ nhầm lẫn

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<b>Xử lý ngoại lệ</b>

<small>public class Inventory{</small>

<small>public final int MIN = 0; publicfinal int MAX = 100;publicfinal int CRITICAL = 10;</small>

<small>public</small><b><small>boolean addToInventory (int amount)</small></b>

<small>int temp;</small>

<small>temp = stockLevel + amount; if (temp > MAX){</small>

<small>System.out.print("Adding " + amount + " item will cause stock ");</small>

<small>System.out.println("to become greater than " + MAX + " units (overstock)");</small>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<small>store.addToInventory (int amt){if (temp > MAX) return </small>

<small>false;}</small>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<small>chủ có thể không biết cách xử lý khi lỗi xảy ra</small>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

■ Ngoại lệ không cần kiểm tra (unchecked)

■ Ngoại lệ phải kiểm tra (checked)

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<b>Xử lý ngoại lệ</b>

● Checked vs Unchecked

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>Xử lý ngoại lệ</b>

● Ngoại lệ unchecked (không cần kiểm tra)

■ <small>Là các ngoại lệ không bắt buộc phải được kiểm tra.</small>

■ <small>Gồm RuntimeException, Error và các lớp con của chúng.</small>

● Ngoại lệ checked (phải kiểm tra)

■ <small>Là các ngoại lệ bắt buộc phải được kiểm tra.</small>

■ <small>Gồm các ngoại lệ còn lại.</small>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<b>Xử lý ngoại lệ</b>

● Trình biên dịch khơng u cầu phải bắt các ngoại lệ khi nó xảy ra.

● Các ngoại lệ này có thể xảy ra bất cứ thời điểm nào khi thi hành chương trình.

● Thơng thường là những lỗi nghiêm trọng mà chương trình khơng thể kiểm sốt

● Sử dụng các mệnh đề điều kiện để xử lý sẽ tốt hơn.

● <b>Gồm các lớp RuntimeException, Error và các lớp con của</b>

chúng

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<b>Xử lý ngoại lệ</b>

● <b>RuntimeException: chỉ các ngoại lệ xảy ra khi JVM thực thi </b>

chương trình

<small>oNullPointerException: con trỏ null</small>

<small>oOutOfMemoryException: hết bộ nhớ</small>

<small>oArrayIndexOutOfBoundsException: vượt quá chỉ số mảng</small>

<small>oArithmeticException: lỗi toán học</small>

<small>oClassCastException: lỗi ép kiểu</small>

<small>oChỉ những lỗi nghiêm trọng và khơng dự đốn trước được: ThreadDead, LinkageError, VirtualMachineError…</small>

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<b>Xử lý ngoại lệ</b>

<small>int [] arr = null; </small>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b>Xử lý ngoại lệ</b>

<small>int [] arr = null;</small>

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>Xử lý ngoại lệ</b>

<small>int [] arr = null;</small>

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<b>Xử lý ngoại lệ</b>

● Là ngoại lệ bắt buộc kiểm tra.

● Phải xử lý khi ngoại lệ có khả năng xảy ra:

● Ví dụ: IOException, NumberFormatException

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<b>Xử lý ngoại lệ</b>

● try{…}: khối lệnh có khả năng gây ra ngoại lệ.

● catch{…}: nơi bắt và xử lý ngoại lệ.

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

<small>typed in..." + s); num = Integer.parseInt (s);</small>

<small>System.out.println("Converted to an integer..." + num);</small>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<b>Xử lý ngoại lệ</b>

<small>System.out.print("Type an integer: "); s = stringInput.readLine();</small>

<small>System.out.println("You typed in..." + s); num = Integer.parseInt (s);System.out.println("Converted to an integer..." + num);</small>

<small>}</small>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<b>Xử lý ngoại lệ</b>

● Kết quả của phương thức readLine()<sub>try</sub>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<small>public BufferedReader (Reader in); </small>

<small>public BufferedReader (Reader in, int sz);</small>

<small>public String readLine () throws IOException;</small>

<small>}</small>

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">

<b>Xử lý ngoại lệ</b>

● Kết quả của phương thức parseInt ()

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">

<small>public Integer (int value);</small>

<small>public Integer (String s) throws NumberFormatException;</small>

<small>public static int parseInt (String s) throws NumberFormatException;</small>

<small>}</small>

</div><span class="text_page_counter">Trang 53</span><div class="page_container" data-page="53">

<b><small>// Do nothing here but set up the try-catch block to bypass the// annoying compiler error</small></b>

NO!

</div><span class="text_page_counter">Trang 54</span><div class="page_container" data-page="54">

<b>Xử lý ngoại lệ</b>

● <b>Khối finally: Là 1 khối không bắt buộc trong khối try-catch-finally.</b>

hay khơng. VD:

o<small>Đóng file, đóng socket, connection</small>

o<small>Giải phóng tài nguyên (nếu cần)...</small>

<small>catch block</small>

<small>No exception</small>

<small>exception</small>

</div><span class="text_page_counter">Trang 61</span><div class="page_container" data-page="61">

<b>Xử lý ngoại lệ</b>

● <small>Từ khóa throws được sử dụng để khai báo một ngoại lệ. Nó thể hiện thơng tin cho lập trình viên rằng có thể xảy ra một ngoại lệ</small>

● <small>Giả sử có method1 và method2. Method1 gọi method2 và method2 làphương thức có khả năng xảy ra ngoại lệ:</small>

</div><span class="text_page_counter">Trang 62</span><div class="page_container" data-page="62">

● Cách 2: Khai báo throws

<small>public static voidmain(String[ ] args) </small><b><small>throws</small></b> <small>IOException</small>

<small>Strings = buff.readLine();</small>

<small>62</small>

</div><span class="text_page_counter">Trang 65</span><div class="page_container" data-page="65">

<b>Xử lý ngoại lệ</b>

<small>class Driver{</small>

<small>public static void main (String [] args) { TCExample eg = new TCExample (); boolean inputOkay = true;</small>

</div><span class="text_page_counter">Trang 67</span><div class="page_container" data-page="67">

<b>Xử lý ngoại lệ</b>

● Từ khoá throw được sử dụng để ném ra một ngoại lệ cụ thể, chủ yếu được sử dụng để ném ngoại lệ tùy chỉnh (ngoại lệ do người dùng tự định nghĩa).

</div><span class="text_page_counter">Trang 68</span><div class="page_container" data-page="68">

<b>Xử lý ngoại lệ</b>

<small>➢</small><b><small>Sử dụng throw anExceptionObject trong thân </small></b>

<small>phương thức để tung ra ngoại lệ khi cần</small>

<small>➢</small><b><small>Nếu phương thức có chứa câu lệnh throw ngoại lệ thì phần khai báo phương thức phải khai báo throws </small></b>

<small>ngoại lệ đó hoặc lớp cha của ngoại lệ đó.</small>

</div><span class="text_page_counter">Trang 69</span><div class="page_container" data-page="69">

<b>Xử lý ngoại lệ</b>

<small>➢</small><b><small>Đối với RuntimeException phương thức khơng cần </small></b>

<small>phải khai báo throws RuntimeException vì ngoại lệ này mặc định được ủy nhiệm cho JVM</small>

</div><span class="text_page_counter">Trang 70</span><div class="page_container" data-page="70">

<small>public static void main(String[] args) {int num = cal(6,0);</small>

<small>}</small> <b><small>Lỗi ngoại lệ:</small></b>

<small>Exception in thread "main" java.lang.ArithmeticException: Khong the chia cho 0</small>

</div><span class="text_page_counter">Trang 71</span><div class="page_container" data-page="71">

<small>Exception in thread "main" java.lang.RuntimeException: </small>

<small>Uncompilable source code - unreported exception java.lang.Exception; must be caught or declared to be thrown</small>

<small>at exceptionex.ExceptionEx.main(ExceptionEx.java:58)</small>

</div><span class="text_page_counter">Trang 72</span><div class="page_container" data-page="72">

<small>public static void main(String[] args) throws Exception{ int num = cal(6,0);</small>

<b><small>Thêm: throws Exception</small></b>

</div><span class="text_page_counter">Trang 73</span><div class="page_container" data-page="73">

<small>Sau throw là một instance.Sau throws là</small> <b><small>một hoặc nhiều class.</small></b>

<small>Throwđược sử dụng trong phương thức có thể quăng ra Exception ở bất kỳ dịng nào trong phương thức (sau đó dùng try-catch để bắt hoặc throws cho phương thức khác xử lý)</small>

<small>Throwsđược khai báo ngay sau dấu đóng ngoặc đơn của phương thức. Khi một phương thức có throwbên trong mà khơng bắt lại (try – catch) thì phải ném đi (throws) cho phương thức khác xử lý.Khơng thể throw nhiều exceptions.</small>

<small>Cóthể khai báo nhiều exceptions, Ví dụ:public void method() throws IOException, SQLException { }</small>

</div><span class="text_page_counter">Trang 74</span><div class="page_container" data-page="74">

<b>Xử lý ngoại lệ</b>

<small>➢Một phương thức có thể throw nhiều hơn 1 ngoại lệ:</small>

<small>public voidmethod(int tuoi, String ten)throwsArithmeticException,</small>

<small>➢Lan truyền ngoại lệ:</small>

</div><span class="text_page_counter">Trang 75</span><div class="page_container" data-page="75">

<b>Xử lý ngoại lệ</b>

o<small>Nếu C() gặp lỗi và throw ra ngoại lệ nhưng trong C() lại không xử lý ngoạilệ này, thì nơi gọi C() là phương thức B() là nơi có thể xử lý ngoại lệ.</small>

o<small>Nếu trong B() cũng khơng xử lý thì phải xử lý ngoại lệ này trong A()… Quátrình này gọi là lan truyền ngoại lệ.</small>

o<small>Nếu đến main() cũng không xử lý ngoại lệ được throw từ C() thì chương</small>

</div><span class="text_page_counter">Trang 76</span><div class="page_container" data-page="76">

<b>Xử lý ngoại lệ</b>

● <small>Trong khối catch, ta có thể không xử lý trực tiếp ngoại lệ mà lại ném lạingoại lệ đó cho nơi khác xử lý.</small>

● <small>Chú ý: Trong trường hợp trên, phương thức chứa catch phải bắt ngoại lệhoặc khai báo throws cho ngoại lệ</small>

<small>catch (IOExceptione) {</small>

<small>throwe;}</small>

</div><span class="text_page_counter">Trang 77</span><div class="page_container" data-page="77">

<b>Xử lý ngoại lệ</b>

<small>➢</small><b>Kế thừa ngoại lệ:</b>

o<small>Khi override một phương thức của lớp cha, phương thức ở lớp con khôngđược phép tung ra các ngoại lệ mới.</small>

o<b><small>Phương thức ghi đè trong lớp con chỉ được phép tung ra các ngoại lệ giốnghoặc là lớp con hoặc là tập con của các ngoại lệ được tung ra ở lớp cha.</small></b>

</div><span class="text_page_counter">Trang 78</span><div class="page_container" data-page="78">

<b>Xử lý ngoại lệ</b>

<small>classDisk {</small>

<small>public voidreadFile()throwsEOFException {}}</small>

<small>classFloppyDiskextendsDisk {</small>

<small>public voidreadFile()throwsIOException {}// ERROR!</small>

<small>class FloppyDisk extends Disk {</small>

<small>public void readFile() throws EOFException {}}</small>

</div><span class="text_page_counter">Trang 79</span><div class="page_container" data-page="79">

<b>Xử lý ngoại lệ</b>

Ưu điểm của throws/throw

➢ Dễ sử dụng

o<small>Dễ dàng chuyển điều khiển đến nơi có khả năng xử lý ngoại lệ</small>

o<small>Có thể throw nhiều loại ngoại lệ</small>

➢ Tách xử lý ngoại lệ khỏi đoạn mã thơng thường

➢ Khơng bỏ sót ngoại lệ (throws)

➢ Gom nhóm và phân loại các ngoại lệ

</div><span class="text_page_counter">Trang 80</span><div class="page_container" data-page="80">

<b>Tạo ra kiểu ngoại lệ mới</b>

</div><span class="text_page_counter">Trang 82</span><div class="page_container" data-page="82">

<b>Tạo ngoại lệ mới</b>

➢Mục đích: tạo ra ngoại lệ do người dùng định nghĩa để kiểm soát các lỗi

o<b><small>Kế thừa lớp Exception hoặc lớp con của nó</small></b>

o<b><small>Có tất cả phương thức của lớp Throwable</small></b>

</div><span class="text_page_counter">Trang 83</span><div class="page_container" data-page="83">

<b>Tạo ngoại lệ tự định nghĩa</b>

</div><span class="text_page_counter">Trang 84</span><div class="page_container" data-page="84">

<b>Sử dụng ngoại lệ tự định nghĩa</b>

● Sử dụng ngoại lệ

<small>public class Example {</small>

<small>public void kiemTra(String fName1,String fName2) throws </small>

</div><span class="text_page_counter">Trang 85</span><div class="page_container" data-page="85">

<b>Sử dụng ngoại lệ tự định nghĩa</b>

<small>public class Test {</small>

<small>public static void main(String[] args) {Example ex= new Example(); </small>

</div><span class="text_page_counter">Trang 86</span><div class="page_container" data-page="86">

<b>Cây thừa kế của lớp IOExceptions</b>

</div><span class="text_page_counter">Trang 87</span><div class="page_container" data-page="87">

<b>Vấn đề bắt ngoại lệ</b>

<small>➢Khi xử lý một chuỗi các ngoại lệ cần phải đảm bảo rằng các ngoại lệ lớp conđược xử lý trước các ngoại lệ của lớp cha.</small>

<small>➢Xử lý các trường hợp cụ thể trước khi xử lý các trường hợp tổng quát</small>

</div><span class="text_page_counter">Trang 89</span><div class="page_container" data-page="89">

<b>Q & A </b>

<small>Giảng viên: Tạ Việt PhươngE-mail: </small>

</div>

×