CD1-CNPM - JAVA HIENLTH Chủ đề 1: Giới thiệu NNLT JAVA
CD1-CNPM - JAVA HIENLTH
Chủ đề 1: Giới thiệu NNLT JAVA
CD1-CNPM - JAVA HIENLTH
Nội dung
•Lịch sử ra đời Java
•Đặc điểm NNLT Java
•Java Core API
•Lập trình cơ bản với Java
•Lập trình Hướng đối tượng với Java
•Luồng nhập xuất
•Xử lý ngoại lệ
CD1-CNPM - JAVA HIENLTH
Lịch sử phát triển của Java
• Năm 1991, Java được xây dựng
ở Sun Microsystems bởi James
Gosling (CTO of Sun
MicroSystem).
• Ban đầu có tên là Oak, sau đó
đổi là Java vào năm 1995
• Năm 2010, Oracle mua lại Sun
Microsystems
CD1-CNPM - JAVA HIENLTH
Java Platform
CD1-CNPM - JAVA HIENLTH
Java làm việc như thế nào?
1. Chương trình nguồn(source code) được viếtbằng ngôn ngữ Java
2. Các chương trình đượcbiên dịch thành các file dạng lớp (*. class)
3. Các file .class được nạpvào bộ nhớ và thực thibởi máy ảo Java (JVM)
Hello.java
Java
Compiler
Hello.class
Run-Time Environment
Java
Virtual
Machine
Object.class String.class
Java API class files
CD1-CNPM - JAVA HIENLTH
• Khác với ngôn ngữ lập trình khác, thay vì biên dịch mã
nguồn thành mã máy, Java được thiết kế biên dịch mã
nguồn thành bytecode
• Bytecode sau đó được môi trường thực thi chạy
Bytecode
CD1-CNPM - JAVA HIENLTH
JVM và Java “bytecode”
• Chương trình Java không biên dịch mã nguồn thành ngôn ngữ máy đíchmà biên dịch thành file dạng “bytecode” – file *.class
• Mỗi HĐH sẽ có thể hiện riêng của máy ảo Java – JVM
• Mã bytecode làm việc với JVM và JVM làm việc với HĐH
CD1-CNPM - JAVA HIENLTH
• Hướng đối tượng
• Chạy trên mọi nền tảng
• Bảo mật
• Mạnh mẽ
• Phân tán
• Đa nhiệm, đa luồng
Ngôn ngữ lập trình Java
CD1-CNPM - JAVA HIENLTH
• JDK và các công cụ
(javac, java)
• Cấu hình JDK (path,class
path)
JDK
CD1-CNPM - JAVA HIENLTH
javac [option] sourcejavac (java
compiler)
java [option] classname[arguments]Java (java
interpreter)
JDK và các công cụ liên quan
CD1-CNPM - JAVA HIENLTH
Java IDE
•Eclipse, NetBeans, IntelliJ IDEA, …
CD1-CNPM - JAVA HIENLTH
Đối tượng
• Biểu diễn 1 đối tượng trong thế giới thực
• Mỗi đối tượng được đặc trưng bởi các thuộc tính và các
hành vi riêng của nó
CD1-CNPM - JAVA HIENLTH
• Lớp là một khuôn mẫu
của đối tượng
• Trong đó bao gồm các
thuộc tính của đối tượng
và các phương thức tác
động lên các thuộc tính
Lớp
CD1-CNPM - JAVA HIENLTH
Chương trình Java đầu tiên
• Viết ứng dụng tính diện tích hình chữ nhật (rectangle).
• Ứng dụng có một đối tượng – hình chữ nhật1. Nó là cái gì – Là hình chữ nhật
2. Nó có thể làm được điều gì? – Có thể tính diện tích
3. Để làm việc đó cần những dữ liệu gì? – Chiều dài và chiều rộng
• Tạo ra 2 lớp1. Lớp định nghĩa hình chữ nhật với 2 thuộc tính và 1 phương thức
2. Lớp chứa phương thức main để thực thi (báo cho JVM biết bắt đầu chương trình)
CD1-CNPM - JAVA HIENLTH
Rectangle class
CD1-CNPM - JAVA HIENLTH
RectangleDemo
CD1-CNPM - JAVA HIENLTH
Tên của lớp
1. Sử dụng quy tắc đặt tên
2. Luôn viết hoa chữ cái đầu tiên
3. Dùng danh từ để đặt tên
Dữ liệu thành phần
• Là những dữ liệu cần
phải cóKhởi dựng
• Định nghĩa cách
thức thể hiện 1 đối
tượng
• Có tên giống tên
lớp
• Giống như hàm
trong C nhưng
không có kiểu dữ
liệu trả về
Các phương thức (method)
• Những hành vi có thể
thực hiện
1. Như hàm trong C
2. Sử dụng động từ để đặt tên
3. Luôn viết thường chữ cái đầu
tiên
Phân tích lớp Rectangle
CD1-CNPM - JAVA HIENLTH
Phân tích lớp RectangleDemo
• Để thực thi chương trình, trình ứng dụng Java (Java application) bắt buộc phải có 1 lớp mà trong đó địnhnghĩa phương thức main.
• Phương thức main() trong lớp public được triệu hồi bởiJVM để bắt đầu thực thi ứng dụng.
CD1-CNPM - JAVA HIENLTH
Tạo đối tượng
• Đối tượng phải được tạo trước khi được sữ dụngtrong chương trình.
1. Khai báo 1 biến để lưu giữ tham chiếu đến đối tượng (đốitượng chỉ có thể được thao tác thông qua tham chiếu)
2. Tạo đối tượng: bằng cách sử dụng toán tử new (ngầm địnhgọi đến hàm khởi tạo – hàm dựng)
CD1-CNPM - JAVA HIENLTH
Triệu hồi phương thức
• Sử dụng toán tử dấu chấm (the '.' operator)
• Cú pháp (Syntax):• <tên biến đối tượng tham chiếu>‘.’<tên phương thức được gọi>
CD1-CNPM - JAVA HIENLTH
Việc sử dụng toán tử dấu
•Triệu hồi (gọi) phương thức (method)
•Truy xuất đến các dữ liệu thành phần (data
member)
•Được điều khiển bởi mức truy xuất của các
thành phần
CD1-CNPM - JAVA HIENLTH
Từ khóa trong JAVA
•Từ khóa cho các kiểu dữ liệu cơ bản : byte, short, int, long, float, double, char, boolean
•Từ khóa cho phát biểu lặp: do, while, for, break, continue
•Từ khóa cho phát biểu rẽ nhánh: if, else, switch, case, default, break
•Từ khóa đặc tả đặc tính một method: private, public, protected, final, static, abstract, synchronized, volatile..
•Literal value: true, false, null
•Từ khóa liên quan đến method: return, void
•Từ khoá liên quan đến package: package, import
CD1-CNPM - JAVA HIENLTH
Từ khóa trong Java(tt)
•Từ khóa cho việc quản lý lỗi: try, catch, finally,
throw, throws
•Từ khóa liên quan đến đối tượng: new, extends,
implements, class, instanceof, this, super
•Cách đặt tên (identifier):
•Bắt đầu bằng ký tự, ký tự gạch dưới (underscore
‘_’ ) hay ký tự ‘$’
•Sau đó là các ký tự ký số hay ‘_’, ‘$’ , không dùng
các ký tự khác như: khoảng trống, ký hiệu phép
toán
•Tên có tính chất case-sensitive
CD1-CNPM - JAVA HIENLTH
• Biến là một vị trí
trong bộ nhớ máy
tính, lưu trữ giá trị
và từ đó có thể
truy xuất giá trị đó
sau này
Biến
CD1-CNPM - JAVA HIENLTH
• Tên của biến, hàm
hoặc đối tượng người
dùng định nghĩa
• Tên biến phải bắt đầu
bằng ký tự, ký tự $
hoặc gạch dưới
• Ký tự tiếp theo là ký
tự, số, ký tự $ hoặc
gạch dưới
Định danh
CD1-CNPM - JAVA HIENLTH
• Tất cả toán tử được trình
biên dịch kiểm tra kiểu
để đảm bảo tính tương
thích về kiểu
• Có 8 kiểu dữ liệu nguyên
thuỷ cơ bản
Kiểu dữ liệu
CD1-CNPM - JAVA HIENLTH
Kiểu số nguyên
• Java định nghĩa 4 kiểu số nguyên byte, short, int và long
• Các kiểu số nguyên đều có số âm và số dương
• Java không hỗ trợ các kiểu số nguyên mà chỉ có số dương
CD1-CNPM - JAVA HIENLTH
Kiểu số thực
• Có hai kiểu số thực: float và double
• Kiểu float có kích thước 32 bit, double có kích thước 64 bit
CD1-CNPM - JAVA HIENLTH
Kiểu ký tự
Java sử dụng Unicode
Kiểu char là kiểu 16-bit không dấu có giá trị từ 0 đến 65536
CD1-CNPM - JAVA HIENLTH
Kiểu Boolean
Biến kiểu boolean chỉ có một trong hai giá trị true và false
CD1-CNPM - JAVA HIENLTH
Ví dụ
Dùng các ký tự đặc tả việc buộc phải xem xét trị thuộc 1 kiểu nào đó: i, I, l , L, f, F, d, D
nhưng L thường dùng thay cho l vì sợ nhầm với 1.
178 int (default) 45.62 double (default)
178L long 44.21f float
11.19e8 double (default)
‘z’ char , hằng ký tự để trong cặp nháy đơn (single quote character)
CD1-CNPM - JAVA HIENLTH
Hằng số (literals)
Hằng số có thể có kiểu là
một trong các kiểu nguyên
thuỷ
CD1-CNPM - JAVA HIENLTH
int i = 3;Kiểu int
long l = 12L;Kiểu long
Hằng số (literals)
double d = 10.19F;Kiểu
double
CD1-CNPM - JAVA HIENLTH
Ký tự đặc biệt (escape sequence)
• Một số ký tự như dấu nháy đơn, nháy kép có ý nghĩa đặc
biệt trong java nên không thể sử dụng trực tiếp
• Java cung cấp một số ký tự đặc biệt để thay thế cho các ký
tự đặc biệt
CD1-CNPM - JAVA HIENLTH
Khởi tạo giá trị cho biến
trước khi sử dụng biến
Biến có thể khởi tạo động
khi được gán giá trị trong
biểu thức
Biến
CD1-CNPM - JAVA HIENLTH
Phạm vi và vòng đời của biến
•Biến có thể khai báo trong các khối lệnh (block)
•Biến được khai báo trong khối lệnh sẽ không
thể truy cập ở ngoài khối lệnh đó
CD1-CNPM - JAVA HIENLTH
Toán tử
•Toán tử là các ký hiệu để thực hiện các thao tác
trên các toán hạng
•Bao gồm các toán tử số học, bit, quan hệ, logic,
và các toán tử khác
CD1-CNPM - JAVA HIENLTH
Chuyển đổi kiểu khi khởi tạo giá trị
•Giá trị của phần tử bên phải được chuyển đổi
thành kiểu của phần tử bên trái
CD1-CNPM - JAVA HIENLTH
Chuyển đổi kiểu tự động
•Hai kiểu tương thích với nhau
•Kiểu của phần tử bên phải biển thức lớn hơn
kiểu của phần tử bên trái
CD1-CNPM - JAVA HIENLTH
Chuyển đổi kiểu ép buộc
•Kiểu của phần tử bên phải biển thức nhỏ hơn
kiểu của phần tử bên trái
CD1-CNPM - JAVA HIENLTH
java.lang package
• Gói cơ bản của ngôn ngữ java (language)
• Tự động chèn chương trình
• Chứa các Lớp cơ bản hỗ trợ cho lập trình trong Java
• Lớp Math chứa các phương thức tĩnh (static) hỗ trợ
cho việc tính toán số học
CD1-CNPM - JAVA HIENLTH
java.lange package(tt)
• Một số hàm toán học (Lưu ý cách dùng hàm toán: Math.TênHàm(thamSố)abs(TrịSố) : lấy trị tuyệt đối
int n= -5, m ; m = Math.abs(n); // m=5
• Hàm ceil(x) Số tròn lên <=x (trần)
Math.ceil(8.02) 9.0 Math.ceil(-1.3) -1.0
Math.ceil(100) 100.0
• Hàm floor(x) làm tròn xuống (sàn)
Math.floor( -5.63 ) -6.0 Math.ceil(100) 100.0
• Hàm max(x,y) Trị lớn trong 2 số
• Hàm min(x,y)
• Hàm random() trả về 1 số ngẫu nhiên từ 0.0 đến 1.0
• Hàm round (sốthực) Math.round(34.5) 35
CD1-CNPM - JAVA HIENLTH
Cấu trúc điều khiển – Rẽ nhánh
•Cấu trúc if
if (Condition)
{
Statements;
}
else
{
Statement;
}
• Cấu trúc switch
switch (Expression)
{
case Cons1:
Statements; break;
case Cons2:
Statements; break;
. . .
default : Statements;
}
CD1-CNPM - JAVA HIENLTH
Cấu trúc điều khiển – Lặp
while (condition)
{
Statements;
}
do
{
Statements;
}
while (condition);
for ( varInit ; Condition ; Statements)
{
Statements1;
}
Cắt vòng lặp: break [ label_name];
Bỏ qua 1 lần lặp : continue;
CD1-CNPM - JAVA HIENLTH
Mảng – Array
• Mảng= Nhóm trị cùng kiểu, kề nhau, cùng tên gọi, truy xuất phần tử bằng chỉ số đi từ 0
• Định nghĩa có chỉ định số phần tử (size
char ch[] = new char [5];
• Khai báo và khởi tạo
int a[] = { 1,4,2,7,8}; // hoặc
int [] a = { 1,4,2,7,8};
• Phần tử được tham khảo qua chì số bắt đầu từ 0
ch[0] ch[1] ch[2] ch[3] ch[4]
• Chỉ khai báo: không chỉ định size : long a[];
• Khi sử dụng phải cấp bộ nhớ: a= new long [20];
• Trị mặc định : Toán tử new sẽ xóa bộ nhớ, các bit = 0)
CD1-CNPM - JAVA HIENLTH
Mảng 1 chiều - minh họa
// file ArrayDemo.java
import java.io.*;
class ArrayDemo
{
public static void main(String args[])
{ int a1[] = { 1, 2,3,4,5};
int a2[];
a2 = new int [5];
int i;
for (i=0;i<5;++i) a2[i] = 2*a1[i];
long S= 0;
for (i=0;i<5;++i) S+= a1[i] +a2[i];
System.out.print("Sum of 2 arrays:");
System.out.println(S);
}
}
Kết qủa:
Sum of 2
arrays:45
Press any key to
continue...
CD1-CNPM - JAVA HIENLTH
Mảng 2 chiều - Minh họaMẫu CT Java
CD1-CNPM - JAVA HIENLTH
Nhập xuất dữ liệu.
• Nhập xuất dữ liệu là tác vụ mức hệ thống• Gói java.io chứa các lớp cho việc xuất nhập.• Cần tham khảo gói này.• Java cung cấp class System mô tả hệ thống• System.out là đối tượng xuất mặc định (màn hình)• System.in là đối tượng nhập mặc định (bàn phím)
Methods xuất dữ liệu ra màn hình: System.out.print(Dữ liệu xuất);System.out.println(Dữ liệu xuất);
Dữ liệu xuất có thể là : ký tự, số, chuỗi,…
CD1-CNPM - JAVA HIENLTH
Đặc tả định dạng
•Định dạng thông tin xuất ra trên màn hình.
•Sử dụng:
• printf(String format, Object... args)
CD1-CNPM - JAVA HIENLTH
Ví dụ về đặc tả định dạng
CD1-CNPM - JAVA HIENLTH
Nhập giá trị - Read values
• Sử dụng lớp Scanner class (java.util package)• Cho phép đọc các giá trị của các kiểu dữ liệu khác nhau.
• Truyền theo kiểu InputStream tới hàm dựng
• Đọc chuỗi dùng phương thức next()
To read numerical values from user, use method
CD1-CNPM - JAVA HIENLTH
Ví dụ về lớp Scanner
CD1-CNPM - JAVA HIENLTH
Nhập xuất dữ liệu bằng hộp thoại
• Java cung cấp một số hộp thoại chuẩn (common dialog) giúp:
• Thông báo cho người dùng biết về một tình huống.
• Để nhận dữ liệu từ người dùng thông qua cách chọn lựa hoặc người dùng phải nhập liệu vào một ô text.
• Lớp JOptionPane trong gói javax.swing
CD1-CNPM - JAVA HIENLTH
Lớp JOptionPane- Cách dùng
• import javax.swing.*;
•Khi cần xuất một thông báo:
JOptionPane.showMessageDialog(this,”message");
Người dùng phải kích nút OK của hộp thoại
•Khi cần nhập 1 chuỗi:
String s= JOptionPane.showInputDialog(this,"Please
input","12");
* “12” là trị ta muốn làm trị mặc định.
* Sau khi có S, ta có thể đối sang kiểu khác tùy ý.
CD1-CNPM - JAVA HIENLTH
Lớp JOptionPane- Cách dùng
•Khi cần user xác nhận 1 điều gì:
int Response=JOptionPane.showConfirmDialog(null,"Confirm?");
Các hằng trả về:
JOptionPane.OK_OPTION // nút OK – trị 0
JOptionPane.NO_OPTION // nút NO – trị 1
JOptionPane.CANCEL_OPTION // nút Cancel – trị 2
CD1-CNPM - JAVA HIENLTH
Lớp JOptionPane- Cách dùng
Khi cần user chọn một trong nhóm trị:
Object Options[]= { "One", "Two", "Three", "Four"};
int Choice=JOptionPane.showOptionDialog(this,"Choose one","Options", JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE,
null,Options,Options[0]);
Trả trị: số nguyên từ 0 trở lên mô tả vụ trí mục được chọn.
Trong thí dụ trên là 0,1,2,3
CD1-CNPM - JAVA HIENLTH
Thí dụ
CD1-CNPM - JAVA HIENLTH
Tóm tắt dạng câu hỏi
• Liệt kê 6 kiểu số cơ bản của Java và số bit bộ nhớ sẽ chiếm dụng của chúng khi lưu trữ trị.
• Kiểu luận lý (logic) trong java tên là gì?
• Kiểu ký tự tên là gì? chiếm mấy byte?
• Biến là gì? Hãy cho biết 3 tính chất của biến.
• Hãy liệt kê 4 loại toán tử trong java.
• Hãy cho biết kết qủa của biểu thức sau :
a) 4 && 7 b) 4&7 c) 0 || 8 d) 0 | 8 e) 8 ^ 3
f) 4 >> 3 g) 9 << 2 h ) (9 >>3) ? 5 : -3
• Trong java có phát biểu goto hay không ?
• Mảng là gì ? Mảng in-line là gì ?
• int a[] = new int { 1,2,3,9,0}; đúng hay sai?
• System.out.println( 12 & 9); sẽ xuất trị bao nhiêu?
• Phân tích dòng code: if (5&7>0 && 5|3) System.out(“Hello”) ;
• int m= System.in.read(); nếu gõ vào phím ‘C’, trị biến m là bao nhiêu?
CD1-CNPM - JAVA HIENLTH
Bài tập
Viết các chương trình sau:
(1) Xuất bảng cửu chương từ 2 đến 9.
(2) Xuất trị bình phương, lập phương từ 1 đến 10.
(3) Tạo 1 mảng số int dạng in-line 10 phần tử, xuất mảng này tăng dần.
(4) Nhập 1 mảng int các số mang trị là mã của các ký tự nhập từ bàn phím. Xuất mảng này dạng chữ rồi xuất mã của chúng.
(5) Xuất 100 số Fibonacci đầu tiên. Dãy Fibonacci : 1,1,2,3,5,8,… 2 số đầu là 1, các số sau bằng tổng 2 số trước nó.
CD1-CNPM - JAVA HIENLTH
Nhắc về Hướng đối tượng
CD1-CNPM - JAVA HIENLTH
Hướng đối tượng
•Đóng gói
•Kế thừa
•Đa hình
CD1-CNPM - JAVA HIENLTH
Thừa kế - Bài tập làm tại chỗ
Phân tích phân cấp thừa kế cho các lớp:
•Hàng điện máy <mã hàng, tên hàng, nhà sản xuất, giá, thời gian bảo hành, điện áp, công suất>
•Hàng sành sứ < mã hàng, tên hàng, nhà sản xuất, giá, loại nguyên liệu>
•Hàng thực phẩm <mã hàng, tên hàng, nhà sản xuất, giá, ngày sản xuất, ngày hết hạn dùng>
CD1-CNPM - JAVA HIENLTH
Thừa kế- Bài tập về nhà
Phân tích phân cấp thừa kế cho các đối tượng trong một học viện:
•Nhân viên quản lý <mã nv, tên nv, năm sinh, trình độ, trường đào tạo, chuyên môn, lương cb, phụ cấp chức vụ>
•Nhân viên nghiên cứu <mã nv, tên nv, năm sinh, trình độ, trường đào tạo, chuyên môn, lương cb, phụ cấp độc hại>
•Nhân viên phục vụ<mã nv, tên nv, năm sinh, trình độ, lương cb>
CD1-CNPM - JAVA HIENLTH
Toán tử new có thể không
tạo mới đối tượng thành
công vì thiếu bộ nhớ
Garbage collection sẽ tự
động dọn dẹp bộ nhớ
không cần thiết mà không
cần can thiệp bằng code
Garbage collection và Finalizer
CD1-CNPM - JAVA HIENLTH
Phương thức finalize() được gọi
trước khi đối tượng bị hủy bởi
garbage collection
Trong phương thức finalize xác
định các hành động phải thực
hiện trước khi hủy đối tượng
Garbage collection và Finalizer
CD1-CNPM - JAVA HIENLTH
Từ khóa this
this tham chiếu tới lớp mà
phương thức được gọi
CD1-CNPM - JAVA HIENLTH
super
Truy cập đến các thành viên của lớp cha bằng
cách sử dụng từ khóa super
Có thể sử dụng super để truy cập đến hàm tạo
của lớp cha
CD1-CNPM - JAVA HIENLTH
Xử lý lỗi và ngoại lệ
CD1-CNPM - JAVA HIENLTH
Phân loại Error - Exception• Error :
• Các lỗi biên dịch: lỗi logic, lỗi cú pháp.
• các lỗi không bình thường, khó dự đoán, không có khả năng phục
hồi: hết bộ nhớ, lỗi hệ thống, môi trường
• Exception (ngoại lệ): tình huống bất bình thường xảy ra trong quá
trình thực thi chương trình và khiến chương trình bị ngắt đột ngột. VD:
thực hiện phép chia cho 0, đọc một file không tồn tại, thao tác vượt
quá chỉ số mảng, đối số không hợp lệ…
69
CD1-CNPM - JAVA HIENLTH
Cách xử lý lỗi truyền thống - VD
70
CD1-CNPM - JAVA HIENLTH
Cách xử lý lỗi truyền thống
• Cài đặt mã xử lý tại nơi phát sinh lỗi
• Làm chương trình trở nên khó hiểu
• Không phải lúc nào cũng đầy đủ thông tin để xử lý
• Không nhất thiết phải xử lý
• Truyền trạng thái lên mức trên
• Thông qua tham số, giá trị trả lại hoặc biến tổng thể (flag)
• Dễ nhầm
• Khó hiểu
• Khó kiểm soát được hết các trường hợp
• Lập trình viên thường quên không xử lý lỗi
71
CD1-CNPM - JAVA HIENLTH
Xử lý ngoại lệ (Exception Handling)
• Dựa trên cơ chế ném và bắt ngoại lệ
• Ném ngoại lệ: dừng chương trình và chuyển điều khiển lên
mức trên (nơi bắt ngoại lệ).
• Bắt ngoại lệ: xử lý ngoại lệ.
• Ngoại lệ là đối tượng mang thông tin về lỗi đã xảy ra
• Ngoại lệ có thể được ném tự động.
• Hoặc ném tường minh.
72
CD1-CNPM - JAVA HIENLTH
Xử lý ngoại lệ trong Java
• Các loại lỗi & ngoại lệ đều được biểu diễn bởi các lớp Error
& Exception kế thừa từ lớp java.lang.Throwable
• Exception chứa thông tin về tình huống lỗi, bao gồm kiểu lỗi,
trạng thái của chương trình khi lỗi xảy ra.
• Hệ thống JVM chịu trách nhiệm tìm kiếm mã chương trình
dành cho việc xử lý ngoại lệ
73
Object
Throwable
ExceptionError
AWTError
ThreadDead
…
SQLException
ClassNotFoundException
…
RuntimeException
ArithmeticException
NullPointerException
NumberFormatException
…
CD1-CNPM - JAVA HIENLTH
Ưu điểm cơ chế xử lý ngoại lệ của Java
• Dễ sử dụng
• Dễ dàng chuyển điều khiển đến nơi có khả năng 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 thuật toán → Làm chương trình dễ đọc
hơn
• Tách mã xử lý.
• Sử dụng cú pháp khác.
• Không bỏ sót ngoại lệ → Làm chương trình an toàn hơn.
74
CD1-CNPM - JAVA HIENLTH
Xử lý ngoại lệ trong Java
• Có 2 cách để xử lý ngoại lệ trong Java:
• Dùng khối try… catch… finally
• Tuyên bố ném ngoại lệ dùng khai báo throw (ném ngoại lệ
tường minh)
75
CD1-CNPM - JAVA HIENLTH
Khối Try… Catch… Finally
try{
//- Đoạn lệnh có nguy cơ phát sinh Exception
//- Sẽ kết thúc thi hành các lệnh còn lại để nhảy sang khối catch
// khi có lỗi xảy ra
}catch (Exception e){
//- Xử lý tương ứng khi có ngoại lệ
//- Thông tin về lỗi lưu trữ trong e
//- Nếu có nhiều loại Exception thì có thể dùng nhiều khối catch
}
finally{ //optional
//Luôn được thực hiện bất kể có lỗi xảy ra hay không, thường
//để thực hiện các công việc “dọn dẹp”
}
76
CD1-CNPM - JAVA HIENLTH
Các loại Exception
Exception Description
Exception Root class of exception hierachy
RuntimeException Base class for many java.lang exceptions
ArithmeticException Arimetic error condition, such as devide by zero
IllegalArgumentException Method received illegal argument
ArrrayIndexOutOfBoundsException Array size <0 or greater than actual array size
NullPointerException Attempt to access null object member
SecurityException Security settings do not allow operation
ClassNotFoundException Unable to load requested class
NumberFormatException Invalid conversion of a string to a numeric float
AWTException Exception in AWT
IOException Root class for I/O exceptions
FileNotFoundException Unable to locate a file
EOFException End of file
…
CD1-CNPM - JAVA HIENLTH
Ví dụ - Bẫy lỗi tổng quát
Dùng đối tượng mức tổng
quát ( lớp Exception). Xem
lại hình vẽ về cấu trúc quản
lý lỗi của Java trong các
slide trước
78
CD1-CNPM - JAVA HIENLTH
Ví dụ - bẫy lỗi không đúng dạng số
79
CD1-CNPM - JAVA HIENLTH
Ví dụ - multiple catch Class MultipleCatch{
public static void main (String args[]) {
try{
String num = args[0];
int numValue = Integer.parseInt(num);
System.out.println(“The square is: “ + numValue*numValue);
}
catch (ArrayIndexOutOfBoundsException ne){
System.out.println(“No arguments given!”);
}
catch (NumberFormatException nb){
System.out.println(“Not a number !”);
}
}
}
CD1-CNPM - JAVA HIENLTH
Mệnh đề throws - throw
• Mệnh đề throws – throw dùng để ném ngoại lệ.
• Có thể không xử lý ngoại lệ ngay trong phương thức do:
• Không đủ thông tin để xử lý
• Không đủ quyền
• Sử dụng từ khóa throws để liệt kê các ngoại lệ mà phương
thức muốn ném.
throws ThrowableInstance_1, ThrowableInstance_2,…
• Sử dụng từ khóa throw để chỉ có exeption đã xảy ra.
throw ThrowableInstance
81
CD1-CNPM - JAVA HIENLTH
Ném ngoại lệ khỏi phương thức - VD
pucblic class ThrowExample
{
public void exceptionExample(){
try
{check();
}catch (Exception e)
{//…}
}
void check() throws NullPointerException, NegativeArraySizeException
{
if(flag < 0)
throw new NullPointerException();
if(arrSize < 0 )
throw new NegativeArraySizeException();
}
}
82
CD1-CNPM - JAVA HIENLTH
Ném lại ngoại lệ
• Sau khi bắt ngoại lệ, nếu thấy cần thiết chúng ta có thể ném
lại chính ngoại lệ vừa bắt được để cho chương trình mức trên
tiếp tục xử lý
83
CD1-CNPM - JAVA HIENLTH
Lan truyền ngoại lệ
• Lỗi lan truyền từ trong ra cho đến khi gặp bẫy lỗi hoặc tới main và ứng dụng bị ngưng nếu ngoại lệ vẫn chưa được xử lý.
84
main()
A()
B()
C() Exception
Chiều gọi hàm
Chiều lan truyền lỗi
catch(...)
CD1-CNPM - JAVA HIENLTH
Lần vết ngoại lệ - printStackTrace()
• Phương thức printStackTrace() thuộc lớp Exception dùng để
lần vết vị trí phát sinh ngoại lệ.
• Phương thức printStackTrace() giúp in ra các thông tin liên
quan đến ngoại lệ như:
• Nguyên nhân gây ra ngoại lệ
• Ngoại lệ được phát sinh tại những hàm nào, dòng code
nào.
85
CD1-CNPM - JAVA HIENLTH
Tự định nghĩa ngoại lệ
• Chúng ta có thể tự tạo lớp định nghĩa ngoại lệ để
phục vụ các mục đích riêng.
• Lớp ngoại lệ mới phải được kế thừa từ lớp
Exception hoặc các lớp dẫn xuất của lớp này.
86
CD1-CNPM - JAVA HIENLTH
Tự định nghĩa ngoại lệ - VD
Class ArraySizeException extends NegativeArraySizeException{
ArraySizeException() {
super(“You have passed illegal array size”);
}
}//end of ArraySizeException class
Class UserDefineException{
int size, array[];
UserDefineException(int val) {
size = val;
try{
checkSize();
}
catch (ArraySizeException e){
System.out.println(e);
}
}
// còn ở slide tiếp87
CD1-CNPM - JAVA HIENLTH
Tự định nghĩa ngoại lệ - VD
void checkSize() throws ArraySizeException {
if (size < 0)
throw new ArraySizeException ();
array = new int[3];
for(int count = 0; count<3; count++)
array[count] = count + 1;
}
public static void main (String arg[])
{
new UserDefineException (Integer.parseInt(arg[0]));
}
}//end of UserDefineException class
88
CD1-CNPM - JAVA HIENLTH
Bài tập
1. Viết chương trình cho phép tính giá trị của biểu
thức:
A =
Yêu cầu xử lý các ngoại lệ có thể xảy ra.
2. Viết chương trình cho phép tạo một mảng 2 chiều
cỡ mxn với m,n nhập từ bàn phím. Cài đặt các xử
lý ngoại lệ cần thiết.
89
5x - y
2x + 7y
CD1-CNPM - JAVA HIENLTH
Bài tập
3. Xây dựng lớp ngoại lệ DateException cho các lỗi
về ngày tháng.
4. Viết chương trình cho phép người dùng nhập vào
ngày, tháng năm, nếu thông tin này không hợp lệ
sẽ tung ra một ngoại lệ DateException, sau đó
thông báo cho người nhập biết và cho phép người
dùng nhập lại.90
CD1-CNPM - JAVA HIENLTH
Câu hỏi và thảo luận
CD1-CNPM - JAVA HIENLTH