Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 233 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
233
Dung lượng
1,16 MB
Nội dung
TRƯỜNG ðẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP HỌC PHẦN: LẬP TRÌNH HƯỚNG ðỐI TƯỢNG VỚI C# Trình ñộ ñào tạo: ðại học Hệ ñào tạo: Chính quy Bài tập Lập lrình hướng ñối tượng với C# Trang CHƯƠNG I: LỚP VÀ ðỐI TƯỢNG Mục tiêu: Sau tìm hiểu xong chương người học thực ñược nội dung sau: • Xác ñịnh lớp toán, phương thức liệu lớp • Khai báo ñược lớp • Biết cách vận dụng từ khoá truy cập • Khai báo ñối tượng, mảng ñối tượng sử dụng • Sử dụng thuộc tính, thủ thuộc tính • Xây dựng phương thiết lập, chép • Sử dụng thành viên tĩnh • Nạp chồng phương thức • ðóng gói liệu thông qua thuộc tính • Hàm hủy bỏ,cơ chế thu gom rác A TÓM TẮT LÝ THUYẾT Xác ñịnh lớp toán - Lập trình hướng ñối tượng ñặt trọng tâm vào ñối tượng toán, lớp trừu tượng ñối tượng - Bước ñầu tiên ñể giải toán phương pháp hướng ñối tượng: Xác ñịnh lớp toán: + Gạch chân danh từ toán(những ñối tượng) + Xác ñịnh ñặc ñiểm phương thức ñi kèm, từ ñó ñưa ñịnh xây dựng lớp Ví dụ: Xây dựng chương trình nhập vào danh sách học sinh biết học sinh gồm thông tin: Họ tên,ngày sinh, lớp, ñiểm thi.Sau ñó cho biết học sinh có ñiểm thi lớn Xác ñịnh lớp toán: - Những danh từ: Học sinh, danh sách học sinh, lớp, họ tên, ngày sinh , ñiểm thi - Phân tích thuộc tính phương thức + Học sinh: Thuộc tính: Bài tập Lập lrình hướng ñối tượng với C# Trang Họ tên Ngày sinh Lớp ðiểm thi Phương thức: Nhập thông tin học sinh Hiển thị thông tin học sinh + Danh sách học sinh Thuộc tính: Một mảng ñối tượng học sinh Phương thức: Nhập danh sách học sinh Hiển thị danh sách học sinh Hiển thị học sinh có ñiểm thi lớn + Lớp, họ tên, ngày sinh, ñiểm: Trong phạm vi toán, danh từ thuộc tính phương thức, thuộc tính học sinh, mô tả học sinh nên ta không xây dựng lớp Khai báo lớp - Một lớp bao gồm có thuộc tính phương thức ðể khai báo lớp ta sử dụng từ khóa class với cấu trúc sau ñây: [Bổ từ truy cập][Thuộc tính] class { // Khai báo thuộc tính lớp // Khai báo phương thức lớp } - [Bổ từ truy cập]: gồm có từ khóa sau ñây (sẽ trình bày chi tiết phần sau): public, private, internal, protected, internal protected.Bổ từ truy cập có không - [Thuộc tính lớp]: Thuộc tính ñây : static - Trong C#, cho phép khai báo class lồng Thông thường khai báo lớp lồng ứng dụng có quy mô lớn, class lồng cho phép sử dụng nội class chứa nó có tầm vực public - Cấu trúc khai báo class lồng sau: Bài tập Lập lrình hướng ñối tượng với C# Trang public class Class1 { // khai báo thuộc tính // khai báo phương thức public class Class2 { // khai báo thành phần liệu // khai báo phương thức } } } Sử dụng ñối tượng lớp - ðể sử dụng lớp ta phải khai báo ñối tượng lớp ñó Khi ñối tượng lớp ñược tạo có ñầy ñủ thuộc tính, phương thức lớp sử dụng thuộc tính phương thức lớp Các thành phần lớp ñuợc sử dụng lớp ðể khai báo ñối tượng lớp ta dùng từ khóa new khai báo theo cấu trúc sau: = new ([các giá trị khởi tạo có]) - ðể truy nhập ñến phương thức ta thông qua tên biến ñối tượng toán tử chấm “.” ([danh sách ñối số có]) - ðối với lớp lồng nhau, ñể truy cập ñến thuộc tính phương thức class lồng khai báo cần lớp chứa ñựng Muốn sử dụng biến lớp chứa biến lớp dùng ñể chứa phải khai báo static phải khai báo ñối tượng chứa - Ví dụ1: Bạn ñã khai báo lớp diem với ñầy ñủ thuộc tính phương thức (giả sử có phương thức hien()), bạn muốn tạo ñối tuợng tên A lớp sử dụng phương thức ñiểm A phải khai báo A la biến ñối tượng sau: diem A = new diem (); Bài tập Lập lrình hướng ñối tượng với C# Trang A.hien(); - Ví dụ 2: ðịnh nghĩa lớp pheptoan lớp có chứa lớp tinhhieu, muốn sử dụng ñối tượng lớp tinhhieu bắt buộc bạn phải khai báo rõ lớp chứa ñây lớp pheptoan sau: pheptoan.tinhhieu = new pheptoan.tinhhieu(); sau ñó việc truy xuất ñến phương thức lớp tiến hành bình thường lớp không sử dụng ñược phương thức lớp chứa sử dụng ñược thành phần liệu tĩnh lớp chứa mà Từ khóa this - Từ khóa this dùng ñể tham chiếu ñến thân ñối tượng ñó Con trỏ this trỏ ẩn nằm bên phương thức lớp thân chúng tham chiếu ñến hàm biến khác ñối tượng Con trỏ this C# tương tự this C++ - Có ba cách ñể sử dụng trỏ this + Sử dụng This ñể phân biệt rõ thành viên thể tham số phương thức ta sử dụng biến thể tên tham số phương thức trùng Tuy nhiên muốn có ñựơc rõ ràng, minh bạch dùng tên biến thành viên tên tham số khác từ ñầu Ví dụ: Trong lớp pheptoan có biến thành viên int y, int y phương thức public int tong(int x, int y) { this.x=x; this.y=y; } - Biến x,y ñược tham chiếu từ khóa this (this.x; this.y) truy nhập ñến tham số phương thức tong(), hai biến x y sau toán tử gán lại biến thành viên lớp - Sử dụng this ñể trao ñối tượng hiên hành thông số cho hàm hành khác Khi ñó ñối tượng ñương nhiên trở thành tham số phương thức - Ví dụ: với hai lớp Class1 có chứa phương thức thietlapdoituong(), lớp Class2 có chứa phương thức saochepdoituong() muốn truyền tham số cho ñối tượng lớp Class1 sử dụng trỏ this sau: public void saochepdoituong (Class1 a) { Bài tập Lập lrình hướng ñối tượng với C# Trang a.thietlapdoituong(this); } - Trong ñó a ñối tượng lớp Class1 mà ta muốn trao ñổi tham số ñầu vào phương thức lớp thứ hai - Sử dụng this ñể thao tác với indexer thường ñược sử dụng dãy, indexer tập hợp Sử dụng từ khóa mức ñộ truy cập - Thuộc tính truy cập ñịnh khả phương thức lớp bao gồm việc phương thức lớp khác nhìn thấy sử dụng biến thành viên hay phương thức bên lớp ñó - Giới hạn truy cập thuộc tính : ðể truy cập ñến thuộc tính( Biến thành viên) ñối tượng ta sử dụng từ khóa sau: + public : Không có giới hạn, truy xuất nơi thân lớp khai báo bên hay nội khối assembly + private: riêng tư có phạm vi hoạt ñộng lớp mà khai báo Các phương thức bên lớp truy xuất ñến + protected: Các thành viên lớp ñược khai báo protected có phương thức bên lớp lớp dẫn xuất từ lớp ñó truy cập ñến + internal: Các phương thức, biến thành viên ñược khai báo từ khóa internal ñược truy cập tất phương thức lớp khối hợp ngữ assembly với lớp ñó + protected internal: Các biến thành viên ñược khai báo từ khóa lớp A ñược truy xuất phương thức thuộc lớp A phương thức lớp dẫn xuất từ lớp A lớp khối hợp ngữ với lớp A - Khối hợp ngữ Assembly ñược hiểu khối chia xẻ dùng lại CLR Khối hợp ngữ tập hợp tập tin vật lý ñược lưu trữ thư mục bao gồm tập tin tài nguyên - Các thuộc tính truy cập ñược áp dụng cho thuộc tính, phương thức lớp thân lớp Khi ñịnh nghĩa thuộc tính truy cập lớp internal, protected ñược ñịnh nghĩa lớp lồng mà Bộ khởi dựng( constructor) - Một ñối tượng lớp ñược khai báo ñều ñược khởi tạo thành phần cho thân lớp có sẵn phương thức làm nhiệm vụ khởi tạo giá trị mặc ñịnh thành phần liệu.Và bên thân hàm khởi tạo trống rỗng Bài tập Lập lrình hướng ñối tượng với C# Trang - Các giá trị mặc ñịnh của cá kiểu liệu là: Kiểu liệu Giá trị mặc ñịnh int,long, byte bool false char ‘\0’(null) enum reference null - Nếu muốn hàm thiết lập tạo khởi tạo giá trị khác với giá trị mặc ñịnh ta phải tự ñịnh nghĩa Tác dụng hàm thiết lập việc khởi tạo giá trị cho biến ñối tượng - Constructor ñược khai báo phương thức trùng tên với tên lớp giá trị trở theo cấu trúc sau: class Classname { // constructor lớp có tên tenClass public Classname ([các tham số có]) { //code of constructor } } - Trong lớp có nhiều hàm thiết lập.Có hàm thiết lập không tham số, tham số hay nhiều tham số Khi ñó, việc gọi hàm thiết lập cần phải có tham số kèm theo cho phù hợp với hàm ñã khai báo Khi bạn gọi hàm thiết lập trình biên dịch tự ñộng tìm kiếm tổng số hàm thiết lập ñược ñịnh nghĩa tìm hàm thiết lập phù hợp tương ứng ñể thực thi Nếu không tìm thấy hàm phù hợp phát sinh lỗi - Ví dụ lớp diem bạn ñịnh nghĩa hàm thiết lập không tham số hàm thiết lập hai tham số mà chương trình bạn lại gọi hàm thiết lập truyền cho tham số trình biên dịch thông báo lỗi hàm thiết lập thích hợp Bài tập Lập lrình hướng ñối tượng với C# Trang Hàm chép (constructor) - Giả sử chương trình ñã có ñối tượng với thành phần liệu ñã khởi tạo, bạn mong muốn tạo ñối tượng giống hệt ñối tượng cũ nghĩ tới việc sử dụng constructor - Constructor ñược sử dụng nhằm mục ñích gì? Bộ chép ñược sử dụng với hai mục ñích tạo ñối tượng từ ñối tượng ñã có ñược dùng phương thức với mục ñích chép nội dung ñối tượng ñã có thay cho nội dung cũ - Với tư cách thiết lập, constructor có nhiệm vụ hàm thiết lập chép C++ Trong ñó trình tạo ñối tượng constructor thi hành hai hoạt ñộng ñó việc cấp phát vùng nhớ cho ñối tượng sau ñó chép toàn cách y hệt thành phần liệu từ ñối tượng muốn chép vào vùng nhớ vừa ñược cấp phát Do ñó chúng giống mặt hình thức nột dung hai thể lớp hoàn toàn khác nhau, sử dụng ñộc lập với - Trong C# không cung cấp hàm thiết lâp chép C++ muốn sử dụng phải tự khai báo Một hàm thiết lập chép có tên trùng với tên lớp ñươc khai báo theo cấu trúc khai báo constructor sau: public tenlop ( ) { gt1 = doituong1.gt1; gt2 = doituong1.gt2; } Ở ñó doituong1 ñối tượng lớp ñã ñược khai báo; gt1,gt2 thành phần liệu ñối tượng ñã khai báo ñó Khi ấy, hai câu lệnh gt1 = doituong1.gt1 gt2 = doituong1.gt2 việc chép toàn liệu ñối tượng tên doituong1 ñưa vào vùng nhớ ñối tượng Khác với mục ñích “thiết lập chép”, constructor ñược dùng với mục ñích phương thức chép giá trị ñối tượng cho ñối tượng khác, ñó trình thi hành phương thức ñó xảy thao tác thao tác chép giá trị ñối tượng ñược chép thay cho liệu cũ ñối tượng mà vùng nhớ ñối tượng bị chép ñã ñược cấp phát từ khai báo biến ñối tượng ñó Vì ñơn chép giá trị nên việc ñịnh nghĩa constructor kiểu không thiết phải ñịnh nghĩa trùng tên với lớp mà cần ñịnh nghĩa phương thức thông thường (nghĩa không thiết phải có giá trị trả ñối tượng với mục ñích sử dụng trên) Bài tập Lập lrình hướng ñối tượng với C# Trang Cấu trúc khai báo ñơn giản sau: public void saochep ( ) { this.gt1 = doituong1.gt1; this.gt2 = doituong1.gt2; } - Việc sử dụng hai constructor không giống Nếu khởi dựng dùng với mục ñích thiết lập chép sử dụng giống với khai báo biến ñối tượng có sử dụng từ khóa new: ví dụ diem a=new diem (b) ñể tạo biến ñối tượng a từ ñối tượng b ñã có Còn sử dụng constructor với mục ñích chép ta thi hành phương thức ñối tượng ñã khai báo khởi tạo trước ñó Chẳng hạn ñiểm a(5,9) muốn tạo thành phần liệu a giống ñiểm b(-34,7) gọi constructor sau: a.saochep(b) mà từ khóa new hết (saochep la tên constructor) Hàm hủy bỏ(destructor) - Tác dụng hàm lại ngược lại so với constructor Nó dùng ñể giải phóng vùng nhớ ñã cấp phát cho ñối tượng mà ñối tuợng không ñược tham chiếu ñến Hàm hủy bỏ hàm giá trị trả có tên trùng tên với class có thêm kí tự “~”ở trước Muốn khai báo destructor khai báo với cú pháp sau: public Classname { public Classname() { // code of constructor // công việc cần thực } public ~ Classname() { // code of descontructor Bài tập Lập lrình hướng ñối tượng với C# Trang 10 // công việc cần thực } } - Tuy nhiên, ngôn ngữ C# cú pháp khai báo shortcut liên kết ñến phương thức kết thúc Finalize ñược kết với lớp sở, viết: ~ Classname() { // Thực số công việc } Và viết : Class1.Finalize() { // Thực số công việc base.Finalize(); } Thì hai cách viết ñược C# hiểu - Trong C# có ñối tượng hỗ trợ cho công việc dọn rác ñối tượng không ñược tham chiếu ñến ñối tượng GC (garbage collector) ðối tượng thực công việc rọn rác qua bước sau: + Tìm kiếm ñối tượng không ñược tham chiếu + Cố gắng hoạt ñộng ñể giải phóng ñối tượng không ñược tham chiếu + Thi hành phương thức finalize() ñể hủy ñối tượng: - Ngoài ra, chế hủy bỏ C# có phương thức Dispose phương thức ñối lập hoàn toàn so với phương thức Finalize() ñối tượng GC - Phương thức Dispose cho phép chương trình thực công việc dọn dẹp hay giải phóng tài nguyên mong muốn mà chờ cho ñến phương thức Finalize() ñược gọi Khi ñó ta không ñược phép dùng phương thức Finalize() ñối tượng mà thay vào ñó ta gọi phương thức tĩnh lớp GC (garbage collector) Bài tập Lập lrình hướng ñối tượng với C# Trang 219 CHƯƠNG VI: XỬ LÝ NGOẠI LỆ Mục ñích: Sau nghiên cứu chương người học nắm ñược nội dung sau: • • • • • • • Giải thích ñược lại phải xử lý ngoại lệ ðón bắt ñược lỗi với try catch Dọn dẹp ngoại lệ với try finally Kiểm soát ñược tất ngoại lệ với try – catch – finally Thực thi ñược nhiều khối catch ðón bắt ngoại lệ người sử dụng ñịnh nghĩa Xây dựng ñược lớp ngoại lệ cho ứng dụng A TÓM TẮT LÝ THUYẾT Giới thiệu, nguyên nhân, mục ñích xử lí ngoại lệ 1.1 Giới thiệu ngoại lệ Ngoại lệ kiểu lỗi ñặc biệt Xảy thời gian thực thi ñoạn lệnh Nếu ñiều kiện gây ngoại lệ mà không ñược quan tâm viêc thi hành chương trình bị ngưng ñột ngột treo 1.2 Nguyên nhân: Do phía hành ñộng người sử dụng(có thê ñoán trước ñược ngăn ngừa) Xuất trạng thái thiếu nhớ(không thể ngăn ngừa ngoại lệ này) Do người lập trình: lỗi cú pháp, lỗi logic thuật toán 1.3 Mục ñích xử lí ngoại lệ Giảm thiểu việc kết thúc bất thường hệ thống chương trình Phát sinh bắt giữ ngoại lệ - Khi ngoại lệ xảy ra, ñối tượng tương ứng với ngoại lệ ñó ñược tạo - ðối tượng sau ñó ñược truyền tới phương thức nơi ngoại lệ xảy Từ khóa ñể xử lí ngoại lệ: throw //phát sinh tín hiệu không bình thường try{} // mã cho việc thực thi bình thường catch{} // xử lí ngoại lệ finally{} // thực ñến Bài tập Lập lrình hướng ñối tượng với C# Trang 220 Cấu trúc throw try/catch/finally: try // khối try { câu lệnh; throw } catch[] // khối catch { câu lệnh xử lí xuất ngoại lệ 1; } catch[] // khối catch {các câu lệnh xử lí xuất ngoại lệ n; } finally // khối finally { câu lệnh thực ñến cùng; } 2.1 Câu lệnh throw Throw khai báo cho trình biên dịch biết phương thức gây ngoại lệ lúc thi hành Throw câu lệnh tạm thời bỏ qua ngoại lệ Thông thường ñối tượng ngoại lệ ñược tạo câu lệnh throw ñể sau ñó bị tóm lại xử lí câu lệnh catch Cú pháp Câu lệnh có dạng sau: throw new Biểu thức tham chiếu ñối tượng ngoại lệ biểu thức xác ñịnh ñối tượng lớp throw VD: throw new System.Exception(); throw new System.ArithmeticException(); Bài tập Lập lrình hướng ñối tượng với C# Trang 221 Hoạt ñộng throw Khi phát sinh ngoại lệ thực bình thường chương trình bị treo lại ñể ñi tìm khối xử lí tương ứng ñể xử lí ngoại lệ ñó Nếu khối xử lí ñó không nằm phương thức thời tìm phương thức gọi ñến tìm thấy Nếu CLR trả lớp Main() mà không tìm thấy trình xử lí ngoại lệ kết thúc chương trình ngoại lệ ñó ñược xử lí theo chế xử lí ngoại lệ mặc ñịnh hệ thống, việc ñơn giản xuất thông ñiệp lỗi - Ví dụ câu lệnh throw using System; namespace Programming_CSharp { public class Test { public static void Main( ) { Console.WriteLine("Enter Main "); Test t = new Test( ); t.Func1( ); Console.WriteLine("Exit Main "); } public void Func1( ) { Console.WriteLine("Enter Func1 "); Func2( ); Console.WriteLine("Exit Func1 "); } public void Func2( ) { Console.WriteLine("Enter Func2 "); throw new System.Exception( ); Console.WriteLine("Exit Func2 "); } } } Kết quả: Enter Main Enter Func1 Enter Func2 Bài tập Lập lrình hướng ñối tượng với C# Trang 222 Exception occurred: System.Exception: An exception of type System.Exception was thrown at Programming_CSharp.Test.Func2( ) in exceptions01.cs:line 26 at Programming_CSharp.Test.Func1( ) in exceptions01.cs:line 20 at Programming_CSharp.Test.Main( ) in exceptions01.cs:line 12 Ví dụ in thông báo hình console bắt ñầu kết thúc hàm - Hàm Main() tạo ñối tượng kiểu Test gọi hàm Func1() Sau in thông báo Enter Func1, hàm Func1() gọi hàm Func2() Func2() in câu thông báo bắt ñầu ném biệt lệ - Chương trình tạm ngưng thực thi CLR tìm trình giải biệt lệ hàm Func2() Không có, vùng nhớ stack ñược unwind cho ñến hàm Func1() Vẫn không có, vùng nhớ stack tiếp tục ñược unwind cho ñến hàm Main() Vẫn không có, trình giải biệt lệ mặc ñịnh ñược gọi Thông báo lỗi hiển thị hình 2.2 Câu lệnh try/catch • Câu lệnh try Khối try xác ñịnh ngữ cảnh cần xử lí kết thúc thực khối lệnh Sự kết thúc thực khối lệnh xuất khi: Gặp phải ngoại lệ Hoặc thực thành công khối try(không gặp ngoại lệ) *Chú ý Có thể có nhiều khối try lồng sử dụng “try lồng nhau”, khối try sau ñược thực ñầu tiên - Bất kì ngoại lệ bị chặn khối lệnh try bị bắt giữ khối lệnh catch sau ñó Ví dụ try lồng static void Main(string[] args) { int a, b; float c; Console.Write("nhap a: "); a = int.Parse(Console.ReadLine()); Console.Write("nhap b: "); Bài tập Lập lrình hướng ñối tượng với C# Trang 223 b = int.Parse(Console.ReadLine()); try { Console.WriteLine("xin chao"); try { Console.WriteLine("xin chao1"); { throw new System.Exception(); } } catch { Console.WriteLine("ngoai le da bi bat giu"); } c = (float)a / b; if (b == 0) // neu b=0 thi xuat hien ngoai le { throw new DivideByZeroException(); // chia cho } Console.WriteLine("ket qua: {0}", c); // khong gap ngoai le thi in ket qua } catch // ngoai le bi bat va xu li; { Console.WriteLine("loi chia cho 0"); } • Câu lệnh catch Khối catch lối khối try gặp phải ngoại lệ chuyển ñiều khiển chương trình ñến khối catch Khối catch ñược sử dụng ñể xử lí ngoại lệ Khi khối catch ñược thực khối catch lại bị bỏ qua Bài tập Lập lrình hướng ñối tượng với C# Trang 224 Khối catch xử lí lỗi sau ñó chuyển việc thực thi chương trình ñến lệnh sau catch Các khối chứa nhiều catch xử lí ngoại lệ khác cách ñộc lâp Có hai kiểu dùng khối catch: 1.Khối catch tổng quát (bắt giữ tất ngoại lệ): catch { // câu lệnh thực ngoại lệ; } 2.Khối catch xác ñịnh VD catch(System.ArithmeticException) // bắt giữ lỗi liên quan ñến phép toán Ví dụ nhiều câu lệnh catch static void Main(string[] args) { int a, b; float c; Console.WriteLine("nhap a: "); a = int.Parse(Console.ReadLine()); Console.WriteLine("nhap b: "); b = int.Parse(Console.ReadLine()); try { c = (float)a/b; if (a == 0) {throw new ArithmeticException(); } if (b == 0) {throw new DivideByZeroException(); } Console.WriteLine("ket qua la {0}",c); } catch (System.DivideByZeroException) Bài tập Lập lrình hướng ñối tượng với C# Trang 225 {Console.WriteLine("loi chia cho 0"); } catch (System.ArithmeticException) { Console.WriteLine("loi phep toan"); } 2.3 Câu lệnh finally ðảm bảo ñược thực ngoại lệ có xảy hay không Là tùy chọn không bắt buộc ðặt sau khối catch Ví dụ khối try/catch/finally static void Main(string[] args) { int a, b; float c; Console.Write("nhap a: "); a = int.Parse(Console.ReadLine()); Console.WriteLine("nhap b: "); b = int.Parse(Console.ReadLine()); try { c = (float)a / b; //c la ket qua cua phep chia a va b if (b == 0) { throw new System.Exception(); } Console.WriteLine("ket qua: {0}", c); } catch // ngoai le bi bat va xu li; {Console.WriteLine("ngoai le da bi bat giu va xu li"); } finally Bài tập Lập lrình hướng ñối tượng với C# Trang 226 { Console.WriteLine("ket thuc bai toan"); } Những ñối tượng ngoại lệ Tìm hiểu ñối tượng ñược xây dựng cho việc xử lí ngoại lệ Một số lớp ngoại lệ chung ñược khai báo bên namespace ðối tượng System.exception cung cấp số thuộc tính phương thức hữu dụng sau: Thuộc tính Message : thuộc tính ñọc cung cấp thông tin ngoại lệ Thuộc tính HelpLink : cung cấp liên kết ñể trợ giúp cho tập tin liên quan ñến ngoại lệ Thuộc tính StackTrace : cung cấp thông tin stack cho câu lệnh lỗi Ví dụ ñối tượng ngoại lệ public static void Main() { string fname = "test3.txt";//nhap duong dan cho file string buffer; //can xu li ngoai le o day vi neu file khong ton tai se bao loi try { StreamReader sReader = File.OpenText(fname);//mo file text de doc while ((buffer = sReader.ReadLine()) != null)// doc tung dong { Console.WriteLine(buffer); //in man hinh console } } catch ( FileNotFoundException e) { e.HelpLink = "http://www.khmt3-k2.net/forum"; Bài tập Lập lrình hướng ñối tượng với C# Trang 227 Console.WriteLine("\n Ngoai le xay ra:{0}",e.Message); Console.WriteLine("\n Helplink :{0}", e.HelpLink); Console.WriteLine("\n Thông tin stack: {0}",e.StackTrace); } } • Một số lớp ngoại lệ chung Bài tập Lập lrình hướng ñối tượng với C# Trang 228 3.1 Tạo riêng ngoại lệ Ngoài kiểu liệu ngoại lệ dễ dàng tạo ngoại lệ (còn gọi ngoại lệ tùy chọn) Mục ñích: cung cấp nhiều thông tin mở rộng hay khả ñặc biệt cần thiết ngoại lệ mà tạo Chú ý: Ngoại lệ phải ñược dẫn xuất từ System.ApplicationException • Ví dụ tạo riêng ngoại lệ // Tao mot lop ngoai le rieng xuat phat tu ApplicationException public class MyCustomException : System.ApplicationException { // ham lay tham so tu mot chuoi va truyen cho lop co so public MyCustomException(string message) : base(message) { Console.WriteLine("chung ta co the tao rieng ngoai le"); } } class Program { static void Main(string[] args) { int a, b; float c; Bài tập Lập lrình hướng ñối tượng với C# Trang 229 Console.Write("nhap a: "); a = int.Parse(Console.ReadLine()); Console.WriteLine("nhap b: "); b = int.Parse(Console.ReadLine()); try { c = (float)a / b; if (b == 0) { throw new DivideByZeroException(); } if (a == 0) { MyCustomException e = new MyCustomException("khong cho phep chia so cho so khac"); throw e; } Console.WriteLine("ket qua la:{0}", c); } catch (System.DivideByZeroException) { Console.WriteLine("khong chia phep chia cho 0"); } catch (MyCustomException) {Console.WriteLine("khong cho phep lay so chia cho so khac"); } } } 3.2 Phát sinh lại ngoại lệ Trong khối catch ta phát sinh lại ngoại lệ bên khối catch sau thực hành ñộng ñúng Có kiểu: Bài tập Lập lrình hướng ñối tượng với C# Trang 230 • Phát sinh ngoại lệ ta dùng lệnh : throw; • Phát sinh ngoại lệ khác ta phải nhúng ngoại lệ ban ñầu vào bên ngoại lệ ñể phương thức gọi hiểu ñược lai lịch nguồn gốc ngoại lệ Ví dụ // tạo ngoại lệ riêng public class MyCustomException : System.Exception { public MyCustomException( string message, Exception inner): base(message, inner) { } } public class Test { public static void Main() { Test t = new Test(); t.TestFunc(); } // chia hai số xử lý ngoại lệ public void TestFunc() { try { DangerousFunc1(); } Bài tập Lập lrình hướng ñối tượng với C# Trang 231 catch (MyCustomException e) { Console.WriteLine("\n{0}", e.Message); Console.WriteLine("Retrieving exception history "); Exception inner = e.InnerException; while ( inner != null) { Console.WriteLine("{0}", inner.Message); inner = inner.InnerException; } } } public void DangerousFunc1() { try { DangerousFunc2(); } catch (System.Exception e) { MyCustomException ex = new MyCustomException("E3 – Custom Exception Situation", e); throw ex; } } public void DangerousFunc2() { try { DangerousFunc3(); } catch (System.DivideByZeroException e) Bài tập Lập lrình hướng ñối tượng với C# { Trang 232 Exception ex = new Exception("E2 - Func2 caught divide by zero", e); throw ex; } } public void DangerousFunc3() { try { DangerousFunc4(); } catch (System.ArithmeticException) { throw; } catch (System.Exception) { Console.WriteLine("Exception handled here."); } } public void DangerousFunc4() { throw new DivideByZeroException("E1 – DivideByZero Exception"); } } } B BÀI TẬP MẪU Bài tập 1: Hãy viết ñoạn lệnh ñể thực việc bắt ngoại lệ liên quan ñến câu lệnh sau ñây: Ketqua = Sothu1 / Sothu2; Bài tập 2: Chương trình sau ñây có vấn ñề Hãy xác ñịnh vấn ñề phát sinh ngoại lệ chạy chương trình Và viết lại chương trình hoàn chỉnh gồm lệnh xử lý ngoại lệ: Bài tập Lập lrình hướng ñối tượng với C# Trang 233 using System; public class Tester { public static void Main(){ uint so1=0; int so2, so3; so2 = -10; so3 = 0; // Tính giá trị lại so1 -= 5; so2 = 5/so3; // xuất kết Console.WriteLine("So 1: {0}, So 2:{1}", so1, so2); } } Bài tập 3: Chương trình sau ñây dẫn ñến ngoại lệ hay không? Nếu cho biết ngoại lệ ñược phát sinh Hãy viết lại chương trình hoàn chỉnh có xử lý ngoại lệ cách ñưa thông ñiệp ngoại lệ ñược phát sinh using System; using System.IO; public class Tester { public static void Main() { string fname = "test3.txt"; string buffer; StreamReader sReader = File.OpenText(fname); while ( (buffer = sReader.ReadLine()) !=null) { Console.WriteLine(buffer); } } } Bài tập 4: Viết chương trình cho phép nhập phân số, xử lý ngoại lệ người ñó nhập tử số ... lập hai tham số mà chương trình bạn lại gọi hàm thiết lập truyền cho tham số trình biên dịch thông báo lỗi hàm thiết lập thích hợp Bài tập Lập lrình hướng ñối tượng với C# Trang Hàm chép (constructor)... hợp với phương thức không phát sinh lỗi biên dịch chương trình Bài tập Lập lrình hướng ñối tượng với C# Trang 14 11 ðóng gói liệu thông qua thuộc tính ðóng gói liệu với thuộc tính thực chất trình. .. sử dụng với lớp, phương thức, thuộc tính, kiện constructor ñược sử dụng với dãy, indexer, destructor hay kiểu khác với lớp Sử dụng phương thức tĩnh Bài tập Lập lrình hướng ñối tượng với C# Trang