Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
542,99 KB
Nội dung
BÀI 2: KIẾN TRÚC NỀN TẢNG CỦA NGÔN NGỮ JAVA Học xong người học sẽ: - Trình bày ứng dụng kiến thức Gói – package: Định nghĩa gói; Tạo sử dụng gói; Vai trị gói việc điều khiển truy cập; - Trình bày ứng dụng đặc trưng gói java.lang; gói java.util, gói java.io … - Trình bày ứng dụng kiến thức xử lý ngoại lệ: Định nghĩa ngoại lệ (exception); Ứng dụng việc xử lý ngoại lệ; Hiểu kiểu ngoại lệ khác trong; Mơ tả mơ hình xử lý ngoại lệ;… - Trình bày ứng dụng kiến thức luồng: Khái niệm luồng; Mô tả lớp InputStream OutputStream;, xử lý luồng tập tin, 1.1 GÓI - PACKAGE 1.1.1 Giới thiệu gói Gói thành phần quan trọng chương trình Java Các gói lưu trữ theo kiểu phân cấp nhập (import) cách tường inh vào lớp định nghĩa Gói coi thư mục, nơi tổ chức lớp Các chương trình Java tổ chức tập gói Mỗi gói gồm có nhiều lớp Để tạo lớp thành viên gói, cần bắt đầu mã nguồn với khai báo gói, sau: package mypackage; - Sự khai báo sau hợp lệ không hợp lệ : o Hợp lệ package mypackage; import java.io.*; o Khơng hợp lệ import java.io.*; package mypackage; Ta có tuỳ chọn sau nhập vào gói: - Nhập vào tập tin cụ thể từ gói: import java.mypackage.calculate - Nhập (import) tồn gói: import java.mypackage.*; ThS Dương Thành Phết http://www.thayphet.net Trang 17 Java cài đặt sẵn tập gói: Gói java.lang java.io java.applet java.awt java.util Mơ tả Khơng cần phải khai Gói nhúng sẳn Các lớp thao tác nhập xuất Các lớp thực thi applet trình duyệt Các lớp tạo giao diện đồ hoạ (GUI) Các lớp tạo nên ứng dụng, applet, cấu trúc liệu, lịch biểu, ngày tháng, v.v Các lớp giao diện cho việc lập trình mạng TCP/IP java.net Bảng 2.1 Các gói Java Khi ta bắt đầu việc phát triển cho ứng dụng lớn, có khuynh hướng phát triển số lớp Cần tổ chức lớp thư mục khác để dễ dàng truy cập 1.1.2 Tạo gói Các bước sau cho phép tạo nên gói người dùng định nghĩa: - Khai báo gói: package mypackage; - Sử dụng phát biểu import để nhập gói chuẩn theo yêu cầu import java.util.*; - Khai báo định nghĩa lớp nằm gói Tất thành phần gói public, để truy cập từ bên package mypackage; //khai báo gói import java.util.*; public class Calculate { //định nghĩa lớp int var; Calculate(int n){ … var = n; } //các phương thức // … } public class Display { //định nghĩa lớp … //Các phương thức } ThS Dương Thành Phết http://www.thayphet.net Trang 18 Để cho chương trình Java khác sử dụng gói đó, khai báo chúng vào đoạn mã nguồn - Để nhập lớp dùng: import java.mypackage.Calculate; - Để nhập toàn gói: import java.mypackage.*; - Tạo tham chiếu đến thành phần gói Dùng đoạn mã đơn giản sau: import java.io.*; import mypackage.Calculate; class PackageDemo{ public static void main(String args[]){ Calculate calc = new Calculate(); } } 1.1.3 Gói Java.lang Theo mặc định, chương trình nhập gói java.lang Vì thế, khơng cần phải khai báo 1.1.3.1 Lớp String (lớp chuỗi) 1.1.3.1.1 Giới thiệu Chuỗi hàng loạt ký tự Lớp String cung cấp phương thức để thao tác với chuỗi: String str1 = new String( ); //str1 chứa dòng trống String str2 = new String(“Hello World”); //str2 chứa dòng “Hello World” char ch[] = {“A”,”B”,”C”,”D”,”E”}; String str3 = new String(ch); //str3 chứa “ABCDE” String str4 = new String(ch,0,2); //str4 chứa “AB” 0- tính từ ký tự bắt đầu,2- số lượng ký tự ThS Dương Thành Phết http://www.thayphet.net Trang 19 1.1.3.1.2 Các phương thức lớp chuỗi Tên Chức Trả ký tự vị trí CharAt() chuỗi Trả giá trị kiểu logic, phụ thuộc vào startsWith() chuỗi có bắt đầu với giá trị đặc biệt Trả giá trị kiểu logic, phụ thuộc vào chuỗi kết thúc endsWith() với giá trị đặc biệt Trả chuỗi rút từ copyValueOf() mảng ký tự Lấy chuỗi, toCharArray() chuyển vào mảng ký tự Trả thứ tự ký tự đặc biệt, chuỗi indexOf() phạm vi chuỗi trả chữ hoa toUpperCase() chuỗi thông qua hàm Trả chữ thường toLowerCase() chuỗi trim() equals() Cắt bỏ khoảng trắng đối tượng String So sánh nội dung hai đối tượng chuỗi Minh họa String name = new String(“Java Language”); char ch = name.charAt(5); String strname = “Java Language”; boolean flag = strname.startsWith(“Java”); Biến “ch” chứa giá trị “L” Biến “flag” chứa giá trị true String strname = “Java Language”; boolean flag = strname.endsWith(“Java”); Biến “flag” chứa giá trị false char name[] = {“L”,”a”,”n”,”g”,”u”,”a”,”g”,”e”}; String subname = String.copyValueOf(name,5,2); biến “subname” chứa chuỗi “ag” String text = new String(“Hello World”); Char textArray[] = text.toCharArray( ); String day = new String(“Sunday”); int index1 = day.indexOf(“n”); //chứa int index2 = day.indexOf(“z”,2); //chứa –1 “z” không thấy vị trí int index3 = day.indexOf(“Sun”); //chứa mục mẫu tự 1st String lower = new String(“good morning”); System.out.println(“Uppercase: “+lower.toUpperCase( )); String upper = new String(“APTECH”); System.out.println(“Lowercase: “+upper.toLowerCase( ) String space = new String(“Spaces”); System.ut.println(spaces); System.out.println(spaces.trim()); //Sau cắt bỏ khoảng trắng String name1 = “Aptech”, name2 = “APTECH”; boolean flag = name1.equals(name2); Bảng 2.2 Các phương thức lớp chuỗi ThS Dương Thành Phết http://www.thayphet.net Trang 20 1.1.4 Lớp StringBuffer 1.1.4.1.1 Giới thiệu Lớp StringBuffer cung cấp phương thức khác để thao tác đối tượng dạng chuỗi Các đối tượng lớp mềm dẻo, ký tự chuỗi chèn vào đối tượng StringBuffer, nối thêm liệu vào vị trí cuối 1.1.4.1.2 Tên append() insert() charAt() setCharAt() setLength() getChars() reverse() Các phương thức lớp StringBuffer Chức Minh họa Nối thêm chuỗi StringBuffer s1 = Giá trị s1 bây vị trí cuối đối new StringBuffer(“Good”); tượng s1.append(“evening”); “goodevening Chèn giá trị vào vị trí StringBuffer str = Biến “str” chứa định new StringBuffer(“Java sion”); chuỗi “Jbava sion” str.insert(1,”b”); Trả ký tự đối StringBuffer str = Biến letter chứa tượng StringBuffer vị new StringBuffer(“James “G” trí định Gosling”); char letter = str.charAt(6); Thay ký tự vị trí StringBuffer name = Biến “name” chứa định new StringBuffer(“Java”); “Java” name.setCharAt(2,”v”); Thiết lập chiều dài, StringBuffer str = ký tự null thêm new StringBuffer(10); vào vị trí cuối str.setLength(str.legth() +10); nhớ đệm Trích ký tự Biến “ch” chứa chép vào mảng StringBuffer str = “par” tham số: Vị trí bắt đầu, new StringBuffer(“Leopard”); vị trí kết thúc, Mảng char ch[] = new char[10]; đích, vị trí mảng str.getChars(3,6,ch,0); đích từ vị trí để chép đến Đảo ngược nội dung StringBuffer str = new Biến “strrev” chứa StringBuffer(“devil”); “lived” StringBuffer strrev = str.reverse(); Bảng 2.3 Các phương thức lớp StringBuffer 1.1.4.2 Lớp java.lang.Math Lớp chứa phương thức để thực thao tác toán học: Cú pháp: Math. ThS Dương Thành Phết http://www.thayphet.net Trang 21 Tên abs() ceil() floor() max() min() round() random() sqrt() sin() cos() tan() Chức Trả giá trị tuyệt đối số Minh họa int num = -1; Trả num=Math.abs(num); Trả số nguyên lớn đối số Math.ceil(8.02); Trả 0.9 Math.ceil(-1.3); Trả -1.0 Math.ceil(100); Trả 100.0 Phương thức trả số nguyên nhỏ Math.floor(-5.6)); Trả -6.0 đối số Math.floor(201.1); Trả 201 Math.floor(100); Trả 100 Tìm giá trị lớn giá trị Trả Math.max(4,5); truyền vào Tìm giá trị nhỏ giá trị Trả Math.min(3,5); truyền vào Làm trịn đối số có dấu phẩy động Math.round(34.5); Trả 35 Trả số ngẫu nhiên 0.0 1.0 kiểu double Trả bình phương số Math.sqrt(144); Trả 12.0 Trả sine số, góc truyền đến trả 1.0, giá radian trị sin 45 Math.sin(Math.PI/2); Giá trị “pi” định nghĩa lớp “Math.PI” Pi/2(radians)=90(độ) Trả cos số, góc truyền đến radian Trả tan số, góc truyền đến radian Bảng 2.4 Các phương thức lớp ngơn ngữ lập trình Java.lang.Math 1.1.5 Gói java.util Gói Java.util cung cấp vài lớp Java hữu ích, cần đến thường xuyên tất loại chương trình ứng dụng Gói giới thiệu lớp sau: - Hashtable - Random - Vector - StringTokenizer 1.1.5.1 Lớp Hashtable Lớp Hashtable sử dụng để ánh xạ khố đến giá trị Ví dụ, sử dụng để ánh xạ tên đến tuổi, người lập trình đến dự án, tiêu đề công việc đến lương, tiếp tục ThS Dương Thành Phết http://www.thayphet.net Trang 22 Constructor Hashtable(int) Hashtable(int, float) Purpose Xây dựng bảng với dung lượng ban đầu định Xây dựng lớp với dung lượng ban đầu định yếu tố nạp vào Xây dựng lớp cách sử dụng giá trị mặc định cho dung lượng ban đầu yếu tố nạp vào Hashtable() Bảng 2.5 Các phương thức xây dựng Hashtable Hashtable mở rộng kích thước phần tử thêm vào Khi việc tạo bảng băm mới, ta định dung lượng ban đầu yếu tố nạp vào Điều làm cho hashtable tăng kích thước lên, lúc việc thêm vào phần tử làm thay đổi giới hạn hashtable cũ Giới hạn bảng băm dung lượng nhân lên yếu tố nạp vào.Ví dụ: bảng băm với dung lượng 100, yếu tố nạp vào 0.75 có giới hạn 75 mục Hashtable hash1 = new Hashtable(500,0,80); Trong trường hợp này, Bảng băm “hash1” lưu trữ 500 phần tử Khi bảng băm lưu trữ vừa đầy 80% (một yếu tố nạp vào của.80), kích thước tối đa tăng lên Phương thức clear() Clone() contains(Object) ContainsKey(Object) elements() get(Object key) isEmpty() keys() put(Object, Object) rehash() remove(Object key) size() toString() Mục đích Xoá tất phần tử từ bảng băm Tạo bảng Hashtable Trả True bảng băm chứa đối tượng định Trả True bảng băm chứa khoá định Trả bảng liệt kê yếu tố bảng băm Truy lục đối tượng kết hợp với khoá định Trả true bảng băm trống Trả bảng liệt kê khoá bảng băm Thêm phần tử vào bảng băm cách sử dụng khoá giá trị định Thay đổi bảng băm thành bảng băm lớn Xoá đối tượng cho khoá định Trả số phần tử bảng băm Trả đại diện chuỗi định dạng cho bảng băm Bảng 2.6 Các phương thức lớp Hashtable Mỗi phần tử hashtable bao gồm khoá giá trị Các phần tử thêm vào bảng băm cách sử dụng phương thức put(), truy lục cách sử dụng phương thức get() Các phần tử xố từ bảng băm với phương thức remove() Các phương thức contains() containsKey() sử dụng để tra cứu giá trị khố bảng băm Chương trình sau minh họa sử dụng lớp Hashtable ThS Dương Thành Phết http://www.thayphet.net Trang 23 import java.util.*; public class HashTableDemo { public static void main(String args[]) { // tao mot hash map Hashtable balance = new Hashtable(); Enumeration names; String str; double bal; balance.put("Zara", new Double(3434.34)); balance.put("Mahnaz", new Double(123.22)); balance.put("Ayan", new Double(1378.00)); balance.put("Daisy", new Double(99.22)); balance.put("Qadir", new Double(-19.08)); // Hien thi tat ca balance hash table names = balance.keys(); while(names.hasMoreElements()) { str = (String) names.nextElement(); System.out.println(str + ": " + balance.get(str)); } System.out.println(); // Gui 1,000 vao tai khoan cua Zara bal = ((Double)balance.get("Zara")).doubleValue(); balance.put("Zara", new Double(bal+1000)); System.out.println("Balance moi cua Zara la: " + balance.get("Zara")); } } Quá trình hiển thị kết mô tả đây: ThS Dương Thành Phết http://www.thayphet.net Trang 24 Hình 2.1: Quá trình hiển thị kết HashTableDemo 1.1.5.2 Random Lớp đại diện tạo số ngẫu nhiên Phương thức random() random(long) nextDouble() Mục đích Tạo tạo số ngẫu nhiên Tạo tạo số ngẫu nhiên dựa giá trị khởi tạo định Trả giá trị kiểu double 0.0D đến 1.0D từ tạo số ngẫu nhiên nextFloat() Trả giá trị kiểu float 0.0F 1.0F từ tạo số ngẫu nhiên nextGaussian() Trả kiểu double phân phối Gaussian từ tạo số ngẫu nhiên Tạo giá trị Gaussian có giá trị trung bình 0, độ lệch tiêu chuẩn 1.0 nextInt() Trả giá trị kiểu Integer từ tạo số ngẫu nhiên nextLong() Trả giá trị kiểu long từ tạo số ngẫu nhiên setSeed(long) Thiết lập giá trị khởi tạo từ tạo số ngẫu nhiên Bảng 2.8 Các phương thức lớp Random 1.1.5.3 Vector Một vấn đề với mảng phải biết lớn ta tạo Đơi ta khơng thể xác định kích thước mảng trước tạo Lớp Vector Java giải vấn đề Nó cung cấp dạng mảng với kích thước ban đầu, mảng tăng thêm nhiều phần tử thêm vào Một lớp Vector lưu trữ item kiểu Object, dùng để lưu trữ thể lớp Java Một lớp Vector đơn lẻ lưu trữ phần tử khác nhau, phần tử khác thể lớp khác Phương thức Vector(int) Vector(int, int) Vector() Mục đích Tạo lớp Vector với dung lượng ban đẩu định Tạo lớp Vector với dung lượng ban đầu định, tăng số lượng Tạo lớp Vector với dung lượng khởi tạo mặc định, tăng số lượng Bảng 2.9 Các phương thức xây dựng lớp Vector ThS Dương Thành Phết http://www.thayphet.net Trang 25 Phương thức addElement(Object) capacity() Mục đích Chèn phần tử định vào lớp Vector Trả số phần tử mà vừa đủ cho phần cấp phát thời lớp Vector Bắt chước vector, phần tử Trả True lớp Vector chứa đối tượng định Sao chép phần tử lớp Vector vào mảng định Truy lục phần tử cấp phát mục định Trả bảng liệt kê phần tử lớp Vector Đảm bảo lớp Vector lưu trữ dung lượng tối thiểu định Trả phần tử lớp Vector Tìm kiếm lớp Vector, trả mục zero cho khớp với đối tượng Tìm kiếm lớp Vector bắt đầu số mục định, trả mục zero cho khớp với đối tượng Thêm đối tượng định mục định Trả True lớp Vector khơng có phần tử Trả phần tử cuối lớp Vector Tìm kiếm lóp Vector, trả mục zero cho khớp với đối tượng cuối Tìm kiếm lớp Vector bắt đầu số mục định, trả mục zero cho khớp với đối tượng trước Xoá tất phần tử từ lớp Vector Xoá đối tượng định từ lớp Vector Xoá đối tượng mục định Thay đối tượng mục định với đối tượng định Thiết lập kích thước lớp Vector thành kích thước định Thiết lập kích thước lớp Vector thành kích thước định Trả số phần tử thời lớp Vector Trả đại diện chuỗi định dạng nội dung lớp Vector Định lại kích thước lớp Vector để di chuyển dung lượng thừa Clone() contains(Object) copyInto(Object []) elementAt(int) elements() ensureCapacity(int) firstElement() indexOf(Object) indexOf(Object, int) insertElementAt(Object, int) isEmpty() lastElement() lastIndexOf(Object) lastIndexOf(Object, int) removeAllElements() removeElement(Object) removeElementAt(int) setElementAt(Object, int) setSize(int) setSize(int) Size() toString() trimToSize() Bảng 2.10 Các phương thức lớp Vector Chương trình sau minh họa số phương thức hỗ trợ lớp Vector Java: import java.util.*; public class VectorDemo { public static void main(String args[]) { // capacity ban dau la 3, incr la ThS Dương Thành Phết http://www.thayphet.net Trang 26 Hình 2.2: Quá trình hiển thị kết chương trình lớp Vector 1.1.5.4 StringTokenizer Một lớp StringTokenizer sử dụng để tách chuỗi thành phần tử token Ví dụ, từ câu coi token Tuy nhiên, lớp StringTokenizer xa việc phân tách câu Để tạo nên mã thông báo đầy đủ theo yêu cầu, ta định dấu phân cách token, lớp StringTokenizer tạo Dấu phân cách khoảng trắng mặc định thường có khả để tách văn Tuy nhiên, ta sử dụng tập toán tử toán học (+, *, /, -) phân tách biểu thức Các ký tự phân cách định đối tượng StringTokenizer xây dựng Bảng sau tóm tắt phương thức xây dựng có sẵn: Phương thức Constructor StringTokenizer(String) StringTokenizer StringTokenizer(String,String, Boolean) Mục đích Tạo lớp StringTokenizer dựa chuỗi định thông báo Tạo lớp StringTokenizer dựa trên(String,String)chuỗi định thôngbáo,và tập dấu phân cách Tạo lớp StringTokenizer dựatrên chuỗi định thông báo, tập dấu phân cách, cờ hiệu cho biết dấu phân cách trả token Bảng 2.11 Các phương thức xây dựng lớp StringTokenizer Các phương thức xây dựng sử dụng ví dụ sau: StringTokenizer st1 = new StringTokenizer(“A Stream of words”); StringTokenizer st2 = new StringTokenizer(“4*3/2-1+4”, “+/-”, true); StringTokenizer st3 = new StringTokenizer(“aaa,bbbb,ccc”, “,”); ThS Dương Thành Phết http://www.thayphet.net Trang 28 Trong câu lệnh đầu tiên, StringTokenizer của”st1” xây dựng cách sử dụng chuỗi cung cấp dấu phân cách mặc định Các dấu phân cách mặc định khoảng trắng, tab, dòng mới, ký tự xuống dòng Các dấu phân cách hữu dụng phân tách văn bản, với “st1” Câu lệnh thứ hai ví dụ xây dựng lớp StringTokenizer cho biểu thức toán học cách sử dụng ký hiệu *, +, /, - Câu lệnh thứ 3, StringTokenizer “st3” thông báo chuỗi cung cấp cách sử dụng ký tự dấu phẩy dấu phân cách Lớp StringTokenizer thực thi giao diện bảng liệt kê Vì thế, bao gồm phương thức hasMoreElements() nextElement() Các phương thức non-private lớp StringTokenizer tóm tắt bảng sau: Phương thức countTokens() hasMoreElements() hasMoreTokens() nextElement() nextToken() nextToken(String) Mục đích Trả số token cịn lại Trả True nhiều phần tử đánh dấu chuỗi Nó giống hệt hasMoreTokens Trả True nhiều token đánh dấu chuỗi, giống hệt hasMoreElements Trả phần tử chuỗi Nó giống nextToken Trả Token chuỗi Nó giống nextElement Thay đổi dấu phân cách đến chuỗi định, sau trả token Bảng 2.12 Các phương thức lớp StringTokenizer Ví dụ đơn giản sau chia chuỗi "Toi lam viec o HaNoi" thành token dựa vào khoảng trắng whitespace import java.util.StringTokenizer; public class Simple{ public static void main(String args[]){ StringTokenizer st = new StringTokenizer("Toi lam viec o TP.HCM"," "); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } } } Quá trình hiển thị kết mơ tả hình ThS Dương Thành Phết http://www.thayphet.net Trang 29 Hình 2.3: Quá trình hiển thị kết lớp StringTokenizer 1.2 XỬ LÝ NGOẠI LỆ - EXCEPTION HANDLING 1.2.1 Giới thiệu xử lý ngoại lệ Exception lỗi đặc biệt Lỗi xuất lúc thực thi chương trình Các trạng thái khơng bình thường xảy thi hành chương trình tạo exception Nếu ta không phân phối trạng thái exception bị kết thúc đột ngột Ví dụ, việc chia cho tạo lỗi chương trình Ngơn ngữ Java cung cấp máy dùng để xử lý ngoại lệ tuyệt vời Việc xử lý làm hạn chế tối đa trường hợp hệ thống bị phá vỡ (crash) hay hệ thống bị ngắt đột ngột Tính làm cho Java ngơn ngữ lập trình mạnh Một chương trình nên có chế xử lý ngoại lệ thích hợp Nếu khơng, chương trình bị ngắt exception xảy Trong trường hợp đó, tất nguồn tài nguyên mà hệ thống trước phân phối di dời trạng thái Điều gây lãng phí tài nguyên Để tránh trường hợp này, tất nguồn tài nguyên mà hệ thống phân phối nên thu hồi lại Tiến trình địi hỏi chế xử lý ngoại lệ thích hợp Cho ví dụ, xét thao tác nhập xuất (I/O) tập tin Nếu việc chuyển đổi kiểu liệu không thực đúng, ngoại lệ xảy chương trình bị hủy mà khơng đóng lại tập tin Lúc tập tin dễ bị hư hại nguồn tài nguyên cấp phát cho tập tin không thu hồi lại cho hệ thống 1.2.2 Khối “try” “catch” Khối try Java sử dụng để bao quanh code mà ném Exception Nó phải sử dụng bên phương thức Khối try phải theo sau khối catch khối finally Cú pháp khối try-catch Java: try{ //code ma co the nem exception }catch(Exception_class_Name ref){ } ThS Dương Thành Phết http://www.thayphet.net Trang 30 Cú pháp khối try-finally Java try{ //code ma co the nem exception }finally{ } Khối catch Java Khối catch Java sử dụng để xử lý Exception Nó phải sử dụng sau khối try sử dụng nhiều khối catch với khối try đơn Vấn đề xử lý ngoại lệ: Chúng ta tìm hiểu vấn đề không sử dụng khối try-catch public class Testtrycatch1{ public static void main(String args[]){ int data=50/0;//co the nem exception System.out.println("Phan code lai "); } } Chương trình cho kết sau: Exception in thread "main" java.lang.ArithmeticException: / by zero Như ví dụ trên, phần cịn lại code khơng thực thi (trong ví dụ lệnh inPhan code lai… không in) Giả sử có khoảng 100 dịng code sau exception, tất dịng code khơng thực thi Bây giờ, ví dụ trên, sử dụng khối try-catch để xử lý vấn đề public class Testtrycatch2{ public static void main(String args[]){ try{ int data=50/0; }catch(ArithmeticException e){System.out.println(e);} System.out.println("Phan code lai "); } } Chương trình cho kết sau: java.lang.ArithmeticException: / by zero Phan code lai Lúc này, phần lại code thực thi Chế độ làm việc nội khối try-catch Java : ThS Dương Thành Phết http://www.thayphet.net Trang 31 Đầu tiên, JVM kiểm tra xem exception xử lý hay chưa Nếu exception chưa xử lý, JVM cung cấp Exception Handler mặc định, để thực tác vụ sau: - In miêu tả exception - In stack trace (cấu trúc thứ bậc phương thức nơi mà exception xuất hiện) - Làm cho chương trình ngừng lại Nhưng exception xử lý Lập trình viên, luồng chuẩn ứng dụng trì (hay phần cịn lại code thực thi) 1.2.3 Khối “try” nhiều khối “catch” Nếu phải thực tác vụ khác mà xảy exception khác nhau, sử dụng nhiều khối catch Java Ví dụ đơn giản sau: public class TestMultiCatchBlock{ public static void main(String args[]){ try{ int a[]=new int[5]; a[5]=30/0; } 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 lai "); } } Chương trình cho kết sau: Task1 duoc hoan Phan code lai 1.2.4 Khối “Finally” Khối finally khối sử dụng để thực thi phần code quan trọng đóng kết nối, đóng stream, … Khối finally ln ln thực thi exception có xử lý hay không Khối finally phải theo sau khối try khối catch Sự sử dụng khối finally Java: Hãy theo dõi tình khác mà khối try Java sử dụng ThS Dương Thành Phết http://www.thayphet.net Trang 32 Tình 1: exeption không xuất class TestFinallyBlock{ public static void main(String args[]){ try{ int data=25/5; System.out.println(data); } catch(NullPointerException e){ System.out.println(e); } finally{ System.out.println("Khoi finally luon luon duoc thuc thi"); } System.out.println("Phan code lai "); } } Chương trình cho kết quả: Khoi finally luon luon duoc thuc thi Phan code lai Tình 2: exception xuất không xử lý class TestFinallyBlock1{ public static void main(String args[]){ try{ int data=25/0; System.out.println(data); } catch(NullPointerException e){ System.out.println(e); } finally{ System.out.println("Khoi finally luon luon duoc thuc thi"); } System.out.println("Phan code lai "); } } Chương trình cho kết quả: Khoi finally luon luon duoc thuc thi Exception in thread "main" java.lang.ArithmeticException: / by zero Tình 3: exception xảy xử lý public class TestFinallyBlock2{ ThS Dương Thành Phết http://www.thayphet.net Trang 33 public static void main(String args[]){ try{ int data=25/0; System.out.println(data); } catch(ArithmeticException e){ System.out.println(e); } finally{ System.out.println("Khoi finally luon luon duoc thuc thi"); } System.out.println("Phan code lai "); } } Chương trình cho kết quả: java.lang.ArithmeticException: / by zero Khoi finally luon luon duoc thuc thi Phan code lai Qui tắc: Với khối try có nhiều khối catch, có khối finally Ghi chú: Khối finally khơng thực thi chương trình (hoặc gọi System.exit() gây lỗi nghiêm trọng Fatal Error mà làm ngừng tiến trình) 1.3 LUỒNG NHẬP XUẤT (I/O STREAMS) 1.3.1 Giới thiệu Thuật ngữ kỹ thuật luồng lộ trình mà liệu truyền chương trình Một ứng dụng luồng mà ta quen thuộc luồng nhập System.in Luồng dàn ống (pipelines) để gửi nhận thơng tin chương trình java Nếu có lỗi xẩy đọc hay ghi luồng, IOexception kích hoạt Do vậy, câu lệnh luồng phải bao gồm khối try-catch Lớp “java.lang.System” định nghĩa luồng nhập xuất chuẩn Ta sử dụng luồng xuất để xuất liệu hiển thị kết hình Luồng I/O bao gồm: ThS Dương Thành Phết http://www.thayphet.net Trang 34 - Lớp System.out: Luồng xuất chuẩn dùng để hiển thị kết hình - Lớp System.in: Luồng nhập chuẩn thường đến từ bàn phím dùng để đọc - Các ký tự liệu - Lớp System.err: Đây luồng lỗi chuẩn Các lớp “InputStream” “OutputStream” cung cấp nhiều khả I/O khác Cả hai lớp có lớp để thực I/O thơng qua vùng đệm nhớ, tập tin ống dẫn Các lớp lớp InputStream thực đầu vào, lớp lớp OutputStream thực kết 1.3.2 Gói java.io Các luồng hệ thống có ích Tuy nhiên, chúng khơng đủ mạnh để dùng ứng phó với I/O thực tế Gói java.io phải nhập mục đích Các lớp thuộc gói java.io: 1.3.2.1 Lớp InputStream Lớp InputStream cho phép định nghĩa cách nhận liệu Cung cấp số phương pháp để đọc dùng luồng liệu để làm đầu vào Các phương thức giúp ta tạo, đọc xử lý luồng đầu vào Các phương thức bảng sau: Tên phương thức read() read (byte []) read (byte [], int, int) available() close() mark() markSupporte() reset() skip() Mô tả Đọc byte liệu từ luồng Nếu không liệu hợp lệ khố phương thức Khi phương thực khố, dịng thực chờ liệu hợp lệ Trả byte “đọc” hay “-1”, kết thúc luồng đến kích hoạt IOException lỗi xảy Nó đọc vào mảng byte trả số byte thực đọc kết thúc luồng đến, kích hoạt IOException lỗi xảy Phương pháp trả số lượng byte đọc mà khơng bị phong toả Nó trả số byte hợp lệ Nó khơng phải phương thức hợp lệ đáng tin cậy để thực tiến trình xử lý đầu vào Đóng luồng Nó dung để phóng thích tài ngun kết hợp với luồng Ln ln đóng luồng để chắn luồng xử lý kết thúc, kích hoạt IOException lỗi xảy Đánh dấu vị trí luồng Trả giá trị boolean nêu rõ luồng có hỗ trợ khả mark reset hay khơng Nó trả luồng hỗ trợ khơng sai Định vị lại luồng theo vị trí đánh dấu chót kích hoạt IOException lỗi xảy Bỏ qua “n” byte đầu vào.”-n” định số byte bỏ qua Nó kích hoạt IOException lỗi xảy Phương thức sử dụng để di chuyển tới vị trí đặc biệt bên luồng đầu vào Bảng 2.13 Các phương thức lớp InputStream ThS Dương Thành Phết http://www.thayphet.net Trang 35 1.3.2.2 Lớp outputStream Lớp OutputStream định nghĩa cách ghi kết đến luồng Nó cung cấp tập phương thức trợ giúp tạo ra, ghi xử lý kết luồng Các phương thức: Tên phương thức write(int) write(byte[]) write(byte[],int,int) flush() close() Mô tả Ghi byte Phong toả byte ghi luồng chờ tác vụ ghi hoàn tất Nó kích hoạt IOException lỗi xảy Ghi mảng byte Lớp OutputStream định nghĩa ba dạng tải phương thức phép phương thức write() ghi byte riêng lẻ, mảng byte, hay đoạn mảng Phương thức xả luồng, đệm liệu ghi luồng kết xuất Nó kích hoạt IOException lỗi xảy Phương thức đóng luồng dùng để giải phóng tài nguyên kết hợp với luồng, kích hoạt IOException lỗi xảy Bảng 2.14 Các phương thức lớp OutputStream 1.3.2.3 Nhập xuất mảng byte Các lớp “ByteArrayInputStream” “ByteArrayOutputStream” sử dụng đệm nhớ Không cần thiết phải dùng chúng với - Lớp ByteArrayInputStream Lớp tạo luồng đầu vào từ nhớ đệm mảng byte Lớp không hỗ trợ phương thức Ngược lại chạy đè phương thức lớp InputStream “read()”, “skip()”, “available()” “reset()” - Lớp ByteArrayOutputStream Lớp tạo luồng kết suất mảng byte Nó cung cấp khả bổ sung để mảng kết suất tăng trưởng nhằm mục đích chừa chỗ cho mảng ghi Lớp cung cấp phương thức “toByteArrray()” “toString()” Chúng dung để chuyển đổi luồng thành mảng byte hay đối tượng chuỗi Lớp ByteArrayOutputStream cung cấp hai phương thức thiết lập Một chấp nhận đối số số nguyên dùng để ấn định mảng byte kết theo kích cỡ ban đầu thứ hai không chấp nhận đối số nào, thiết lập đệm kết với kích thước mặc định lớp cung cấp vài phương thức bổ sung, không khai báo OutputStream: reset(): Thiết lập lại kết vùng đệm nhằm cho phép tiến trình ghi khởi động lại đầu vùngđệm size(): Trả số byte ghi tới vùng đệm writeTo(): Ghi nội dung vùng đệm kết luồng xuất định Để thực hiện, chấp nhận đối tượng lớp OutputStream làm đối số ThS Dương Thành Phết http://www.thayphet.net Trang 36 Sau ví dụ minh họa ByteArrayInputStream ByteArrayOutputStream Java: import java.io.*; public class ByteStreamTest { public static void main(String args[])throws IOException { ByteArrayOutputStream bOutput = new ByteArrayOutputStream(12); while( bOutput.size()!= 10 ) { // Nhan input tu nguoi dung bOutput.write(System.in.read()); } byte b [] = bOutput.toByteArray(); System.out.println("In noi dung"); for(int x= ; x < b.length; x++) { // in cac ky tu System.out.print((char)b[x] + " "); } System.out.println(" "); int c; ByteArrayInputStream bInput = new ByteArrayInputStream(b); System.out.println("Chuyen doi cac ky tu chu hoa " ); for(int y = ; y < 1; y++ ) { while(( c= bInput.read())!= -1) { System.out.println(Character.toUpperCase((char)c)); } bInput.reset(); } } } Kết chương trình sau: Hình 2.4: Kết chương trình ThS Dương Thành Phết http://www.thayphet.net Trang 37 1.3.2.4 Nhập xuất tập tin Java hỗ trợ tác vụ nhập xuất tập tin với trợ giúp lớp sau đây: - File - FileInputStream - FileOutputStream - FileReader - FileWriter 1.3.2.4.1 Lớp File Lớp sử dụng để truy cập đối tượng tập tin thư mục Các tập tin đặt tên theo qui ước đặt tên tập tin hệ điều hành chủ Các qui ước gói riêng lớp File Lớp cung cấp thiết lập tập tin thư mục Các thiết lập chấp nhận đường dẫn tập tin tuyệt đối lẫn tương đối tập tin thư mục Tất tác vụ thư mục tập tin chung thực thông qua phương thức truy cập lớp File Các phương thức: - Cho phép ta tạo, xoá, đổi tên file - Cung cấp khả truy cập tên đường dẫn tập tin - Xác định đối tượng có phải tập tin hay thư mục không - Kiểm tra cho phép truy cập đọc ghi Giống phương thức truy cập, phương thức thư mục cho phép tạo, xoá, đặt tên lại liệt kê thư mục Các phương pháp cho phép thư mục chéo cách cung cấp khả truy cập thư mục cha thư mục anh em 1.3.2.4.2 Lớp FileInputStream Lớp cho phép đọc đầu vào từ tập tin dạng luồng Các đối tượng lớp tạo nhờ dùng tập tin String, File, đối tượng FileDescriptor làm đối số Lớp chồng lên phương thức lớp InputStream Nó cung cấp phương thức “finalize()” “getFD()” Phương thức “finalize()” dùng để đóng luồng gôm rác Java xử lý Phương thức “getFD()” trả đối tượng FileDescriptor biểu thị kết nối đến tập tin thực tế hệ tập tin “FileInputStream” sử dụng 1.3.2.4.3 Lớp FileOutputStream Lớp cho phép ghi kết luồng tập tin Các đối tượng lớp tạo sử dụng đối tượng chuỗi tên tập tin, tập tin, FileDesciptor làm tham số ThS Dương Thành Phết http://www.thayphet.net Trang 38 Lớp chồng lên phương thức lớp OutputStream cung cấp phương thức “finalize()” getFD() import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.File; import java.io.IOException; public class fileioexam { public static void main(String args[ ]) throws IOException { // creating an output file abc.txt FileOutputStream os = new FileOutputStream(“abc.txt”); String s = “Welcome to File Input Output Stream “ ; for(int i = 0; i< s.length( ); ++i) os write(s.charAt(i)); os.close(); // opening abc.txt for input FileInputStream is = new FileInputStream(“abc.txt”); int ibyts = is.available( ); System.out.println(“Input Stream has “ + ibyts + “ available bytes”); byte ibuf[ ] = new byte[ibyts]; int byrd = is.read(ibuf, 0, ibyts); System.out.println(“Number of Bytes read are: “ + byrd); System.out.println(“They are: “ + new String(ibuf)); is.close(); File fl = new File(“abc.txt”); fl.delete(); } } Kết đoạn mã nguồn trên: Hình 2.5: Sử dụng FileInputStream, FileOutputStream, lớp File 1.3.2.4.4 Lớp FileReader Lớp FileReader Java kế thừa từ lớp InputStreamReader FileReader sử dụng để đọc luồng ký tự Lớp có số constructor để tạo đối tượng cần thiết Cú pháp sau tạo FileReader, cung cấp File để đọc từ FileReader(File file) ThS Dương Thành Phết http://www.thayphet.net Trang 39 Cú pháp sau tạo FileReader, cung cấp FileDescriptor để đọc từ FileReader(FileDescriptor fd) Cú pháp sau tạo FileReader, cung cấp tên file để đọc từ FileReader(String fileName) Khi có đối tượng FileReader, có số phương thức sau giúp thao tác file STT Phương thức Miêu tả public int read() throws IOException Đọc ký tự đơn Trả int, mà biểu diễn ký tự đọc public int read(char [] c, int offset, int len) Đọc ký tự bên mảng Trả số ký tự đọc 1.3.2.4.5 Lớp FileWriter Lớp FileWriter Java kế thừa từ lớp OutputStreamWriter Lớp sử dụng để ghi luồng ký tự Lớp FileWriter có số constructor để tạo đối tượng cần thiết Cú pháp sau tạo đối tượng FileWriter cung cấp đối tượng File FileWriter(File file) Cú pháp sau tạo đối tượng FileWriter cung cấp đối tượng File với Boolean dẫn có hay khơng phụ thêm liệu ghi FileWriter(File file, boolean append) Cú pháp sau tạo đối tượng FileWriter mà liên kết với File Descriptor FileWriter(FileDescriptor fd) Cú pháp sau tạo đối tượng FileWriter cung cấp tên file FileWriter(String fileName) Cú pháp sau tạo đối tượng FileWriter cung cấp tên file với Boolean dẫn có hay khơng phụ thêm liệu ghi FileWriter(String fileName, boolean append) Khi bạn có đối tượng FileWriter, có số phương thức sử dụng để thao tác file STT Phương thức Miêu tả public void write(int c) throws IOException Ghi ký tự đơn public void write(char [] c, int offset, int len) Ghi phần mảng ký tự offset với độ dài len ThS Dương Thành Phết http://www.thayphet.net Trang 40 public void write(String s, int offset, int len) Ghi phần String offset với độ dài len Sau ví dụ minh họa lớp FileReader Java: import java.io.*; public class FileRead{ public static void main(String args[])throws IOException{ File file = new File("Hello1.txt"); // tao file file.createNewFile(); // tao mot doi tuong FileWriter FileWriter writer = new FileWriter(file); // ghi noi dung vao file writer.write("Day\n la\n mot\n vi\n du\n"); writer.flush(); writer.close(); //Tao mot doi tuong FileReader FileReader fr = new FileReader(file); char [] a = new char[50]; fr.read(a); // doc noi dung toi mang for(char c : a) System.out.print(c); //in tung ky tu mot fr.close(); } } Kết sau: Hình 2.6: Sử dụng FileReader, FileWriter ThS Dương Thành Phết http://www.thayphet.net Trang 41 TÓM TẮT Trong phần học viên làm quen với kiến thức sau: - Kiến thức Gói – package: Định nghĩa gói; Tạo sử dụng gói; Vai trị gói việc điều khiển truy cập; - Kiến thức ứng dụng đặc trưng gói java.lang; gói java.util, gói java io… - Kiến thức ứng dụng xử lý ngoại lệ: Định nghĩa ngoại lệ (exception); Ứng dụng việc xử lý ngoại lệ; Hiểu kiểu ngoại lệ khác trong; Mơ tả mơ hình xử lý ngoại lệ;… - Kiến thức ứng dụng kiến thức luồng: Khái niệm luồng; Mô tả lớp InputStream OutputStream;, xử lý luồng tập tin, - Hết Bài ThS Dương Thành Phết http://www.thayphet.net Trang 42