1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Đề cương lập trình nâng cao với java

170 168 1

Đ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

Thông tin cơ bản

Định dạng
Số trang 170
Dung lượng 1,18 MB

Nội dung

1.3 Phương thức trong Java Trong Java, một phương thức là khá giống hàm, được sử dụng để trưng bày hành vi của một đối tượng.. out .println "Ten xe la :" + ten ; } public static void

Trang 1

LẬP TRÌNH NÂNG CAO VỚI JAVA

(Advanced Java programming)

Bộ môn Công nghệ Phần mềm

Đại học SPKT Hưng Yên

Trang 2

Bài 1 Kế thừa và đa hình trong Java 9

1.1 Đối tượng trong Java 9

1.2 Lớp trong Java 9

1.3 Phương thức trong Java 11

1.4 Tạo một đối tượng trong Java 11

1.5 Truy cập các biến instance và các phương thức trong Java 12

1.6 Đối tượng vô danh (annonymous) trong Java 16

Bài 3: Xử lý ngoại lệ 19

3.1 Exception là gì? 19

Cấp bậc exception trong Java 20

Các phương thức của lớp Exceptions trong Java 21

Các tình huống phổ biến mà Exception có thể xảy ra 22

Các từ khóa để Xử lý ngoại lệ trong Java 23

3.2 Khối try trong Java 23

Cú pháp của khối try-catch trong Java 23

Cú pháp của khối try-finally trong Java 23

Khối catch trong Java 23

Vấn đề khi không có Exception Handling 23

Xử lý vấn đề trên bởi Exception Handling trong Java 24

Chế độ làm việc nội tại của khối try-catch trong Java 24

Nhiều khối catch trong Java 25

Lồng khối try trong Java 26

Tại sao sử dụng các khối try lồng nhau trong Java 26

Ví dụ về các khối try lồng nhau trong Java 27

3.3 Sự sử dụng khối finally trong Java 28

Tình huống 1: ở đây exeption không xuất hiện 28

Tình huống 2: exception xuất hiện và không được xử lý 28

Tình huống 3: exception xảy ra và được xử lý 29

3.6 Phân biệt final, finally, và finalize trong Java 29

Ví dụ final trong Java 30

Ví dụ finally trong Java 30

Ví dụ finalize trong Java 30

Trang 3

3.4 Từ khóa throw trong Java 31

Ví dụ từ khóa throw trong Java 31

Quá trình lan truyền Exception trong Java 31

3.5 Từ khóa throws trong Java 32

Cú pháp của từ khóa throws trong Java 33

Ví dụ về throws trong Java 33

Trường hợp 1: Bạn xử lý exception 34

Trường hợp 2: Bạn khai báo exception 35

A Chương trình ví dụ nếu exception không xuất hiện 35

B Chương trình ví dụ nếu exception xuất hiện 35

Phân biệt throw và throws trong Java 36

Ví dụ về throw trong Java 37

Ví dụ về throws trong Java 37

Ví dụ về throw và throws trong Java 37

3.6 ExceptionHandling và Ghi đè phương thức trong Java 37

3.7 Custom Exception trong Java 41

Bài 5 String 43

5.1 String trong Java 43

Chuỗi trong Java là gì 43

Cách tạo đối tượng String trong Java 43

Sử dụng từ khóa new 44

Tạo các String được định dạng trong Java 45

5.2 Immutable String trong Java 46

Tại sao đối tượng String là Immutable trong Java? 47

5.3 So sánh chuỗi trong Java 47

So sánh chuỗi bởi phương thức equals() trong Java 47

So sánh chuỗi với toán tử == trong Java 48

So sánh chuỗi bởi phương thức compareTo() trong Java 49

5.4 Nối chuỗi trong Java 49

Nối chuỗi bởi toán tử + trong Java 49

Nối chuỗi bởi phương thức concat() trong Java 50

5.5 Chuỗi con trong Java 51

Trang 4

Ví dụ về chuỗi con trong Java 51

5.6 Phương thức của lớp String trong Java 52

Phương thức toUpperCase() và toLowerCase() của lớp String trong Java 52

Phương thức trim() của lớp String trong Java 53

Phương thức startWith() và endsWith() của lớp String trong Java 53

Phương thức charAt() của lớp String trong Java 53

Phương thức length() của lớp String trong Java 53

Phương thức intern của lớp String trong Java 53

Phương thức valueOf() của lớp String trong Java 54

Phương thức replace() của lớp String trong Java 54

5.7 Lớp StringBuffer trong Java 54

Các Constructor quan trọng của lớp StringBuffer trong Java 54

Các phương thức quan trọng của lớp StringBuffer trong Java 55

Chuỗi dạng mutable là gì? 55

Phương thức append() của lớp StringBuffer trong Java 55

Phương thức insert() của lớp StringBuffer trong Java 56

Phương thức replace() của lớp StringBuffer trong Java 56

Phương thức delete() của lớp StringBuffer trong Java 57

Phương thức reverse() của lớp StringBuffer trong Java 57

Phương thức capacity() của lớp StringBuffer trong Java 57

Phương thức ensureCapacity() của lớp StringBuffer trong Java 58

5.8 StringBuilder trong Java 59

Các Constructor quan trọng của lớp StringBuilder trong Java 59

Các phương thức quan trọng của lớp StringBuffer trong Java 59

Phương thức append() của lớp StringBuffer trong Java 60

Phương thức insert() của lớp StringBuffer trong Java 61

Phương thức replace() của lớp StringBuffer trong Java 61

Phương thức delete() của lớp StringBuffer trong Java 61

Phương thức reverse() của lớp StringBuffer trong Java 62

Phương thức capacity() của lớp StringBuffer trong Java 62

Phương thức ensureCapacity() của lớp StringBuffer trong Java 63

5.9 So sánh lớp String và StringBuffer trong Java 64

Trang 5

Kiểm tra hiệu suất của lớp String và StringBuffer trong Java 64

Kiểm tra HashCode của lớp String và StringBuffer trong Java 66

5.10 So sánh lớp StringBuffer và StringBuilder trong Java 67

Ví dụ về lớp StringBuffer trong Java 67

Ví dụ về lớp StringBuilder trong Java 67

Kiểm tra hiệu suất của lớp StringBuffer và StringBuilder trong Java 68

Bài 7 Bài tập và thảo luận về Case study ATM (1) 70

7.1 Các yêu cầu của ATM 70

7.2 Cách xây dựng lớp và đối tượng 71

1 Các thành phần trong bản vẽ Class 71

2 Relationship (Quan hệ) 72

3 Cách xây dựng bản vẽ Class 75

7.2 Phân tích theo mô hình hướng đối tượng 77

1 Đặc tả Class 77

2 Sử dụng bản vẽ Class 78

3 Kết luận 78

Bài 8 Thao tác tệp 79

8.1 File và I/O trong Java 79

Byte Stream trong Java 79

Character Stream trong Java 80

Standard Stream trong Java 81

Đọc và Ghi File trong Java 83

FileInputStream trong Java: 83

FileOutputStream trong Java 84

Ví dụ: 85

Điều hướng file và I/O trong Java 86

Thư mục trong Java 86

Tạo thư mục trong Java 87

Liệt kê thư mục trong Java 87

8.2 Lớp File trong Java 88

Ví dụ 92

8.3 Lớp FileReader trong Java 94

Trang 6

8.4 Lớp FileWriter trong Java 95

Ví dụ 96

Bài 10 Kiểu Collections 98

10.1 Collection trong Java 98

Collection Interface trong Java 98

Các lớp Collection trong Java 99

Các thuật toán Collection trong Java 102

Cách sử dụng một Iterator trong Java 102

Cách sử dụng một Comparator trong Java 102

Tổng kết 103

10.2 Collection Interface trong Java 103

Ví dụ 105

10.3 List Interface trong Java 106

Ví dụ 108

10.4 Lớp LinkedList trong Java 109

Ví dụ 112

Ví dụ 116

10.5 Lớp Hashtable trong Java 117

Ví dụ 119

10.6 Map Interface trong Java 120

Ví dụ 122

10.7 Lớp HashMap trong Java 123

Ví dụ 125

Bài 12 Generic trong Java 127

12.1 Generic trong Java 127

12.2 Các phương thức generic trong Java 127

Ví dụ: 128

12.3 Các tham số kiểu giới hạn (bounded type) trong Java 129

Ví dụ: 129

12.4 Các lớp Generic trong Java 131

Ví dụ: 131

Bài 14: Thread 133

Trang 7

14.1 Thread trong Java 133

14.2 Vòng đời của một Thread trong Java 133

14.3 Quyền ưu tiên của thread trong Java 134

14.4 Tạo thread bởi triển khai Runnable Interface trong Java 134

Ví dụ: 135

14.5 Tạo Thread bởi kế thừa lớp Thread trong Java 137

Ví dụ: 137

14.6 Các phương thức của lớp Thread trong Java 139

Bài 17 Lập trình với JDBC 145

17.1 JDBC là gì? 145

Tại sao sử dụng JDBC? 145

API là gì? 145

Các thành phần của JDBC 145

17.2 Cài đặt JDBC 146

17.3 Giới thiệu JDBC Driver 146

JDBC Driver là gì? 146

Giới thiệu JDBC-ODBC bridge driver 147

Giới thiệu Native-API driver 147

Giới thiệu Network Protocol driver 147

Giới thiệu Thin driver 147

Sự sử dụng của các kiểu driver 147

17.4 Kiểu dữ liệu trong JDBC 148

Kiểu dữ liệu Date và Time trong JDBC 151

Xử lý giá trị NULL trong JDBC 153

17.5 Kết nối JDBC với cơ sở dữ liệu 154

Sử dụng phương thức Class.forName() 155

Sử dụng DriverManager.registerDriver() 155

Đóng kết nối JDBC 158

Bài 18 Bài tập và thảo luận về Case study ATM (3) 159

18.1 Cài đặt các chức năng và giao diện 159

18.2 Chạy và kiểm tra lỗi 159

Bài 20 Bài tập và thảo luận tổng kết môn học 160

Trang 8

20.1 Những ưu điểm của lập trình hướng đối tượng 160

20.2 Phân tích bài toán theo mô hình hướng đối tượng 160

Đối tượng trong Java 160

Lớp trong Java 161

Cú pháp để khai báo một lớp 161

Ví dụ đơn giản về Lớp và Đối tượng trong Java 161

Phương thức trong Java 162

Constructor trong Java: 162

Tạo một đối tượng trong Java: 163

Truy cập các biến instance và các phương thức trong Java 164

Ví dụ: 164

Ví dụ đối tượng và lớp mà duy trì bản ghi các sinh viên 165

Ví dụ khác về lớp và đối tượng trong Java 166

Các cách khác nhau để tạo đối tượng trong Java? 167

Đối tượng vô danh (annonymous) trong Java 168

Tạo nhiều đối tượng bởi chỉ một kiểu 168

20.3 Trao đổi: 169

Trang 9

Bài 1 Kế thừa và đa hình trong Java

1.1 Đối tượng trong Java

Đó là một thực thể có trạng thái và hành vi, ví dụ như bàn, ghế, xe con, mèo, … Nó có thể mang tính vật lý hoặc logic Ví dụ về logic đó là Banking system

Một đối tượng có ba đặc trưng sau:

Trạng thái: biểu diễn dữ liệu (giá trị) của một đối tượng

Hành vi: biểu diễn hành vi (tính năng) của một đối tượng như gửi tiền vào, rút tiền ra, … Nhận diện: việc nhận diện đối tượng được triển khai thông qua một ID duy nhất Giá trị

của ID là không thể nhìn thấy với người dùng bên ngoài Nhưng nó được sử dụng nội tại bởi JVM để nhận diện mỗi đối tượng một cách duy nhất

Ví dụ: Bút là một đối tượng Nó có tên là Thiên Long, có màu trắng, … được xem như là trạng thái của nó Nó được sử dụng để viết, do đó viết là hành vi của nó

Đối tượng là sự thể hiện (Instance) của một lớp Lớp là một Template hoặc bản thiết kế

từ đó đối tượng được tạo Vì thế đối tượng là Instance (kết quả) của một lớp

Trang 10

Ví dụ đơn giản về Lớp và Đối tượng trong Java

Trong ví dụ này, chúng ta tạo một lớp Student có hai thành viên dữ liệu là id và name Chúng ta đang tạo đối tượng của lớp Student bởi từ khóa new và in giá trị đối tượng class Student1 {

int id; //thanh vien du lieu (cung la bien instance)

String name; //thanh vien du lieu (cung la bien instance)

public static void main( String args[]){

Student1 s1= new Student1 (); //tao mot doi tuong Student

System out println(s1.id);

System out println(s1.name);

}

}

Một lớp có thể chứa bất kỳ loại biến sau:

Biến Local: Các biến được định nghĩa bên trong các phương thức, constructor hoặc

block code được gọi là biến Local Biến này sẽ được khai báo và khởi tạo bên trong phương thức và biến này sẽ bị hủy khi phương thức đã hoàn thành

Biến Instance: Các biến instance là các biến trong một lớp nhưng ở bên ngoài bất kỳ

phương thức nào Những biến này được khởi tạo khi lớp này được tải Các biến instance

có thể được truy cập từ bên trong bất kỳ phương thức, constructor hoặc khối nào của lớp

cụ thể đó

Biến Class: Các biến class là các biến được khai báo với một lớp, bên ngoài bất kỳ

phương thức nào, với từ khóa static

Trang 11

1.3 Phương thức trong Java

Trong Java, một phương thức là khá giống hàm, được sử dụng để trưng bày hành vi của một đối tượng Phương thức giúp code tăng tính tái sử dụng và tối ưu hóa code

Từ khóa new được sử dụng để cấp phát bộ nhớ tại runtime

Constructor trong Java:

Khi bàn luận về các lớp, một trong những chủ đề quan trọng là các constructor Mỗi lớp có một constructor Nếu chúng ta không viết một constructor một cách rõ ràng cho một lớp thì bộ biên dịch Java xây dựng một constructor mặc định cho lớp đó

Mỗi khi một đối tượng mới được tạo ra, ít nhất một constructor sẽ được gọi Quy tắc chính của các constructor là chúng có cùng tên như lớp đó Một lớp có thể có nhiều hơn một constructor

Sau đây là ví dụ về một constructor:

public class Xecon {

public Xecon (){

}

public Xecon ( String ten){

// Contructor nay co mot tham so la ten.

}

}

Java cũng hỗ trợ Lớp Singleton trong Java, ở đây bạn sẽ có thể tạo chỉ một instance của một lớp

1.4 Tạo một đối tượng trong Java

Như đã đề cập trước đó, một lớp cung cấp bản thiết kế cho các đối tượng Vì thế, về cơ bản, một đối tượng được tạo từ một lớp Trong Java, từ khóa new được sử dụng để tạo một đối tượng mới

Trang 12

Có ba bước khi tạo một đối tượng từ một lớp:

Khai báo: Một khai báo biến với một tên biến với một loại đối tượng

Cài đặt: Từ khóa new được sử dụng để tạo đối tượng

Khởi tạo: Từ khóa new được theo sau bởi một lời gọi một constructor Gọi hàm này khởi

tạo đối tượng mới

Dưới đây là ví dụ về tạo một đối tượng:

public class Xecon {

public Xecon ( String ten){

// Contructor nay co mot tham so la ten.

System out println( "Ten xe la :" + ten );

}

public static void main( String []args){

// Lenh sau se tao mot doi tuong la Xecuatoi

Xecon Xecuatoi = new Xecon ( "Toyota" );

}

}

Nếu chúng ta biên dịch và chạy chương trình, nó sẽ cho kết quả sau:

Ten xe la : Toyota

1.5 Truy cập các biến instance và các phương thức trong Java

Các biến instance và các phương thức được truy cập thông qua các đối tượng được tạo

Để truy cập một biến instance, path sẽ là như sau:

/* Dau tien, ban tao mot doi tuong */

Doituongthamchieu = new Constructor ();

Trang 13

/* Sau do ban goi mot bien nhu sau */

public Xecon ( String ten){

// Contructor nay co mot tham so la ten.

System out println( "Ten xe la :" + ten );

}

public void setGia( int gia ){

Giaxe = gia;

}

public int getGia( ){

System out println( "Gia mua xe la :" + Giaxe );

return Giaxe ;

}

public static void main( String []args){

/* Tao doi tuong */

Xecon Xecuatoi = new Xecon ( "Toyota" );

Trang 14

/* Goi mot phuong thuc lop de thiet lap gia xe */

Xecuatoi setGia( 1000000000 );

/* Goi mot phuong thuc lop khac de lay gia xe */

Xecuatoi getGia( );

/* Ban cung co the truy cap bien instance nhu sau */

System out println( "Gia tri bien :" + Xecuatoi Giaxe );

Gia tri bien : 1000000000

Ví dụ đối tượng và lớp mà duy trì bản ghi các sinh viên

Trong ví dụ này, chúng ta tạo hai đối tượng của lớp Student và khởi tạo giá trị của các đối tượng này bằng việc triệu hồi phương thức insertRecord trên nó Ở đây, chúng ta đang hiển thị trạng thái (dữ liệu) của các đối tượng bằng việc triệu hồi phương thức displayInformation

Trang 15

}

void displayInformation(){ System out println(rollno+ " " +name);} //phuong thuc

public static void main( String args[]){

Student2 s1= new Student2 ();

Student2 s2= new Student2 ();

Ví dụ khác về lớp và đối tượng trong Java

Ví dụ khác duy trì các bản ghi của lớp Rectangle Phần giải thích tương tự như trên: class Rectangle {

Trang 16

void calculateArea(){ System out println(length*width);}

public static void main( String args[]){

Rectangle r1= new Rectangle ();

Rectangle r2= new Rectangle ();

Các cách khác nhau để tạo đối tượng trong Java?

Có nhiều cách để tạo một đối tượng trong Java Đó là:

Bằng từ khóa new

Bằng phương thức newInstance()

Bằng phương thức clone(), …

Bằng phương thức factory,

1.6 Đối tượng vô danh (annonymous) trong Java

Vô danh hiểu đơn giản là không có tên Một đối tượng mà không có tham chiếu thì được xem như là đối tượng vô danh Nếu bạn phải sử dụng một đối tượng chỉ một lần, thì đối tượng vô danh là một hướng tiếp cận tốt

class Calculation {

Trang 17

public static void main( String args[]){

new Calculation ().fact( 5 ); //Goi phuong thuc voi doi tuong vo danh (annonymous)

}

}

Tạo nhiều đối tượng bởi chỉ một kiểu

Chúng ta có thể tạo nhiều đối tượng bởi chỉ một kiểu như khi chúng ta thực hiện trong các kiểu gốc Ví dụ:

Rectangle r1= new Rectangle (),r2= new Rectangle (); //Tao hai doi tuong

Trang 18

void calculateArea(){ System out println(length*width);}

public static void main( String args[]){

Rectangle r1= new Rectangle (),r2= new Rectangle (); //Tao hai doi tuong

Trang 19

Bài 3: Xử lý ngoại lệ

3.1 Exception là gì?

Ý nghĩa trong từ điển: Exception là một tình trạng bất thường Trong Java, Exception là một sự kiện mà phá vỡ luồng chuẩn của chương trình Nó là một đối tượng mà được ném tại Runtime Một exception (ngoại lệ) trong Java là một vấn đề xảy ra trong quá trình thực hiện của chương trình Một ngoại lệ có thể xảy ra với nhiều lý do khác nhau, như dưới đây:

Người dùng nhập dữ liệu không hợp lệ

Một file cần được mở nhưng không thể tìm thấy

Kết nối mạng bị ngắt trong quá trình thực hiện giao tiếp hoặc JVM hết bộ nhớ

Để hiểu sâu hơn các khái niệm được trình bày trong chương này, mời bạn tham khảo loạt bài:Ví dụ về Exception trong Java

Một vài những ngoại lệ xảy ra bởi lỗi của người dùng, một số khác bởi lỗi của lập trình viên và số khác nữa đến từ lỗi của nguồn dữ liệu vật lý

Để hiểu về cách xử lý ngoại lệ trong Java, bạn cần phải hiểu những loại ngoại lệ như sau:

Checked Exception: Là ngoại lệ thường xảy ra do người dùng mà không thể lường trước được bởi lập trình viên Ví dụ, một file được mở, nhưng file đó không thể tìm thấy và ngoại lệ xảy ra Những ngoại lệ này không thể được bỏ qua trong quá trình biên dịch Checked Exception là các lớp mà kế thừa lớp Throwable ngoại trừ RuntimeException và Error Ví dụ như IOException, SQLException, … Checked Exception được kiểm tra tại thời gian biên dịch compile-time

Unchecked Exception: Một ngoại lệ xảy ra ở runtime là ngoại lệ có thể tránh được bởi lập trình viên Unchecked Exception là các lớp kế thừa RuntimeException, ví dụ ArithmaticException, NullPointerException, ArrayIndexOutOfBoundsException, … Unchecked Exception không được kiểm tra tại compile-time, thay vào đó chúng được kiểm tra tại runtime

Error: Nó không giống các exception, nhưng vấn đề xảy ra vượt quá tầm kiểm soát của lập trình viên hay người dùng Error được bỏ qua trong code của bạn vì bạn hiếm khi có thể làm gì đó khi chương trình bị error Ví dụ như OutOfMemoryError, VirtualMachineError, AssertionError, … Nó được bỏ qua trong quá trình Java biên dịch

Trang 20

Xử lý ngoại lệ (Exception Handling) là một kỹ thuật để xử lý các Runtime Error như ClassNotFound, IO, SQL, Remote, … Lợi thế chính của xử lý ngoại lệ là để duy trì luồng chuẩn của ứng dụng Exception thường phá vỡ luồng chuẩn của ứng dụng, và đó là tại sao chúng ta sử dụng Exception Handling Bạn theo dõi tình huống sau:

Cấp bậc exception trong Java

Tất cả các lớp exception đều là lớp con của lớp java.lang.Exception Lớp exception là lớp con của lớp Throwable Một loại lớp exception khác là Error cũng là lớp con của lớp Throwable

Erros không thường được đặt bẫy bởi các chương trình Java Error thường được tạo ra để thể hiện lỗi trong môi trường runtime Ví dụ: JVM hết bộ nhớ Thông thường các chương trình không thể khôi phục từ các lỗi

Lớp Exception có hai lớp con chính là : IOException và RuntimeException

Trang 21

Đây là danh sách các checked và unchecked exception phổ biến:Exception có sẵn trong Java

Các phương thức của lớp Exceptions trong Java

Dưới đây là danh sách các phương thức phố biến của lớp Throwable trong Java

STT Phương thức và Miêu tả

1 public String getMessage()

Trả về một message cụ thể về exception đã xảy ra Message này được

khởi tạo bởi phương thức contructor của Throwable

2 public Throwable getCause()

Trả về nguyên nhân xảy ra exception biểu diễn bởi đối tượng

Throwable

3 public String toString()

Trả về tên của lớp và kết hợp với kết quả từ phương thức

getMessage()

4 public void printStackTrace()

Trang 22

In ra kết quả của phương thức toString cùng với stack trace đến

System.err

5 public StackTraceElement [] getStackTrace()

Trả về một mảng chứa mỗi phần tử trên stack trace Phần tử tại chỉ

mục 0 biểu diễn phần trên cùng của Call Stack, và phần tử cuối cùng

trong mảng biểu diễn phương thức tại dưới cùng của Call Stack

6 public Throwable fillInStackTrace()

Fills the stack trace of this Throwable object with the current stack

trace, adding to any previous information in the stack trace

Các tình huống phổ biến mà Exception có thể xảy ra

Dưới đây là một số tình huồng phổ biến mà Unchecked Exception có thể xảy ra:

Với ArithmaticException: xảy ra nếu bạn chia bất cứ số nào cho số 0

int a = 50 / ; //ArithmeticException

Với NullPointerException: nếu bạn có giá trị null trong bất cứ biến nào, thì việc thực

hiện bất cứ hoat động nào bởi biến này làm xuất hiện kiểu exception này

String s = null ;

System out println ( length ()); //NullPointerException

Với NumberFormatException: việc định dạng sai bất cứ giá trị nào, có thể gây ra loại

ngoại lệ này Giả sử bạn có một biến string mà có các ký tự, thì việc chuyển đổi biến thành này chữ số sẽ làm xuất hiện NumberFormatException

String s = "abc" ;

int i = Integer parseInt ( ); //NumberFormatException

Với ArrayIndexOutOfBoundsException: nếu bạn đang chèn bất cứ giá trị nào trong

một chỉ mục sai sẽ làm xuất hiện kiểu exception này

int a []= new int [ ];

Trang 23

a 10 ]= 50 ; //ArrayIndexOutOfBoundsException

Các từ khóa để Xử lý ngoại lệ trong Java

Có 5 từ khóa được sử dụng để Xử lý ngoại lệ trong Java, đó là:

3.2 Khối try trong Java

Khối try trong Java được sử dụng để bao quanh code mà có thể ném một Exception Nó phải được sử dụng bên trong phương thức Khối try phải được theo sau bởi hoặc khối catch hoặc khối finally

Cú pháp của khối try-catch trong Java

try {

//code ma co the nem exception

} catch ( Exception_class_Name ref ){}

Cú pháp của khối try-finally trong Java

try {

//code ma co the nem exception

} finally {}

Khối catch trong Java

Khối catch trong Java được sử dụng để xử lý các Exception Nó phải được sử dụng chỉ sau khối try Bạn có thể sử dụng nhiều khối catch với một khối try đơn

Vấn đề khi không có Exception Handling

Chúng ta cùng tìm hiểu vấn đề nếu không sử dụng khối try-catch

public class Testtrycatch1 {

public static void main ( String args []){

int data = 50 / ; //co the nem exception

Trang 24

System out println ( "Phan code con lai " );

}

}

Chương trình sẽ cho kết quả sau:

Exception in thread "main" java lang ArithmeticException : / by zero

Như trong ví dụ trên, phần còn lại của code không được thực thi (trong ví dụ này là lệnh

inPhan code con lai…không được in) Giả sử nếu có khoảng 100 dòng code sau exception, thì tất cả các dòng code này sẽ không được thực thi

Xử lý vấn đề trên bởi Exception Handling trong Java

Bây giờ, cùng ví dụ trên, chúng ta sử dụng khối try-catch để xử lý vấn đề trên

public class Testtrycatch2 {

public static void main ( String args []){

try {

int data = 50 / ;

} catch ( ArithmeticException e ){ System out println ( );}

System out println ( "Phan code con lai " );

}

}

Chương trình sẽ cho kết quả sau:

java lang ArithmeticException : / by zero

Phan code con lai

Lúc này, phần còn lại của code đã được thực thi

Chế độ làm việc nội tại của khối try-catch trong Java

Đầu tiên, JVM kiểm tra xem exception đã được xử lý hay chưa Nếu exception chưa được

xử lý, JVM cung cấp một Exception Handler mặc định, để thực hiện các tác vụ sau:

In ra miêu tả của exception đó

In ra stack trace (cấu trúc thứ bậc của phương thức nơi mà exception xuất hiện)

Làm cho chương trình ngừng lại

Trang 25

Nhưng nếu exception đã được xử lý bởi Lập trình viên, thì luồng chuẩn của ứng dụng được duy trì (hay là phần còn lại của code được thực thi)

Nhiều khối catch trong Java

Nếu bạn phải thực hiện các tác vụ khác nhau mà có thể xảy ra các exception khác nhau, bạn sử dụng nhiều khối catch trong Java Bạn theo dõi ví dụ đơn giản sau:

public class TestMultiCatchBlock {

public static void main ( String args []){

try {

int a []= new int [ ];

a [ ]= 30 / ;

}

catch ( ArithmeticException e ){ System out println ( "Task1 duoc hoan thanh" );}

catch ( ArrayIndexOutOfBoundsException e ){ System out println ( "Task2 duoc hoan thanh" );}

catch ( Exception e ){ System out println ( "Task chung duoc hoan thanh" );}

System out println ( "Phan code con lai " );

}

Chương trình sẽ cho kết quả sau:

Task1 duoc hoan thanh

Phan code con lai

Qui tắc 1: Tại một thời điểm, chỉ một exception được xuất hiện và tại một thời điểm chỉ

có một khối catch được thực thi

Qui tắc 2: Tất cả khối catch phải được sắp xếp từ cụ thể nhất tới chung nhất, ví dụ: việc

bắt ArithimeticExption phải ở trước việc bắt Exception

Trang 26

catch ( Exception e ){ System out println ( "Task chung duoc hoan thanh" );}

catch ( ArithmeticException e ){ System out println ( "Task1 duoc hoan thanh" );}

catch ( ArrayIndexOutOfBoundsException e ){ System out println ( "Task2 duoc hoan thanh" );}

System out println ( "Phan code con lai " );

}

Chạy chương trình trên sẽ cho một lỗi compile time error

Lồng khối try trong Java

Việc một khối try bên trong một khối try khác thì được gọi là các khối try được lồng vào nhau, hay là lồng các khối try trong Java

Tại sao sử dụng các khối try lồng nhau trong Java

Đôi khi có một tình huống là một phần của một khối code có thể gây ra một lỗi và toàn

bộ khối lại có thể gây ra lỗi khác Trong các tình huống đó, Exception Handler phải được lồng vào nhau Cú pháp:

Trang 27

System out println ( "Lenh khac" );

} catch ( Exception e ){ System out println ( "Da xu ly" );}

System out println ( "Luong chuan " );

}

Chương trình sẽ cho kết quả sau:

Thuc hien phep chia

java lang ArithmeticException : / by zero

java lang ArrayIndexOutOfBoundsException : 5

Lenh khac

Luong chuan

Khối finally trong là một khối được sử dụng để thực thi các phần code quan trọng như đóng kết nối, đóng stream, … Khối finally luôn luôn được thực thi dù cho exception có được xử lý hay không Khối finally phải được theo sau bởi khối try hoặc khối catch

Trang 28

Ghi chú: nếu bạn không xử lý ngoại lệ trước khi kết thúc chương trình, JVM sẽ thực thi khối finally (nếu bạn không có)

3.3 Sự sử dụng khối finally trong Java

Bạn theo dõi các tình huống khác nhau mà khối try trong Java có thể được sử dụng

Tình huống 1: ở đây exeption không xuất hiện

finally{System.out.println("Khoi finally luon luon duoc thuc thi");}

System.out.println("Phan code con lai ");

}

}

Chương trình trên sẽ cho kết quả:

5

Khoi finally luon luon duoc thuc thi

Phan code con lai

Tình huống 2: exception xuất hiện và không được xử lý

finally{System.out.println("Khoi finally luon luon duoc thuc thi");}

System.out.println("Phan code con lai ");

Trang 29

}

}

Chương trình trên sẽ cho kết quả:

Khoi finally luon luon duoc thuc thi

Exception in thread "main" java.lang.ArithmeticException: / by zero

Tình huống 3: exception xảy ra và được xử lý

public class TestFinallyBlock2{

public static void main(String args[]){

finally{System.out.println("Khoi finally luon luon duoc thuc thi");}

System.out.println("Phan code con lai ");

}

}

Chương trình trên sẽ cho kết quả:

java.lang.ArithmeticException: / by zero

Khoi finally luon luon duoc thuc thi

Phan code con lai

Qui tắc: Với một khối try thì có thể có 0 hoặc nhiều khối catch, nhưng chỉ có một khối

finally

Ghi chú: Khối finally sẽ không được thực thi nếu chương trình thoát ra (hoặc bởi gọi

System.exit() hoặc bởi gây ra một lỗi nghiêm trọng Fatal Error mà làm ngừng tiến trình)

3.6 Phân biệt final, finally, và finalize trong Java

Bảng dưới đây liệt kê và miêu tả các điểm khác nhau giữa final, finally và finalize trong Java:

Trang 30

Final được sử dụng để áp dụng các ràng buộc trên

lớp, phương thức và biến Lớp final không thể được

kế thừa, phương thức final không thể bị ghi đè, và

giá trị biến final không thể bị thay đổi

Finally được sử dụng để đặt các code quan trọng, nó sẽ được thực thi dù exception có được xử lý hay không

Finalize được sử dụng để thực hiện tiến trình dọn sạch

Final là một từ khóa Finally là một khối Finalize là một phương

public void finalize(){System.out.println("finalize duoc goi");}

public static void main(String[] args){

ViduFinalize f1=new ViduFinalize();

ViduFinalize f2=new ViduFinalize();

f1=null;

f2=null;

System.gc();

}}

Trang 31

3.4 Từ khóa throw trong Java

Từ khóa throw trong Java được sử dụng để ném tường minh một exception Chúng ta có thể ném hoặc Checked Exception hoặc Unchecked Exception trong Java bởi từ khóa throw Từ khóa throw được sử dụng chủ yếu để ném các Custom Exception (là các exception được định nghĩa bởi lập trình viên) Chúng ta sẽ tìm hiểu về Custom Exception trong chương riêng

Cú pháp của từ khóa throw trong Java như sau:

throw exception;

Cùng theo dõi ví dụ đơn giản để ném IOException:

throw new IOException("Xin loi: device error);

Ví dụ từ khóa throw trong Java

Trong ví dụ này, chúng ta đã tạo phương thức validate mà nhận giá trị nguyên như là một tham số Nếu tuoi là nhỏ hơn 18, chúng ta ném ArithmeticException, nếu không chúng ta

sẽ in một thông báo là: Chao mung ban den bo phieu

public class TestThrow1{

static void validate(int tuoi){

Chương trình Java trên sẽ cho kết quả:

Exception in thread "main" java.lang.ArithmeticException: Khong hop le

Quá trình lan truyền Exception trong Java

Đầu tiên, một exception được ném từ đầu Stack và nếu nó không được bắt, nó chuyển xuống dưới Call Stack tới phương thức trước đó, nếu tại đây nó không được bắt, thì

Trang 32

exception lại di chuyển xuống dưới tới phương thức trước đó, … tới khi nó được bắt hoặc tới khi nó chạm đáy của Call Stack Đây là quá trình làn truyền exception

Qui tắc: Theo mặc định, Unchecked Exception được lan truyền trong Calling Chain

Ví dụ về quá trình lan truyền của exception:

public static void main(String args[]){

TestExceptionPropagation1 obj=new TestExceptionPropagation1();

obj.p();

System.out.println("Luong chuan ");

}

}

3.5 Từ khóa throws trong Java

Từ khóa throws trong Java được sử dụng để khai báo một Exception Nó cung cấp một thông tin tới Lập trình viên rằng có thể xuất hiện một Exception, để họ nên cung cấp một code để xử lý ngoại lệ để duy trì luồng chuẩn của chương trình

Xử lý ngoại lệ (Exception Handling) chủ yếu được sử dụng để xử lý các Checked Exception Nếu có thể xuất hiện bất cứ Unchecked Exception nào chẳng hạn như

Trang 33

NullPointerException, thì đó là lỗi của lập trình viên vì họ đã không thực hiện kiểm tra code trước khi sử dụng

Cú pháp của từ khóa throws trong Java

kieu_tra_ve ten_phuong_thuc() throws ten_lop_exception{

//phan code cua phuong thuc

}

Câu hỏi: Kiểu Exception nên được khai báo?

Chỉ dành cho Checked Exception, bởi vì:

Unchecked Exception: dưới sự điều khiển của bạn bằng việc kiểm tra và sửa lỗi code Error: Vượt quá tầm kiểm soát của bạn, ví dụ: bạn không thể làm điều gì nếu xuất hiện

VirtualMachineError hoặc StackOverflowErrror

Lợi thế của từ khóa throws trong Java

Bây giờ, bởi sử dụng từ khóa throws, các Checked Exception có thể được lan truyền (trong Call Stack) Nó cung cấp thông tin tới người gọi phương thức về Exception đó

Ví dụ về throws trong Java

Chương trình Java sau sử dụng từ khóa throws để minh họa việc Checked Exception có thể được lan truyền (trong Call Stack)

import java.io.IOException;

class Testthrows1{

void m()throws IOException{

throw new IOException("device error");//checked exception

Trang 34

public static void main(String args[]){

Testthrows1 obj=new Testthrows1();

Qui tắc: Nếu bạn đang gọi một phương thức mà khai báo một exception, bạn phải hoặc

bắt hoặc khai báo exception đó

Có hai trường hợp:

Trường hợp 1: Bạn bắt exception (sử dụng try-catch để xử lý exception đó)

Trường hợp 2: Bạn khai báo exception (xác định từ khóa throws với phương thức đó)

Trường hợp 1: Bạn xử lý exception

Trong trường hợp này, code sẽ được thực thi tốt dù cho exception có xuất hiện trong chương trình hay không

import java.io.*;

class M{

void method()throws IOException{

throw new IOException("device error");

}

}

public class Testthrows2{

public static void main(String args[]){

Trang 35

Trường hợp 2: Bạn khai báo exception

Nếu exception không xuất hiện, code sẽ được thực thi tốt

Nếu exception xuất hiện, một exception sẽ được ném tại runtime bởi vì throws không xử

lý exception đó

A Chương trình ví dụ nếu exception không xuất hiện

import java.io.*;

class M{

void method()throws IOException{

System.out.println("Thiet bi hoat dong tot");

Chương trình Java trên sẽ cho kết quả:

Thiet bi hoat dong tot

Trang 36

throw new IOException("device error");

Chương trình Java trên sẽ cho Runtime Error

Câu hỏi: Chúng ta có thể tái ném một exception không?

Có, bằng cách ném cùng exception đó trong khối catch

Phân biệt throw và throws trong Java

Có nhiều điểm khác nhau giữa hai từ khóa throw và throws Bảng dưới liệt kê các điểm khác nhau này

Từ khóa throw được sử dụng để ném

tường minh một exception

Từ khóa throws được sử dụng để khai báo một exception

Checked Exception không thể được lan

truyền chỉ bởi sử dụng throw

Checked Exception không thể được lan truyền với throws

Throw được theo sau bởi một instance Throws được theo sau bởi một lớp

Throw được sử dụng bên trong một

phương thức

Throws được sử dụng với khai báo phương thức

Trang 37

Bạn có thể ném nhiều exception Bạn có thể khai báo nhiều exception, ví dụ

public void phuong_thuc()throws IOException,SQLException

Ví dụ về throw trong Java

void m(){

throw new ArithmeticException("sorry");

}

Ví dụ về throws trong Java

void m()throws ArithmeticException{

//Phan code cua phuong thuc

}

Ví dụ về throw và throws trong Java

void m()throws ArithmeticException{

throw new ArithmeticException("sorry");

}

3.6 ExceptionHandling và Ghi đè phương thức trong Java

Có một số qui tắc bạn nên biết khi nói đến ghi đè phương thức với xử lý ngoại lệ Đó là: Nếu phương thức của lớp cha không khai báo một exception: phương thức ghi đè của lớp con không thể khai báo Checked Exception nhưng có thể khai báo Unchecked Exception

Qui tắc 1: Nếu phương thức của lớp cha không khai báo một exception: phương thức ghi

đè của lớp con không thể khai báo Checked Exception

class TestExceptionChild extends Parent{

void msg()throws IOException{

System.out.println("TestExceptionChild");

Trang 38

}

public static void main(String args[]){

Parent p=new TestExceptionChild();

p.msg();

}

}

Chạy chương trình sẽ cho Compile Time Error

Qui tắc 2: Nếu phương thức của lớp cha không khai báo một exception: phương thức ghi

đè của lớp con không thể khai báo Checked Exception nhưng có thể khai báo Unchecked Exception

class TestExceptionChild1 extends Parent{

void msg()throws ArithmeticException{

System.out.println("child");

}

public static void main(String args[]){

Parent p=new TestExceptionChild1();

1 Ví dụ trường hợp phương thức ghi đè của lớp con khai báo exception cha

Trang 39

class TestExceptionChild2 extends Parent{

void msg()throws Exception{System.out.println("child");}

public static void main(String args[]){

Parent p=new TestExceptionChild2();

Chạy chương trình sẽ cho Compile Time Error

2.Ví dụ trường hợp phương thức ghi đè của lớp con khai báo cùng exception đó import java.io.*;

class Parent{

void msg()throws Exception{System.out.println("parent");}

}

class TestExceptionChild3 extends Parent{

void msg()throws Exception{System.out.println("child");}

public static void main(String args[]){

Parent p=new TestExceptionChild3();

try{

p.msg();

}catch(Exception e){}

}

Trang 40

class TestExceptionChild4 extends Parent{

void msg()throws ArithmeticException{System.out.println("child");}

public static void main(String args[]){

Parent p=new TestExceptionChild4();

Ngày đăng: 24/10/2017, 15:51

TỪ KHÓA LIÊN QUAN

w