import java.io.*;
class M{
void method()throws IOException{
throw new IOException("device error");
} }
class Testthrows4{
public static void main(String args[])throws IOException{//Khai bao exception M m=new M();
m.method();
System.out.println("Luong chuan...");
} }
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.
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 5 throw throws
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
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
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 6
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");
}
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1
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.
import java.io.*;
class Parent{
void msg(){System.out.println("parent");}
}
class TestExceptionChild extends Parent{
void msg()throws IOException{
System.out.println("TestExceptionChild");
}
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.
import java.io.*;
class Parent{
void msg(){System.out.println("parent");}
}
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 2
class TestExceptionChild1 extends Parent{
void msg()throws ArithmeticException{
System.out.println("child");
}
public static void main(String args[]){
Parent p=new TestExceptionChild1();
p.msg();
} }
Chạy chương trình sẽ cho kết quả:
child
Nếu phương thức lớp cha khai báo một exception: phương thức ghi đè của lớp con có thể khai báo cùng exception đó, exception của lớp con, hoặc không khai báo exception nào, nhưng không thể khai báo exception cha.
1. Ví dụ trường hợp phương thức ghi đè của lớp con khai báo exception cha.
import java.io.*;
class Parent{
void msg()throws ArithmeticException{System.out.println("parent");}
}
class TestExceptionChild2 extends Parent{
void msg()throws Exception{System.out.println("child");}
public static void main(String args[]){
Parent p=new TestExceptionChild2();
try{
p.msg();
}catch(Exception e){}
}
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 3
}
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){}
} }
Chạy chương trình sẽ cho kết quả:
child
3. Ví dụ trường hợp phương thức ghi đè của lớp con khai báo exception của lớp con.
import java.io.*;
class Parent{
void msg()throws Exception{System.out.println("parent");}
}
class TestExceptionChild4 extends Parent{
void msg()throws ArithmeticException{System.out.println("child");}
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 4
public static void main(String args[]){
Parent p=new TestExceptionChild4();
try{
p.msg();
}catch(Exception e){}
} }
Chạy chương trình sẽ cho kết quả:
child
3. Ví dụ trường hợp phương thức ghi đè của lớp con không khai báo exception nào.
import java.io.*;
class Parent{
void msg()throws Exception{System.out.println("parent");}
}
class TestExceptionChild5 extends Parent{
void msg(){System.out.println("child");}
public static void main(String args[]){
Parent p=new TestExceptionChild5();
try{
p.msg();
}catch(Exception e){}
} }
Chạy chương trình sẽ cho kết quả:
child
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1
Custom Exception trong Java
Custom Exception là ngoại lệ do bạn tự định nghĩa hay bạn tự tạo riêng cho mình. Custom Exception trong Java được sử dụng để tùy biến ngoại lệ theo yêu cầu của người dùng. Bởi sự giúp đỡ của loại ngoại lệ này, bạn có thể có riêng kiểu và thông điệp ngoại lệ cho mình.
Bạn theo dõi chương trình Java minh họa về Custom Exception sau:
class InvalidAgeException extends Exception{
InvalidAgeException(String s){
super(s);
} }
---
class TestCustomException1{
static void validate(int age)throws InvalidAgeException{
if(age<18)
throw new InvalidAgeException("Khong hop le");
else
System.out.println("Chao mung ban toi bo phien");
}
public static void main(String args[]){
try{
validate(13);
}catch(Exception m){System.out.println("Exception xuat hien: "+m);}
System.out.println("Phan code con lai...");
} }
Chạy chương trình Java trên sẽ cho kết quả:
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 2
Exception xuat hien: InvalidAgeException:Khong hop le Phan code con lai...
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1
Cấu trúc dữ liệu trong Java
Các cấu trúc dữ liệu cung cấp bởi các package tiện ích của Java rất mạnh mẽ và thực hiện các tính năng rộng rãi. Những cấu trúc dữ liệu này bao gồm những interface và class.
Enumeration
BitSet
Vector
Stack
Dictionary
Hashtable
Properties
Tất cả các lớp trên được giới thiệu bởi một framework mới với tên là Collection Framework, được thảo luận ở chương tiếp theo.
Để 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ề Cấu trúc dữ liệu (Data Structure) trong Java.
Lớp Enumeration trong Java
Interface Enumeration bản thân nó không phải là cấu trúc dữ liệu, nhưng rất quan trong bên trong ngữ cảnh sử dụng các cấu trúc dữ liệu khác. Interface Enumeration định nghĩa để nhận các thành phần kế tiếp từ cấu trúc dữ liệu.
Ví dụ, Enumeration định nghĩa phương thức gọi là nextElement được sử dụng để lấy các thành phần tiếp theo trong cấu trúc dữ liệu chứa nhiều thành phần.
Để tìm hiểu chi tiết về interface này, bạn truy cập link sau: Enumeration interface trong Java.
Lớp BitSet trong Java
Lớp BitSet trong Java triển khai một nhóm các bit hoặc flag mà có thể được thiết lập và xóa một cách riêng rẽ.
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 2 Class này rất hữu dụng trong trường hợp bạn muốn lưu trữ một tập các giá trị Boolean và chỉ muốn gắn từng bit các giá trị và thiết lập hoặc xóa nó thích hợp.
Để tìm hiểu chi tiết về class này, bạn truy cập link sau: Lớp BitSet trong Java.
Lớp Vector trong Java
Lớp Vector trong Java là tương tự như các mảng dữ liệu Java truyền thống, ngoại trừ việc có thể tăng lưu trữ cho các thành phần mới.
Giống như mảng, các thành phần trong đối tượng Vector có thể truy cập bởi index.
Một điều tốt về việc sử dụng Vector là bạn không phải lo lắng về việc cài đặt nó cho một kích cỡ cụ thể ngoài việc tạo ra nó, nó có thể tăng và giảm độ lớn khi cần thiết.
Để tìm hiểu chi tiết về class này, bạn truy cập link sau: Lớp Vector trong Java.
Lớp Stack trong Java
Lớp Stack trong Java triển khai một last-in-first-out (LIFO) stack các phần tử.
Bạn có thể nghĩ về stack như một ngăn xếp thẳng đứng các đối tượng, khi bạn thêm một đối tượng mới, bạn lấy nó ở phần đầu các thành phần khác.
Khi bạn lấy một thành phần trên stack, nó lấy từ trên đỉnh xuống. Theo cách nói khác, thành phần cuối cùng mà bạn thêm vào stack sẽ là thành phần đầu tiên khi lấy ra và ngược lại.
Để tìm hiểu chi tiết về class này, bạn truy cập link sau: Lớp Stack trong Java.
Lớp Dictionary trong Java
Lớp Dictionary là một abstract class để định nghĩa cấu trúc dữ liệu cho việc liên kết giữa các key tới value.
Nó thực sự hữu ích trong các trường hợp khi bạn muốn có thể truy cập dữ liệu thông qua một key cụ thể thay vì sử dụng một integer index.
Khi lớp Dictionary là abstract, nó chỉ cung cấp framework cho một cấu trúc dữ liệu so khớp key thay vì một sự triển khai cụ thể.
Để tìm hiểu chi tiết về class này, bạn truy cập link sau: Lớp Dictionary trong Java.
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 3
Lớp Hashtable trong Java
Lớp Hashtable cung cấp các ý nghĩa về mặt tổ chức dữ liệu dựa vào cấu trúc mà người dùng định nghĩa key.
Ví dụ, một danh sách địa chỉ bạn có thể lưu trữ và xếp thứ tự dựa và key như zip code hơn là việc sử dụng tên người.
Ý nghĩa đặc trưng của các key liên quan tới hashtable là hoàn toàn phụ thuộc vào hashtable và dữ liệu nó chứa.
Để tìm hiểu chi tiết về class này, bạn truy cập link sau: Lớp Hashtable trong Java.
Lớp Properties trong Java
Lớp properties là lớp con của Hashtable. Nó được sử dụng để duy trì danh sách các giá trị trong đó key là String và value cũng là một String.
Lớp Properties được sử dụng bởi nhiều class khác trong Java. Ví dụ, bạn có một kiểu đối tượng trả về bởi System.getProperties() để lấy về các biến môi trường.
Để tìm hiểu chi tiết về class này, bạn truy cập link sau: Lớp Properties trong Java.
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1
Enumeration Interface trong Java
Enumeration Interface trong Java định nghĩa các phương thức từ đó bạn có thể liệt kê (từng phần tử tại một thời điểm) các phần tử trong một tập hợp các đối tượng.
Interface này kế thừa từ Iterator. Mặc dù không bị deprecated, nhưng Enumeration được xem như là đã cũ so với hệ thống code mới bây giờ. Tuy nhiên, nó được sử dụng bởi một vài phương thức được định nghĩa bởi các lớp legacy như Vector và Properties, được sử dụng bởi một số lớp API khác, và hiện tại sử dụng rộng rãi trong code ứng dụng.
Để 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ề Cấu trúc dữ liệu (Data Structure) trong Java và Ví dụ về Collection trong Java..
Các phương thức được khai báo bởi Enumeration được tổng hợp trong bảng sau:
STT Phương thức và Miêu tả
1 boolean hasMoreElements( )
Khi được triển khai, nó phải trả về true trong khi vẫn còn nhiều phần tử để extract, và false khi tất cả phần tử đã được liệt kê
2 Object nextElement( )
Trả về đối tượng kế tiếp trong Enumeration như là một tham chiếu generic Object
Ví d ụ
Sau đây là ví dụ minh họa cách sử dụng Enumeration Interface trong Java:
import java.util.Vector;
import java.util.Enumeration;
public class EnumerationTester {
public static void main(String args[]) { Enumeration days;
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 2
Vector dayNames = new Vector();
dayNames.add("Sunday");
dayNames.add("Monday");
dayNames.add("Tuesday");
dayNames.add("Wednesday");
dayNames.add("Thursday");
dayNames.add("Friday");
dayNames.add("Saturday");
days = dayNames.elements();
while (days.hasMoreElements()){
System.out.println(days.nextElement());
} } }
Nó sẽ cho kết quả sau:
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1
Lớp BitSet trong Java
Lớp BitSet trong Java tạo một kiểu mảng đặc biệt mà giữ các giá trị bit. Mảng BitSet này có thể tăng giảm kích cỡ nếu cần. Điều này làm nó tương tự như một vector của các bit.
Đây là một lớp legacy nhưng nó đã hoàn toàn được thiết kế lại trong Java 2, phiên bản 1.4.
Để 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ề Cấu trúc dữ liệu (Data Structure) trong Java.
BitSet định nghĩa hai constructor. Phiên bản đầu tiên tạo một đối tượng mặc định:
BitSet( )
Phiên bản thứ hai cho phép bạn xác định kích cỡ ban đầu của nó, ví dụ như số bit mà nó có thể giữ. Tất cả các bit được khởi tạo về 0.
BitSet(int size)
BitSet triển khai Cloneable Interface và định nghĩa các phương thức được liệt kê sau:
STT Phương thức và Miêu tả
1 void and(BitSet bitSet)
AND nội dung của đối tượng BitSet đang triệu hồi với nội dung đã được xác định bởi bitSet. Kết quả được đặt trong đối tượng đang triệu hồi
2 void andNot(BitSet bitSet)
Với mỗi bit trong bitSet, bit tương ứng trong BitSet đang triệu hồi bị xóa
3 int cardinality( )
Trả về số bit được thiết lập trong đối tượng đang triệu hồi
4 void clear( )
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 2 Thiết lập tất cả bit về 0
5 void clear(int index)
Thiết lập tất cả bit được xác định bởi index về 0
6 void clear(int startIndex, int endIndex)
Thiết lập tất cả bit được xác định từ startIndex tới endIndex -1 về 0
7 Object clone( )
Sao chép đối tượng BitSet đang triệu hồi
8 boolean equals(Object bitSet)
Trả về true nếu BitSet đang triệu hồi là tương đương với thiết lập bit trong bitSet. Nếu không là false
9 void flip(int index)
Đảo ngược các bit được xác định bởi index (
10 void flip(int startIndex, int endIndex)
Đảo ngược các bit được xác định từ startIndex tới endIndex - 1
11 boolean get(int index)
Trả về trạng thái hiện tại của bit tại index đã cho
12 BitSet get(int startIndex, int endIndex)
Trả về một BitSet mà chứa các bit từ startIndex tới endIndex-1. Đối tượng đang triệu hồi không bị thay đổi
13 int hashCode( )
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 3 Trả về hash code cho đối tượng đang triệu hồi
14 boolean intersects(BitSet bitSet)
Trả về true nếu ít nhất một cặp bit tương ứng trong đối tượng đang gọi và bitSet là 1
15 boolean isEmpty( )
Trả về true nếu tất cả bit trong đối tượng đang gọi là 0
16 int length( )
Trả về số bit cần thiết để giữ nội dung của BitSet đang gọi. Giá trị này được xác định bởi vị trí của bit cuối cùng
17 int nextClearBit(int startIndex)
Trả về chỉ mục của bit bị xóa kế tiếp (mà là zero bit kế tiếp), bắt đầu từ chỉ mục được xác định bởi startIndex
18 int nextSetBit(int startIndex)
Trả về chỉ mục của set bit kế tiếp (mà là 1 bit kế tiếp), bắt đầu từ chỉ mục được xác định bởi startIndex. Nếu không bit nào được thiết lập, thì trả về - 1
19 void or(BitSet bitSet)
OR nội dung của đối tượng BitSet đang gọi với nội dung được thiết lập bởi bitSet. Kết quả được đặt trong đối tượng đang triệu hồi
20 void set(int index)
Thiết lập bit được xác định bởi index
21 void set(int index, boolean v)
Thiết lập bit được xác định bởi index tới giá trị được truyền trong v: nếu là true thì thiết
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 4 lập bit, là false thì xóa bit đó
22 void set(int startIndex, int endIndex)
Thiết lập bit từ startIndex tới endIndex - 1
23 void set(int startIndex, int endIndex, boolean v)
Thiết lập bit, từ startIndex tới endIndex-1, tới giá trị được truyền trong v: nếu là true thì thiết lập bit, là false thì xóa bit đó
24 int size( )
Trả về số bit trong đối tượng BitSet đang gọi
25 String toString( )
Trả về chuỗi tương đương của đối tượng BitSet đang gọi
26 void xor(BitSet bitSet)
XOR nội dung của đối tượng BitSet đang gọi với nội dung được xác định bởi bitSet.
Kết quả được đặt trong đối tượng đang gọi
Ví d ụ
Chương trình sau là ví dụ minh họa các phương thức được hỗ trợ bởi cấu trúc dữ liệu này:
import java.util.BitSet;
public class BitSetDemo {
public static void main(String args[]) { BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16);
// thiet la mot so bit
http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 5
for(int i=0; i<16; i++) { if((i%2) == 0) bits1.set(i);
if((i%5) != 0) bits2.set(i);
}
System.out.println("Pattern ban dau trong bits1: ");
System.out.println(bits1);
System.out.println("\nPattern ban dau trong bits2: ");
System.out.println(bits2);
// AND bits bits2.and(bits1);
System.out.println("\nbits2 AND bits1: ");
System.out.println(bits2);
// OR bits bits2.or(bits1);
System.out.println("\nbits2 OR bits1: ");
System.out.println(bits2);
// XOR bits bits2.xor(bits1);
System.out.println("\nbits2 XOR bits1: ");
System.out.println(bits2);
} }
Nó sẽ cho kết quả sau:
Pattern ban dau trong bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
Pattern ban dau trong bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}