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