Lê đình Thanh, Các lớp thiết yếu trong JavaBắt và xử lý ngoại lệ Call Stack main writeList PrintWriter FileWriter main writeList PrintWriter FileWriter Tìm handler Tìm handler Ném Chuyển
Trang 1Lê đình Thanh, Các lớp thiết yếu trong Java
Lê đình Thanh
Bộ môn Mạng và Truyền thông Máy tắnh Khoa Công nghệ Thông tin Trường đại học Công nghệ, đHQGHN
Bài giảng
LẬP TRÌNH JAVA
Các lớp thiết yếu
Bài 6
Trang 2Lê đình Thanh, Các lớp thiết yếu trong Java
Nội dung
Ớ Xử lý ngoại lệ
Ớ Vào, ra cơ bản
Ớ Xử lý ựồng thời
Ớ Biểu thức chắnh quy
Ngoại lệ
Ớ Ngoại lệ (exception hay exceptional event) là sự kiện xảy
ra trong khi thực thi chương trình và phá vỡ luồng ựiều khiển của chương trình
Ớ Khi lỗi xuất hiện
Ớ Phương thức xuất hiện lỗi tạo ựối tượng ngoại lệ (exception object) chứa thông tin về lỗi và gửi cho hệ thống thực thi (runtime system) Việc tạo và gửi ựối tượng ngoại lệ cho hệ thống thực thi ựược gọi làném(throw) ngoại lệ
Ớ Hệ thống thực thi tìm ngượcchuỗi triệu gọi(call stack) phương thức ựể tìm ra phương thức chứa ựoạn mã xử lý ngoại lệ (exception handler)
Trang 3Lê đình Thanh, Các lớp thiết yếu trong Java
Xử lý ngoại lệ
for the exception handler
Bắt và xử lý ngoại lệ
try {
//mã chương trình xử lý nghiệp vụ
}
catch (ExceptionType1 e) {
//mã xử lý ngoại lệ nếu ngoại lệ thuộc kiểu ExceptionType1
}
[catch (ExceptionType2 e) {
//mã xử lý ngoại lệ nếu ngoại lệ thuộc kiểu ExceptionType2
}
finally {
//mã thực thi bất kể ngoại lệ xảy ra hay không
}]
Trang 4Lê đình Thanh, Các lớp thiết yếu trong Java
Bắt và xử lý ngoại lệ
Entering try statement Closing PrintWriter
Mã ựược thực thi
Kết quả in ra màn hình
Bắt và xử lý ngoại lệ
Entering try statement Caught IOException: OutFile.txt
PrintWriter not open
Mã ựược thực thi
Kết quả in ra màn hình
Trang 5Lê đình Thanh, Các lớp thiết yếu trong Java
Bắt và xử lý ngoại lệ
Call Stack
main
writeList
PrintWriter
FileWriter
main writeList PrintWriter
FileWriter
Tìm handler
Tìm handler
Ném
Chuyển tiếp
Bắt
Ném ngoại lệ
Ớ Mọi ngoại lệ ựều phải ựược phát sinh ở một phương thức trước khi ựược chuyển tiếp và bắt ở các phương thức triệu gọi
Ớ Một phương thức có thể phát sinh ngoại lệ và phương thức triệu gọi có thể bắt và xử lý
Ớ Áp dụng khi viết gói, vắ dụ gói xử lý danh sách
Ớ để người viết ứng dụng có thể xử lý theo ý của họ
public Object pop() {
Object obj;
if (size == 0) { throw new EmptyStackException(); }
obj = objectAt(size - 1);
setObjectAt(size - 1, null);
size ;
return obj;
}
Trang 6Lê đình Thanh, Các lớp thiết yếu trong Java
Chuyển tiếp ngoại lệ
Ớ Một phương thức có thể không bắt và xử lý ngoại lệ mà chuyển tiếp cho phương thức ựã triệu gọi nó (phương thức liền trước trong chuỗi triệu gọi)
Ớ Áp dụng khi viết gói, vắ dụ gói xử danh sách
Ớ để người viết ứng dụng có thể xử lý theo ý của họ
public void writeList() throws IOException,
ArrayIndexOutOfBoundsException {
PrintWriter out = new PrintWriter(new
FileWriter("OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + vector.elementAt(i)); }
out.close();
}
Các lớp ném ựược
Ớ Các lớp Error ựịnh nghĩa các sự cố nghiêm trọng, thuộc JVM Các ứng dụng thường không ném và bắt Error
Ớ Các lớp Exception ựịnh nghĩa các ngoại lệ khi viết gói
Trang 7Lê đình Thanh, Các lớp thiết yếu trong Java
định nghĩa lớp ngoại lệ
Lê đình Thanh, Các lớp thiết yếu trong Java
Ớ định nghĩa lớp ngoại lệ ứng với các ngoại lệ phát sinh trong lớp ựược ựịnh nghĩa
Vắ dụ, lớp LinkedList với các phương thức
objectAt(int n) Ở Lấy ựối tượng ở vị trắ thứ n Ờ Ném ngoại lệ
InvalidIndexException nếu n < 0 hoặc n >= size
firstObject() Ở Lấy ựối tượng ựầu tiên Ờ Ném ngoại lệ EmptyListException khi
danh sách rỗng
indexOf(Object o) Ở Tìm ựối tượng Ờ Ném ngoại lệ ObjectNotFoundException nếu
không tìm thấy.
Lợi ắch của sử dụng ngoại lệ
Ớ Tách mã xử lý lỗi với các mã xử lý nghiệp vụ
Ớ Chuyển tiếp lỗi lên các phương thức ở trên
Trang 8Lê đình Thanh, Các lớp thiết yếu trong Java
Vào/ra cơ bản
Ớ Vào/ra với tệp (File I/O)
Các dòng vào/ra
Ớ Một dòng vào/ra (I/O stream) biểu diễn một nguồn
vào/ựắch ra dữ liệu
Ớ Có thể biểu diễn nhiều nguồn/ựắch khác nhau: bộ ựệm, tệp, thiết bị, chương trình khác
Ớ Hỗ trợ nhiều kiểu dữ liệu khác nhau: byte, dữ liệu nguyên thủy, ựối tượng
Ớ Phương thức cơ bản: read()/write(data)
Trang 9Lê đình Thanh, Các lớp thiết yếu trong Java
Byte streams
Ớ Biểu diễn dòng dữ liệu gồm các bytes liên tiếp
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) { out.write(c); }
} finally {
if (in != null) { in.close(); }
if (out != null) { out.close(); }
}
Character Streams
Ớ Biểu diễn dòng các ký tự liên tiếp
Ớ Tự ựộng chuyển ựổi các mã thành Unicode
Ớ Dòng vào: XXXInputReader, phương thức ựọc int read()
Ớ Dòng ra: XXXOutputWriter, phương thức ghi write( int)
Ớ Mã ký tự ựược lưu ở 16 bit thấp của int
FileReader in = null; FileWriter out = null;
try {
in = new FileReader("xanadu.txt");
out = new FileWriter("outagain.txt");
int c;
while ((c = in.read()) != -1) { out.write(c); }
} finally {
if (in != null) { in.close(); }
if (out != null) { out.close(); }
}
Trang 10Lê đình Thanh, Các lớp thiết yếu trong Java
đọc/ghi theo dòng
Ớ Character stream thường chứa nội dung của cả văn bản: gồm nhiều dòng (lines) văn bản
Ớ Một line là một chuỗi ký tự kết thúc bằng ký tự xuống dòng:
Ổ\r\nỖ, Ổ\nỖ hoặc Ổ\rỖ
Ớ đọc/ghi cả dòng văn bản là phương pháp hiệu quả hơn ựọc từng ký tự
BufferedReader in = null; PrintWriter out = null;
try {
in = new BufferedReader(new FileReader("xanadu.txt"));
out = new PrintWriter(new FileWriter("outagain.txt"));
String l;
while ((l = in.readLine()) != -1) { out.println(l); }
} finally {
if (in != null) { in.close(); }
if (out != null) { out.close(); }
}
Buffered Streams
Ớ Các dòng không ựệm (unbuffered) như FileInputStream, FileReader, Ầ làm việc trực tiếp với HđH, các thao tác ựọc ghi ựược quản lý trực tiếp bởi HđH
Ớ Thao tác ựọc: ựọc từ thiết bị
Ớ Thao tác ghi: ghi ngay ra thiết bị
Ớ Không hiệu quả vì nhiều lần phải truy cập ựĩa, mạng, Ầ
Ớ Giải pháp: Sử dụng dòng ựệm (buffered) ựể ựọc/ghi cả khối
=> ắt lần truy cập phần cứng
Ớ đọc: Khi vùng ựệm rỗng, ựọc từ nguồn vào ựầy ựệm
Ớ Ghi: Khi vùng ựệm ựầy, ghi tất cả vào ựắch
Ớ Nếu cần chủ ựộng ghi ra ựắch khi chưa ựầy ựệm: Gọi flush()
Trang 11Lê đình Thanh, Các lớp thiết yếu trong Java
Scanner
Ớ Cung cấp các phương thức ựể ựọc từng từ tố (token) trong character stream, phân loại từ tố (số nguyên, số thập phân,
Ầ)
Ớ Từ tố ựơn thuần là xâu ký tự Character stream là dãy liên tiếp các từ tố và các từ phân cách (separator/delimiter) Giữa hai từ phân cách liên tiếp là một từ tố Giữa hai từ tố có thể có nhiều từ phân cách
Ớ Mặc ựịnh, dấu trắng (blank, tab, dấu câu, Ầ) ựược dùng làm
từ phân cách
Ớ để kiểm tra một ký tự có phải là dấu trắng hay không
Character.isWhitespace.
useDelimiter(",\\s*")
Scanner
Ớ đọc các từ tố
import java.io.*;
import java.util.Scanner;
Scanner s = null;
try {
s = new Scanner(new BufferedReader(new
FileReader("xanadu.txt")));
while (s.hasNext()) { System.out.println(s.next()); }
} finally { if (s != null) { s.close(); } }
Trang 12Lê đình Thanh, Các lớp thiết yếu trong Java
Scanner
Ớ đọc từ tố ựược phân loại
s.useLocale(Locale.US);
while (s.hasNext()) {
if (s.hasNextDouble()) {
sum += s.nextDouble();
}
else {
s.next();
}
}
Printing and Formatting
Ớ Hai lớp cơ sở thực cung cấp phương thức print, println và format là
Ớ PrintWriter: một chacracter stream
Ớ PrintSteam: một byte stream
Ớ print và println
Ớ Có một tham số có kiểu nguyên thủy
Ớ Biến ựổi một giá trị thành xâu và in xâu
int i = 2; double r = Math.sqrt(i);
System.out.print("The square root of "); System.out.print(i); System.out.print(" is ");
Trang 13Lê đình Thanh, Các lớp thiết yếu trong Java
Printing and Formatting
Ớ format
Ớ Có một hoặc nhiều tham số bất kỳ
Ớ Tham số ựầu tiên là xâu ký tự có thể chứa ký tự ựịnh dạng (%d, %f, %s, Ầ)
Ớ Các tham số tiếp theo có kiểu nguyên thủy
Ớ Thay ký tự ựịnh dạng thứ i trong xâu tham số thứ nhất bằng biểu diễn giá trị tham số thứ i+1 theo ựịnh dạng ựược xác ựịnh bởi ký tự ựịnh dạng thứ i Trả về xâu tham số thứ nhất ựã ựược thay các ký tự ựịnh dạng bằng giá trị tham
số phắa sau
int i = 2; double r = Math.sqrt(i);
System.out.format("The square root of %d is %f.%n", i, r);
Vào/ra với dòng lệnh
Ớ System.in Ờ là một byte stream để dùng như một
character stream, sử dụng lớp baoInputStreamReader
InputStreamReader cin = new
InputStreamReader(System.in);
Ớ System.out và System.err Ờ là các byte streams nhưng có
thể mô phỏng character stream
Ớ Console - sử dụng thay thế cho các dòng vào/ra chuẩn với
các phương thức thuận tiện hơn: readLine, readPassword, format, Ầ
Trang 14Lê đình Thanh, Các lớp thiết yếu trong Java
Data Stream
Ớ Các dòng vào/ra cho các kiểu dữ liệu nguyên thủy
Ớ Hai lớp hay dùng là DataInputStream với các phương thức readTTT, và DataOutputStream với các phương thức writeTTT, trong ựóTTT là tên kiểu dữ liệu nguyên thủy
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
out.writeDouble(price);
out.writeInt(unit);
out.writeUTF(desc);
in = new DataInputStream(new BufferedInputStream(new
FileInputStream(dataFile)));
price = in.readDouble();
unit = in.readInt();
desc = in.readUTF();
Object Stream
Ớ Dòng vào/ra cho ựối tượng
Ớ Các ựối tượng có thể ghi vào/ựọc từ dòng phải thuộc lớp cài ựặt giao diện Serializable
Ớ Hai lớp hay dùng là ObjectInputStream với phương thức readObject() và ObjectOutputStream với phương thức writeObject(obj)
Ớ Khi ghi vào/ựọc ra một ựối tượng, các ựối tượng ựược tham chiếu cũng ựược ghi/ựọc theo
Trang 15Lê đình Thanh, Các lớp thiết yếu trong Java
Object Stream
Ớ Một dòng chỉ lưu ựối tượng duy nhất một lần, nếu ghi nhiều lần thì nhiều tham chiếu ựược ghi
Ớ Nếu ghi một ựối tượng vào hai dòng khác nhau thì khi ựọc ra ựược 2 ựối tượng khác nhau
Môi trường nền
Ớ Môi trường nền (platform environment) = hệ ựiều hành, máy
ảo Java, thư viện các lớp, dữ liệu cấu hình
Ớ CácAPI ựể cấu hình môi trường nền:
Ớ Các tiện ắch cấu hình
Ớ Thông số cấu hình
Ớ Biến môi trường
Ớ Các tiện ắch hệ thống
Ớ Thông số hệ thống
Ớ Quản lý an ninh (tự ựọc)
Ớ Một số phương thức hệ thống (tự ựọc)
Ớ CLASS và CLASSPATH (tự ựọc)
Trang 16Lê đình Thanh, Các lớp thiết yếu trong Java
Thông số cấu hình
Ớ Một thông số cấu hình là một cặp xâu ký tự khóa/giá trị, vắ dụ
LastBrowsedTabs=Ộhttp://dantri.com.vn;http://uet.vnu.edu.vnỢ
Ớ Các thông số cấu hình ựược lưu ở một tệp cấu hình (thường ở dạng văn bản), ựược chương trình ựọc vào khi khởi ựộng và lưu lại trước khi kết thúc
Ớ Trong thời gian thực thi, chương trình sử dụng ựối tượng Properties ựể
thao tác với các thông số cấu hình
Properties
-k1 v1 k2 v2
Ầ
-load(is) store(os)
Tệp cấu hình
-k1 v1
k2 v2
FileOutputStream
Thông số cấu hình
Ớ đọc cấu hình từ tệp
Properties applicationProps = new Properties();
FileInputStream in = new
FileInputStream("appProperties.config");
applicationProps.load(in);
in.close();
Ớ Ghi cấu hình ra tệp
FileOutputStream out = new FileOutputStream("
appProperties.config ");
applicationProps.store(out, " -Comments -");
Trang 17Lê đình Thanh, Các lớp thiết yếu trong Java
Thông số cấu hình
Ớ Properties cung cấp hàng loạt các phương thức ựể ựọc và cập nhật thông số
getProperty(String key)
getProperty(String key, String default)
setProperty(String key, String value)
contains(Object value)
containsKey(Object key)
list(PrintStream s)
list(PrintWriter w)
elements()
keys()
propertyNames()
stringPropertyNames()
size()
remove(Object key)
Properties kế thừa Hashtable cài ựặt một bảng băm nên các thao tác tìm theo khóa rất hiệu quả
Tham số dòng lệnh
Ớ Khi gọi một chương trình bằng lệnh java TenCT, chúng ta
có thể cung cấp các tham số cho chương trình
public class SomeClass {
public static void main (String[] args) {
for (String s: args) { System.out.println(s); } }
}
java SomeClass ỘA sunny dayỢ ỘWe go outỢ
A sunny day
We go out
Trang 18Lê đình Thanh, Các lớp thiết yếu trong Java
Biến môi trường
Ớ Java cung cấp phương thức ddocj các biên môi trường
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map<String, String> env = System.getenv(); for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, env.get(envName));
}
}
}
//String value = System.getenv(env);
Thông số hệ thống
Ớ Lớp System chứa một ựối tượng Properties ựể quản lý các thông số hệ thống như tên hệ ựiều hành, thư mục cài ựặt JRE, Ầ
Ớ đọc thông số hệ thống
Properties System.getProperties()
String System.getProperty(tenTS);
Ớ Thay ựổi thông số hệ thống
System.setProperties(Properties p);
Trang 19Lê đình Thanh, Các lớp thiết yếu trong Java
Thông số hệ thống
Ớ Lớp System chứa một ựối tượng Properties ựể quản lý các thông số hệ thống như tên hệ ựiều hành, thư mục cài ựặt JRE, Ầ
Ớ đọc thông số hệ thống
Properties System.getProperties()
String System.getProperty(tenTS);
Ớ Thay ựổi thông số hệ thống
System.setProperties(Properties p);
Tiếp theo
Ứng dụng CSDL