Lập trình mạng với Java - Chương 2: Giới thiệu ngôn ngữ lập trình Java
Lịch sửphát triển của Java bắt đầu năm 1991 khi SUN tiến hành các dựán lập trình cho
vi xửlý dùng trong các thiết bị điện tửkhác nhau. C++ không đáp ứng được các yêu
cầu này vì C++ cho đem mã nguồn từmáy này sang máy khác nhưng sau khi biên dịch
lại hoàn toàn phụthuộc vào từng bộvi xửlý cụthể. Trong khi đó bộvi xửlý dùng trong
các thiết bị điện tửrất đa dạng và có vòng đời khá ngắn ngủi. Nếu ta thay đổi bộxửlý
dẫn đến cần phải thay đổi trình biên dịch C++, điều này gây lên tốn kém. SUN đã thiết
kếmột ngôn ngữlập trình mới có tính khảchuyển cao hơn đó chính là Java. Java là tên
địa phương nơi xuất xứcủa một loại cà phê ngon nổi tiếng.
Java được chính thức công bốnăm 1995 và ngay lập tức đã tạo lên một trào lưu
mới trên toàn thếgiới và từ đó đến nay vẫn tạo được sức cuốn hút mạnh mẽ. Bởi vì
Java không chỉ đơn thuần là một ngôn ngữlập trình mà nó là giải pháp cho nhiều vấn
đề.
vào mệnh đề implements trong khai báo lớp. Một
lớp có thể thực thi nhiều giao tiếp (Java hỗ trợ đa thừa kế giao tiếp), vì vậy sau từ khóa
implements là một danh sách các giao tiếp được thực thi bởi một lớp.
Chú ý: Mệnh đề implements đứng sau mệnh đề extends nếu tồn tại mệnh đề extends.
class CalculatorTest implements CalculatorInterface
{
public double add(double x, double y)
{
return x+y;
}
public double sub(double x, double y)
{
return x-y;
}
public double mul(double x, double y)
{
return x*y;
}
public double div(double x, double y)
{return x/y;
}
public static void main(String[] args) throws Exception
{
CalculatorInterface cal=new CalculatorTest();
if(args.length!=2)
{
34
System.out.println("Cach chay chuong trinh: java CalculatorImpl
so1 so2");
return;
}
else
{
double x,y,z;
x=Double.parseDouble(args[0]);
y=Double.parseDouble(args[1]);
System.out.println(x+"+"+y+"="+cal.add(x,y));
System.out.println(x+"-"+y+"="+cal.sub(x,y));
System.out.println(x+"*"+y+"="+cal.mul(x,y));
System.out.println(x+"/"+y+"="+cal.div(x,y));
}
}
}
Kết quả thực hiện chương trình là
C:\MyJava>java CalculatorTest 12 3
12.0+3.0=15.0
12.0-3.0=9.0
12.0*3.0=36.0
12.0/3.0=4.0
Sử dụng giao tiếp như là một kiểu
Khi ta định nghĩa một giao tiếp mới, ta có thể định nghĩa kiểu dữ liệu tham chiếu mới.
Giao tiếp có thể được sử dụng khi khai báo một biến tham chiếu. Giả sử MyInterface là
một giao tiếp thì ta có thể khai báo như sau:
MyInterface mi;
2.7. Các gói và sử dụng gói trong Java
Các gói có các thành phần là các lớp, các interface, và các gói con có liên quan với
nhau. Việc tổ chức thành các gói có một số lợi ích sau đây:
o Các gói cho phép ta tổ chức các lớp thành các đơn vị nhỏ hơn (như
các thư mục), và giúp cho việc định vị và sử dụng các lớp tương ứng
trở nên dễ dàng hơn.
o Tránh được các vấn đề về xung đột tên.
o Cho phép ta bảo vệ các lớp, dữ liệu và các phương thức theo một
quy mô lớn hơn so với phạm vi lớp.
35
o Các tên gói có thể được sử dụng để định danh các lớp của bạn.
• Truy xuất tới các thành phần của gói trong Java
Để truy xuất tới thành phần của gói trong Java ta có thể sử dụng cú pháp sau:
MyPackage.MyClass
MyPackage là tên gói, MyClass là tên lớp nằm trong gói MyPackage.
• Khai báo các gói trong chương trình
Để có thể sử dụng các thành phần của một gói trong chương trình Java, ta cần phải
khai báo gói cụ thể chứa lớp đó:
import ten_goi.*;// ten_goi: tên gói
Với khai báo như trên, ta có thể truy xuất tới tất cả các lớp, các interface nằm trong gói
đó. Để khai báo sử dụng một lớp cụ thể trong chương trình ta khai báo dòng lệnh sau:
import ten_goi.ten_lop; // ten_lop: tên lớp
Giả sử ta có gói MyPackge, bên trong gói MyPackage lại có một số gói con như
SubPackage1, SubPackage2,..ta có thể khai báo sử dụng các thành phần trong gói con
SubPackage1 như sau:
import MyPackage.SubPackage1.*;
• Cách tạo ra các gói trong Java
Bước 1: Khai báo một gói trong Java
Giả sử ta khai báo một gói có tên là mypackage, bên trong gói này có lớp Calculator.
package mypackage;
public class Calculator
{
public double cong(double a,double b)
{
return a+b;
}
public double nhan(double a, double b)
{
return a*b;
}
public double tru(double a,double b)
{
return a-b;
}
public double chia(double a,double b) throws Exception
{
36
return a/b;
}
}
Bước 2: Biên dịch
C:\>javac -d C:\MyJava Calculator.java
Một vài điều cần lưu ý khi khai báo các thành viên của gói.
Thứ nhất, các thành phần của gói cần được khai báo với thuộc tính public, nếu cần truy
xuất chúng từ bên ngoài.
2.6. Quản lý ngoại lệ (Exception Handling)
• Khái niệm
Trong quá trình xử lý, các ứng dụng có thể bất ngờ gặp các lỗi với các mức độ nghiêm
trọng khác nhau. Khi một phương thức tác động trên một đối tượng, đối tượng có thể
phát hiện các vấn đề trạng thái bên trong (chẳng hạn các giá trị không nhất quán, như
lỗi chia 0), phát hiện các lỗi với các đối tượng hay dữ liệu mà nó thao tác (như file hay
địa chỉ mạng) xác định nó vi phạm các qui tắc cơ bản (như đọc dữ liệu từ một luồng đã
bị đóng),...Rất nhiều người lập trình không thể kiểm tra tất cả các trạng thái lỗi có thể
xảy ra.
Exception cung cấp một cách để kiểm tra các lỗi mà không chia cắt mã. Exception cũng
đưa ra một cơ chế báo lỗi một cách trực tiếp chứ không sử dụng các cờ hay các hiệu
ứng phụ.
• Các ngoại lệ trong Java
Trong Java có một lớp Exception, mọi lớp ngoại lệ là lớp con của lớp này. Lớp
Exception là lớp con của lớp Throwable
Throwable
Exception
37
Hình 2.7
Lớp Throwable chứa một xâu được sử dụng để mô tả ngoại lệ. Ngoại lệ được phân
thành hai loại: Ngoại lệ được kiểm tra (checked exception) và ngoại lệ không được kiểm
tra (unchecked exception).
Ngoại lệ được kiểm tra là ngoại lệ mà trình biên dịch sẽ kiểm tra phương thức của
người lập trình và chỉ đưa ra ngoại lệ khi chúng được thông báo để đưa ra.
Ngoại lệ không được kiểm tra là lớp con của các lớp Error; RuntimeException.
Java cung cấp một mô hình quản lý các ngoại lệ cho phép kiểm tra các lỗi ở các vị trí có
liên quan.
• Khối try và catch
Cú pháp
o Khối try
Bao gồm một tập hợp các lệnh có thể phát sinh ngoại lệ trong khi xử lý. Một phương
thức, có thể đưa ra một ngoại lệ cũng được đặt try
Các khối try lồng nhau
try{
stmt1;
stmt2;
try{
stmt3;
stmt4;
}
catch(Exception e)
{
}
}
catch(Exception e)
{
}
Khi các khối try được lồng nhau, khối try bên trong được xử lý trước và một ngoại lệ
được đưa ra trong khối đó được đón bắt trong các khối try catch con. Nếu khối catch
bên trong không thỏa mãn thì các khối try bên ngoài được kiểm tra. Nếu một khối catch
phù hợp được tìm thấy, thì ngoại lệ được quản lý trong khối đó ngược lại thì môi trường
Java Runtime quản lý ngoại lệ.
try
{
doFileProcessing();
38
displayResults();
}
catch(Exception e)
{
System. er.println(e.getMessage());
}
Bất kỳ lỗi nào xảy ra trong quá trình xử lý doFileProcessing() hay displayResult() thì sẽ
đựơc đón bắt bởi khối catch và được xử lý.
Nếu có lỗi xảy ra trong quá trình xử lý doFileProcessing(), phương thức displayResult()
sẽ không bao giờ được gọi, và khối catch sẽ được xử lý.
Một khối try có thể có nhiều khối catch và xử lý các kiểu khác nhau
try
{
}
catch(Exception e)
{
}
catch(Exception e)
{
}
finally
{
//Thực hiện công việc thu dọn
}
Ví dụ:
class TryCatch
{
public static void main(String[] args)
{int x,y;
try{
x=Integer.parseInt(args[0]);
y=Integer.parseInt(args[1]);
x=x/y;
System.out.println("x="+x);
}
39
catch(ArithmeticException e)
{
System.out.println("Khong the chia cho 0");
System.err.println(e);
}
}
}
Kết quả 1
C:\MyJava\Baitap>java TryCatch 18 9
x=2
Kết quả 2
C:\MyJava\Baitap>java TryCatch 9 0
Khong the chia cho 0
java.lang.ArithmeticException: / by zero
• Khối finally
Khối finally là khối mà chúng ta thấy các lệnh trả về các tài nguyên cho hệ thống và các
lệnh khác để in ra bất kỳ thông báo nào.
Các lệnh trong khối finanally có thể là:
o Đóng một file.
o Đóng một resultset (Lập trình cơ sở dữ liệu).
o Ngắt liên kết được thiết lập với cơ sở dữ liệu.
…
Khối finally luôn được xử lý dù ngoại lệ có xảy ra hay không
• Mệnh đề throw
Các ngoại lệ được đưa ra bằng cách sử dụng lệnh throw, nó nhận một đối tượng làm
tham số, đối tượng thuộc lớp là lớp con của lớp Throwable
Ví dụ:
class ArraySizeException extends NegativeArraySizeException
{
ArraySizeException()
{
super("Nhap kich thuoc mang khong hop le");
}
}
40
class ThrowDemo
{
int size, a[];
ThrowDemo(int s)
{
size =s;
try{
checkSize();
}
catch(ArraySizeException e)
{
System.out.println(e);
}
}
void checkSize() throws ArraySizeException
{
if(size<0) throw new ArraySizeException();
a= new int[3];
for(int i=0;i<3;i++)a[i]=i+1;
}
public static void main(String[] args)
{
new ThrowDemo(Integer.parseInt(args[0]));
}
}
Kết quả thực hiện chương trình
C:\MyJava\Baitap>java ThrowDemo -1
ArraySizeException: Nhap kich thuoc mang khong hop le
Giải thích:
Chúng ta đã tạo ra một lớp có tên ArraySizeException, lớp này là lớp con của lớp
NegativeArraySizeException. Bằng cách tạo ra một đối tượng của lớp này, chúng ta đã
in ra thông báo ngoại lệ. Phương thức checkSize() có thể đưa ra ngoại lệ
ArraySizeException.
không có ngoại lệ có ngoại lệ
try
41
Hình 2.8
Ví dụ:
class FinallyDemo
{
String name;
int x,y;
FinallyDemo(String s[])
{
try{
name = new String("try catch finally demo");
x = Integer.parseInt(s[0]);
y=Integer.parseInt(s[1]);
System.out.println(name);
System.out.println("Ket qua "+x/y);
}
catch(ArithmeticException e)
{
System.err.println("Khong the chia 0!");
}
finally
{
name = null;
System.out.println("Xu ly khoi finally");
}
42
}
public static void main(String[] args)
{
new FinallyDemo(args);
}
}
Kết quả 1
C:\MyJava\Baitap>java FinallyDemo 16 0
try catch finally demo
Khong the chia 0!
Xu ly khoi finally
Kết quả 2
C:\MyJava\Baitap>java FinallyDemo 16 4
try catch finally demo
Ket qua 4
Xu ly khoi finally
• Một số ngoại lệ thường gặp
o RuntimeException
o ArithmeticException
o IllegalArgumentException
o ArrayIndexOutOfBoundsException
o NullPointerException
o SecurityException
o NoSuchElementException
o ClassNotFoundException
o AWTException
o DataFormatException
o SQLException
o IOException
o UnknownHostException
o SocketException
43
o EOFException
o MalformedURLException
o FileNotFoundException
o IllegalAccessException
o NoSuchMethodException
File đính kèm:
Lập trình mạng với Java - Chương 2_Giới thiệu ngôn ngữ lập trình Java.pdf

