1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình hướng đối tượng: Chương 8 - ĐH Bách Khoa Hà Nội

14 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Bài giảng Lập trình hướng đối tượng: Chương 8 Ngoại lệ và xử lý ngoại lệ với mục tiêu giúp các bạn có thể Giải thích về ngoại lệ là gì và mô tả các lợi ích của việc xử lý ngoại lệ hướng đối tượng; Giải thích được mô hình xử lý ngoại lệ; Sử dụng khối try/catch/finally để bắt và xử lý ngoại lệ trong Java; Hiểu và biết cách sử dụng ủy nhiệm ngoại lệ; Biết cách tạo ra và sử dụng ngoại lệ tự định nghĩa.

9/18/17 Mục tiêu học n Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội n n LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 08 Ngoại lệ xử lý ngoại lệ n n Giải thích ngoại lệ mơ tả lợi ích việc xử lý ngoại lệ hướng đối tượng Giải thích mơ hình xử lý ngoại lệ Sử dụng khối try/catch/finally để bắt xử lý ngoại lệ Java Hiểu biết cách sử dụng ủy nhiệm ngoại lệ Biết cách tạo sử dụng ngoại lệ tự định nghĩa Nội dung Nội dung Ngoại lệ Bắt xử lý ngoại lệ Ủy nhiệm ngoại lệ Tạo ngoại lệ tự định nghĩa Ngoại lệ Bắt xử lý ngoại lệ Ủy nhiệm ngoại lệ Tạo ngoại lệ tự định nghĩa 9/18/17 1.1 Ngoại lệ gì? n n 1.1 Ngoại lệ gì? (2) Exception = Exceptional event Định nghĩa: Ngoại lệ kiện xảy trình thực thi chương trình, phá vỡ luồng bình thường chương trình n n Ngoại lệ lỗi đặc biệt Khi xảy ngoại lệ, khơng xử lý chương trình kết thúc trả lại quyền điều khiển cho hệ điều hành ERROR !! Ví dụ: Ví dụ 1.2 Cách xử lý lỗi truyền thống n Viết mã xử lý nơi phát sinh lỗi n n n n Làm cho chương trình trở nên rối Khơng phải lúc đầy đủ thông tin để xử lý Không thiết phải xử lý int devide(int num, int denom, int *error) { if (denom != 0){ error = 0; return num/denom; } else { error = 1; return 0; } Truyền trạng thái lên mức n n n Thông qua tham số, giá trị trả lại biến tổng thể (flag) Dễ nhầm Vẫn cịn khó hiểu } 9/18/17 Nhược điểm n n Nội dung Khó kiểm soát hết trường hợp n Lỗi số học, lỗi nhớ,… Lập trình viên thường qn khơng xử lý lỗi n Bản chất người n Thiếu kinh nghiệm, cố tình bỏ qua Ngoại lệ Bắt xử lý ngoại lệ Ủy nhiệm ngoại lệ Tạo ngoại lệ tự định nghĩa 10 2.1 Mục đích xử lý ngoại lệ n n 2.1 Mục đích xử lý ngoại lệ (2) Giúp chương trình đáng tin cậy hơn, tránh kết thúc bất thường Tách biệt khối lệnh gây ngoại lệ khối lệnh xử lý ngoại lệ n n ………… IF B IS ZERO GO TO ERROR C = A/B PRINT C GO TO EXIT ERROR: DISPLAY “DIVISION BY ZERO” Khi xảy ngoại lệ, khơng có chế xử lý thích hợp: n n Ví dụ: Vào/ra tệp tin n Khối xử lý lỗi EXIT: END Chương trình bị ngắt ngoại lệ xảy Các tài nguyên khơng giải phóng Lãng phí Nếu ngoại lệ xảy (ví dụ chuyển đổi kiểu khơng đúng) Chương trình kết thúc mà khơng đóng tệp tin lại n 11 n Tệp tin truy cập/hỏng Tài ngun cấp phát khơng giải phóng 12 9/18/17 2.2 Mơ hình xử lý ngoại lệ n 2.2 Mơ hình xử lý ngoại lệ (2) Hướng đối tượng n n n n n Đóng gói điều kiện không mong đợi đối tượng Khi xảy ngoại lệ, đối tượng tương ứng với ngoại lệ tạo chứa thông tin chi tiết ngoại lệ Cung cấp chế hiệu việc xử lý lỗi Tách biệt luồng điều khiển bất thường với luồng bình thường Ngoại lệ cần phải xử lý phương thức sinh ngoại lệ ủy nhiệm cho phương thức gọi đến 13 14 2.3 Xử lý ngoại lệ Java n n 2.3 Xử lý ngoại lệ Java (2) Java có chế xử lý ngoại lệ mạnh Xử lý ngoại lệ Java thực theo mơ hình hướng đối tượng: n n n Các từ khóa n n n Tất ngoại lệ thể lớp kế thừa từ lớp Throwable lớp Các đối tượng có nhiệm vụ chuyển thơng tin ngoại lệ (loại trạng thái chương trình) từ vị trí xảy ngoại lệ đến nơi quản lý/xử lý n n 15 try catch finally throw throws 16 9/18/17 Ví dụ khơng xử lý ngoại lệ 2.3.1 Khối try/catch n Khối try catch: Phân tách đoạn chương trình thơng thường phần xử lý ngoại lệ n n try {…}: Khối lệnh có khả gây ngoại lệ catch() {…}: Bắt xử lý với ngoại lệ try { // Doan ma co the gay ngoai le class NoException { public static void main(String args[]) { String text = args[0]; System.out.println(text); } } } catch (ExceptionType e) { // Xu ly ngoai le n } ExceptionType lớp Throwable 17 Ví dụ có xử lý ngoại lệ 18 Ví dụ chia cho class ArgExceptionDemo { public static void main(String args[]) { try { String text = args[0]; System.out.println(text); } catch(Exception e) { System.out.println(“Hay nhap tham so chay!"); } } } 19 public class ChiaCho0Demo { public static void main(String args[]){ try { int num = calculate(9,0); System.out.println(num); } catch(Exception e) { System.err.println("Co loi xay ra: " + e.toString()); } } static int calculate(int no, int no1){ int num = no / no1; return num; } } 20 9/18/17 a Lớp Throwable 2.3.2 Cây phân cấp ngoại lệ Java n Error lỗi đặc biệt nghiêm trọng, lỗi chương trình khơng thể quản lý Object VD: VirtualMachineError OutOfMemoryError Throwable lớp Exception cung lớp cơcấp sở sở, cho tấtdiện thể giao vàlỗi sựcó thực kiểm thi chosoát hầuđược hết VD: ArithmeticException, ngoại lệ BufferOverflowException Throwable n Một biến kiểu String để lưu thông tin chi tiết ngoại lệ xảy Một số phương thức n n Error Exception n n RuntimeException n new Throwable(String s): Tạo ngoại lệ với thông tin ngoại lệ s String getMessage(): Lấy thông tin ngoại lệ String getString(): Mô tả ngắn gọn ngoại lệ void printStackTrace(): In tất thông tin liên quan đến ngoại lệ (tên, loại, vị trí ) … 21 22 b Lớp Error public class StckExceptionDemo { public static void main(String args[]){ try { int num = calculate(9,0); System.out.println(num); } catch(Exception e) { System.err.println(“Co loi xay :" + e.getMessage()); e.printStackTrace(); } } static int calculate(int no, int no1) { int num = no / no1; return num; } } n n n n Gồm ngoại lệ nghiêm trọng khơng thể kiểm tra (unchecked exception) xảy nhiều phần chương trình Cịn gọi ngoại lệ phục hồi (un-recoverable exception) Không cần kiểm tra mã nguồn Java bạn Các lớp con: n n n VirtualMachineError: InternalError, OutOfMemoryError, StackOverflowError, UnknownError ThreadDeath LinkageError: n IncompatibleClassChangeError n n 23 n … AbstractMethodError, InstantiationError, NoSuchFieldError, NoSuchMethodError… … 24 9/18/17 c Lớp Exception n n n Một số lớp Exception Chứa loại ngoại lệ nên/phải bắt xử lý ủy nhiệm Người dùng tạo ngoại lệ riêng cách kế thừa từ Exception RuntimeException “tung” q trình JVM thực n n n ClassNotFoundException, SQLException java.io.IOException: n RuntimeException: n n n n n FileNotFoundException, EOFException… NullPointerException, BufferOverflowException ClassCastException, ArithmeticException IndexOutOfBoundsException: n n Không bắt buộc phải bắt ngoại lệ dù xảy lỗi Khơng nên viết ngoại lệ riêng kế thừa từ lớp ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException… n IllegalArgumentException: n … n NumberFormatException, InvalidParameterException… 25 26 Ví dụ IOException 2.3.3 Khối try – catch lồng import java.io.InputStreamReader; import java.io.IOException; public class HelloWorld{ public static void main(String[] args) { n InputStreamReader isr = new InputStreamReader(System.in); try { n System.out.print("Nhap vao ky tu: "); char c = (char) isr.read(); System.out.println("Ky tu vua nhap: " + c); }catch(IOException ioe) { ioe.printStackTrace(); try { // Doan ma co the gay IOException try { // Doan ma co the gay NumberFormatException } catch (NumberFormatException e1) { // Xu ly loi sai dinh dang so } } catch (IOException e2) { // Xu ly loi vao } } } } Những phần nhỏ khối mã sinh lỗi, tồn khối lại sinh lỗi khác Cần có xử lý ngoại lệ lồng Khi khối try lồng nhau, khối try bên thực trước 27 28 9/18/17 2.3.4 Nhiều khối catch n Một đoạn mã gây nhiều ngoại lệ Sử dụng nhiều khối catch try { class MultipleCatch1 { public static void main(String args[]) { try { String num = args[0]; int numValue = Integer.parseInt(num); System.out.println("Dien tich hv la: " + numValue * numValue); } catch(Exception e1) { System.out.println("Hay nhap canh cua hv!"); } catch(NumberFormatException e2){ System.out.println("Not a number!"); } } D:\exception java.lang.NumberFormatException has already been } n // Doan ma co the gay nhieu ngoai le } catch // Xu } catch // Xu } n ExceptionType1 phải lớp ngang hàng v ới ExceptionType2 (trong phân cấp kế thừa) (ExceptionType1 e1) { ly ngoai le (ExceptionType2 e2) { ly ngoai le ExceptionType1 phải lớp ngang hàng với ExceptionType2 (trong phân cấp kế thừa) Lỗi caught 29 n ExceptionType1 phải lớp ngang hàng với ExceptionType2 (trong phân cấ p kế thừa) class MultipleCatch1 { public static void main(String args[]) { try { String num = args[0]; int numValue = Integer.parseInt(num); System.out.println("Dien tich hv la: " + numValue * numValue); } catch(ArrayIndexOutOfBoundsException e1) { System.out.println(“Hay nhap canh cua hv!"); } catch(NumberFormatException e2){ System.out.println(“Hay nhap so!"); } } 31 } 30 class MultiCatch2 { public static void main( String args[]) { try { // format a number // read a file // something else } catch(IOException e) { System.out.println("I/O error "+e.getMessage(); } catch(NumberFormatException e) { System.out.println("Bad data "+e.getMessage(); } catch(Throwable e) { // catch all System.out.println("error: " + e.getMessage();} } } } 32 9/18/17 public void openFile(){ try { // constructor may throw FileNotFoundException FileReader reader = new FileReader("someFile"); int i=0; while(i != -1) { //reader.read() may throw IOException i = reader.read(); System.out.println((char) i ); } reader.close(); System.out.println(" - File End -"); } catch (FileNotFoundException e) { //do something clever with the exception } catch (IOException e) { //do something clever with the exception } } 2.3.5 Khối finally n n n n Đóng file, đóng socket, connection Giải phóng tài nguyên (nếu cần) Chắc chắn thực dù ngoại lệ có xảy hay không No exception finally try block catch block Exception 33 Cú pháp try catch finally try { // Khoi lenh co the sinh ngoai le } catch(ExceptionType e) { // Bat va xu ly ngoai le } finally { /* Thuc hien cac cong viec can thiet du ngoai le co xay hay khong */ } n Đảm bảo thực tất công việc cần thiết có ngoại lệ xảy Nếu có khối try bắt buộc phải có khối catch khối finally hai 35 finally 34 class StrExceptionDemo { static String str; public static void main(String s[]) { try { System.out.println(“Truoc ngoai le"); staticLengthmethod(); System.out.println(“Sau ngoai le"); } catch(NullPointerException ne) { System.out.println(“Da xay loi"); } finally { System.out.println(“Trong finally"); } } static void staticLengthmethod() { System.out.println(str.length()); } } 36 9/18/17 Nội dung public void openFile(){ try { // constructor may throw FileNotFoundException FileReader reader = new FileReader("someFile"); int i=0; while(i != -1) { //reader.read() may throw IOException i = reader.read(); System.out.println((char) i ); } } catch (FileNotFoundException e) { //do something clever with the exception } catch (IOException e) { //do something clever with the exception } finally { reader.close(); System.out.println(" - File End -"); } } Ngoại lệ Bắt xử lý ngoại lệ Ủy nhiệm ngoại lệ Tạo ngoại lệ tự định nghĩa 37 38 3.1 Ủy nhiệm ngoại lệ Hai cách làm việc với ngoại lệ n Xử lý n n n Sử dụng khối try catch (finally cần) n Ủy nhiệm cho vị trí gọi nó: n n Phương thức ủy nhiệm ngoại lệ cho vị trí gọi bằ ng cách: Nếu không muốn xử lý Sử dụng throw throws n n Sử dụng throws ExceptionType phần khai báo phương thức để báo hiệu cho vị trí gọi biết phát sinh ngoại l ệ ExceptionType Sử dụng throw để tung ngoại lệ kiểu ExceptionType thân phương thức cần Ví dụ public void myMethod(int param) throws Exception{ if (param < 10) { throw new Exception("Too low!"); } //Blah, Blah, Blah } 39 40 10 9/18/17 3.1 Ủy nhiệm ngoại lệ (2) n 3.1 Ủy nhiệm ngoại lệ (3) Nếu phương thức có chứa câu lệnh tung ngo ại lệ (throw) phần khai báo phương thức phải khai báo có tung ngoại lệ lớp cha ngoại lệ public void myMethod(int param) { if (param < 10) { throw new Exception("Too low!"); } //Blah, Blah, Blah } unreported exception java.lang.Exception; must be caught or declared to be thrown n n Phương thức không cần phải khai báo tung RuntimeException ngoại lệ mặc định ủy nhiệm cho JVM Ví dụ class Test { public void myMethod(int param) { if (param < 10) { throw new RuntimeException("Too low!"); } //Blah, Blah, Blah } } n Không lỗi 41 3.1 Ủy nhiệm ngoại lệ (3) n Tại vị trí gọi phương thức có ủy nhiệm ngoại lệ (trừ RuntimeException): n n Hoặc phương thức chứa vị trí phải ủy nhiệ m tiếp cho vị trí gọi Hoặc ví trí gọi phải bắt ngoại lệ ủy nhiệm (hoặc lớp cha) xử lý try catch (finally cần) 42 Run public class DelegateExceptionDemo { public static void main(String args[]){ int num = calculate(9,3); System.out.println(“Lan 1: ” + num); num = calculate(9,0); System.out.println(“Lan 2: ” + num); } static int calculate(int no, int no1) throws ArithmeticException { if (no1 == 0) throw new ArithmeticException("Khong the chia cho 0!"); int num = no / no1; return num; } } 43 44 11 9/18/17 public class DelegateExceptionDemo { public static void main(String args[]){ int num = calculate(9,3); System.out.println(“Lan 1: ” + num); num = calculate(9,0); System.out.println(“Lan 2: ” + num); } static int calculate(int no, int no1) throws Exception { if (no1 == 0) throw new ArithmeticException("Khong the chia cho 0!"); int num = no / no1; return num; } } Compile public class DelegateExceptionDemo { public static void main(String args[]){ try { int num = calculate(9,3); System.out.println(“Lan 1: ” + num); num = calculate(9,0); System.out.println(“Lan 2: ” + num); } catch(Exception e) { System.out.println(e.getMessage()); } } static int calculate(int no, int no1) throws ArithmeticException { if (no1 == 0) throw new ArithmeticException("Khong the chia cho 0!"); int num = no / no1; return num; } 46 } G:\Java Example\DelegateExceptionDemo.java:3: unreported exception java.lang.Exception; must be caught or declared to be thrown int num = calculate(9,3); ^ G:\Java Example\DelegateExceptionDemo.java:5: unreported exception java.lang.Exception; must be caught or declared to be thrown 45 num = calculate(9,0); 3.1 Ủy nhiệm ngoại lệ (4) n 3.2 Lan truyền ngoại lệ Một phương thức ủy nhiệm nhiều ngoại lệ public void myMethod(int tuoi, String ten) throws ArithmeticException, NullPointerException{ if (tuoi < 18) { throw new ArithmeticException(“Chua du tuoi!"); } if (ten == null) { throw new NullPointerException(“Thieu ten!"); } //Blah, Blah, Blah } n Tình huống: n n 47 Giả sử main() gọi phương thức A(), A() gọi B(), B() gọi C() Khi ngăn xếp phương thức tạo Giả sử C() xảy ngoại lệ 48 12 9/18/17 3.2 Lan truyền ngoại lệ (2) C() B() A() main() n n n 3.3 Kế thừa ủy nhiệm ngoại lệ C() tung ngoại lệ n B() A() main() Nếu C() gặp lỗi tung ngoại lệ C() lại khơng xử lý ngoại lệ này, cịn nơi xử lý nơi mà C() gọi, phương thức B() n Nếu B() khơng xử lý phải xử lý ngoại lệ A()… Quá trình gọi lan truyền ngoại lệ Nếu đến main() không xử lý ngoại lệ tung từ C() chương trình phải dừng lại Khi override phương thức lớp cha, phương thức lớp không phép tung ngoại lệ Phương thức ghi đè lớp phép tung ngoại lệ giống lớp tập ngoại lệ đượ c tung lớp cha 49 50 3.3 Kế thừa ủy nhiệm ngoại lệ (2) class Disk { void readFile() throws EOFException {} } class FloppyDisk extends Disk { void readFile() throws IOException {} // ERROR! } 3.4 Ưu điểm ủy nhiệm ngoại lệ n Dễ sử dụng n n n n n class Disk { void readFile() throws IOException {} } class FloppyDisk extends Disk { void readFile() throws EOFException {} //OK } n n 51 Làm chương trình dễ đọc an toàn Dễ dàng chuyển điều khiển đến nơi có khả xử lý ngoại lệ Có thể ném nhiều loại ngoại lệ Tách xử lý ngoại lệ khỏi đoạn mã thơng thường Khơng bỏ sót ngoại lệ (ném tự động) Gom nhóm phân loại ngoại lệ KL: Làm chương trình dễ đọc an toàn 52 52 13 9/18/17 Nội dung 4 Tạo ngoại lệ tự định nghĩa Ngoại lệ Bắt xử lý ngoại lệ Ủy nhiệm ngoại lệ Tạo ngoại lệ tự định nghĩa n Các ngoại lệ hệ thống xây dựng không đủ để kiểm sốt tất lỗi Cần phải có lớp ngoại lệ người dùng định nghĩa n n Kế thừa từ lớp Exception lớp Có tất phương thức lớp Throwable public class MyException extends Exception { public MyException(String msg) { super(msg); } public MyException(String msg, Throwable cause){ super(msg, cause); } 53 54 } Sử dụng ngoại lệ người dùng định nghĩa Sử dụng ngoại lệ người dùng định nghĩa Khai báo khả tung ngoại lệ n public class FileExample { public void copyFile(String fName1,String fName2) throws MyException { if (fName1.equals(fName2)) throw new MyException("File trung ten"); // Copy file System.out.println("Copy completed"); } } Tung ngoại lệ 55 Bắt xử lý ngoại lệ public class Test { public static void main(String[] args) { FileExample obj = new FileExample(); try { String a = args[0]; String b = args[1]; obj.copyFile(a,b); } catch (MyException e1) { System.out.println(e1.getMessage()); } catch(Exception e2) { System.out.println(e2.toString()); } } } 56 14 ...9/ 18/ 17 1.1 Ngoại lệ gì? n n 1.1 Ngoại lệ gì? (2) Exception = Exceptional event Định nghĩa: Ngoại lệ kiện xảy trình thực thi chương trình, phá vỡ luồng bình thường chương trình n n Ngoại... theo mơ hình hướng đối tượng: n n n Các từ khóa n n n Tất ngoại lệ thể lớp kế thừa từ lớp Throwable lớp Các đối tượng có nhiệm vụ chuyển thơng tin ngoại lệ (loại trạng thái chương trình) từ vị... khơng giải phóng 12 9/ 18/ 17 2.2 Mơ hình xử lý ngoại lệ n 2.2 Mơ hình xử lý ngoại lệ (2) Hướng đối tượng n n n n n Đóng gói điều kiện không mong đợi đối tượng Khi xảy ngoại lệ, đối tượng tương ứng

Ngày đăng: 20/06/2021, 09:07

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN