Ngôn ngữ java - Cơ bản về ngôn ngữ java

Khi thao tác trên mảng có thể gặp 1 số biệt lệ sau: NegativeArraySizeException IndexOutOfBoundsException ArrayIndexOutOfBoundsException ArrayStoreException

pptx143 trang | Chia sẻ: nguyenlam99 | Lượt xem: 1008 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Ngôn ngữ java - Cơ bản về ngôn ngữ java, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CƠ BẢN VỀ NGÔN NGỮ JAVAGV: Nguyễn Thị Tú MiEmail: nttmi@hcmuaf.edu.vnNội dungChú thíchKhối lệnh và câu lệnhTập kí tự dùng trong JavaTừ khóa và tênKiểu dữ liệuHằngBiếnChuyển đổi kiểu dữ liệuĐịnh dạng nhập xuấtChú thích (1)Chú thích 1 dòng: bắt đầu bằng dấu //Chú thích nhiều dòng: bắt đầu bằng /*kết thúc bằng */Chú thích (2)Chú thích javadoc: dùng để tài liệu hóa các lớp public hay protectedBắt đầu bằng /**Kết thúc bằng */Chú thích (3)Bắt đầuKết thúcMục đích/**/Đoạn code bị giới hạn là phần ghi chú//Ghi chú trên 1 dòng, trình biên dịch bỏ qua từ // đến cuối dòng/***/Ghi chú dành cho javadoc, trình biên dịch sẽ bỏ quaCâu lệnh & khối lệnh (1)Một câu lệnh trong java sẽ được kết thúc bằng dấu chấm phẩy (;)Ví dụ:private void timgiatriXmax(Integer begin, Integer i, List list) {double xmax = list.get(begin).getX();int index = begin;for (int j = begin + 1; j = xmax) {xmax = list.get(j).getX();index = j; }}this.listdiemchot.add(list.get(index));}Câu lệnh & khối lệnh (2)Các câu lệnh đơn có thể nối lại với nhau tạo thành các khối lệnh thuộc 1 lớp.Bộ lệnh của Java không giới hạn trong cặp dấu ngoặc { và }Khối lệnh có thể được đặt trong khối lệnh khác.public class Student {private String name;private GregorianCalendar bithDay;private double mark;}Tập kí tự dùng trong JavaJava được xây dựng dựa trên bộ kí tự sau:26 chữ cái hoa: AZ, 26 chữ cái thường: az10 chữ số: 09Các kí hiệu toán học: +, -, *, /, %, =, ()Dấu nối: _Các kí hiệu đặc biệt khác: :, :, {}, [], ?, \, &, !, #, $, Bên cạnh đó Java còn dùng bộ kí tự UnicodeTên (identifiers)Qui tắc đặt tên: Tên có thể được bắt đầu bằng một kí tự, hoặc dấu: $, _Tên không thể bắt đầu bằng 1 sốKhông giới hạn số kí tựKhông được trùng với từ khóaTên không được chứa dấu cáchJava phân biệt chữ hoa và chữ thườngChuẩn đặc tên do Sun đề nghịClass và interface: chữ cái đầu của mỗi chữ viết hoa, các chữ viết liền nhauTên class thường là danh từ: Dog, Printer,Tên interface thường là tính từ: Runnable, Serializable, Tên phương thức, tên biến: bắt đầu bằng chữ thường, các chữ khác bắt đầu bằng chữ hoa:getBalance, doCalculateclassName, myString Hằng: sử dụng chữ in hoa, các chữ cách nhau bằng dấu _MIN_VALUETừ khóa (1)là những từ có ý nghĩa xác địnhThường dùng để khai báo các kiểu dữ liệu, viết các toán tử và câu lệnhChú ý:Không được dùng từ khóa để đặt tên cho hằng, biến, mảng, hàm, Từ khóa phải viết bằng chữ thườngTừ khóa (2)Từ khóaÝ nghĩaabstractDùng để khai báo lớp, hàm trừu tượng.assertbooleanKiểu dữ liệu logicbreakĐược sử dụng để kết thúc vòng lặp hoặc cấu trúc switch. byteKiểu dữ liệu số nguyên.caseĐược sử dụng trong lệnh switch. charKiểu dữ liệu kí tự. catchĐược sử dụng trong xử lý ngoại lệ. classDùng để khai báo lớp. constKhai báo biến theo sau là biến hằngcontinueĐược dùng trong vòng lặp để bắt đầu một vòng lặp mới. defaultĐược sử dụng trong lệnh switch.doĐược sử dụng trong vòng lặp điều kiện sau.Từ khóa (3)Từ khóaÝ nghĩadoubleKiểu dữ liệu số thực. elseKhả năng lựa chọn thứ 2 trong câu lệnh If. enumextendsChỉ rằng một lớp được kế thừa từ một lớp khác. falseGiá trị logic.finalDùng để khai báo hằng số, phương thức không thể ghi đè, hoặc lớp không thể kế thừa.finallyPhần cuối của khối xử lý ngoại lệ. floatKiểu số thực. forCâu lệnh lặp. gotoNhảy tới dòng lệnh bất kì đã được đặt nhãnifCâu lệnh lựa chọn. implementsChỉ rằng một lớp triển khai từ một giao diện. importKhai báo sử dụng thư viện. Từ khóa (3)Từ khóaÝ nghĩainstanceofKiểm tra một đối tượng có phải là một thể hiện của một lớp hay không. intKiểu số nguyên.interfacesử dụng để khai báo giao diện.longKiểu số nguyên.nativeKhai báo phương thức được viết bằng ngôn ngữ C++. newTạo một đối tượng mới. nullMột đối tượng không tồn tại. packageDùng để khai báo một gói. privateĐặc tả truy xuất. publicĐặc tả truy xuất. protectedĐặc tả truy xuất. returnTrả giá trị về shortKiểu số nguyên. Từ khóa (4)Từ khóaÝ nghĩastaticDùng để khai báo biến, thuộc tính tĩnh. strictfpsuperTruy xuất đến lớp cha. switchLệnh lựa chọn. synchronizedMột phương thức độc quyền truy xuất trên một đối tượng. thisÁm chỉ chính lớp đó. throwNém ra ngoại lệ. throwsKhai báo phương thức ném ra ngoại lệ. transienttrueGiá trị logic. trySử dụng để bắt ngoại lệ. volatileGiá trị của biến có thể được thay đổi vài lần  không ghi vào thanh ghivoidDùng để khai báo một phương thức không trả về giá trị. whileDùng trong cấu trúc lặp. Từ khóa (5)STTLoạiTừ khóa1Kiểu dữ liệu cơ bảnbyte, short, int , long, float, double, char, boolean2Phát biểu lặpdo, while, for, break, continue3Phát biểu rẽ nhánhif, else, switch, case, default, break4Đặc tính của một phương thứcprivate, protected, public, final, static, abstract, synchronized, volatile,strictfp5Hằngtrue, false, null6Liên quan tới phương thứcreturn, void7Liên quan tới góipackage, import8Liên quan tới đối tượngnew, extends, implements, class, instance of, this superKiểu dữ liệuMỗi biến phải có 1 kiểu dữ liệuKiểu dữ liệu xác định miền giá trị cho biếnKiểu dữ liệu nguyên thủylà các dữ liệu được xác định trong ngôn ngữVí dụTa cần dùng các ký tự đặc tả để xem xét kiểu dữ liệu: i, 1, /, L, f, F, d, D (thường dùng L thay cho /)178  int (default)45.67  double (default)178L  long44.67f  float11.19e8  double (default)‘h’  character Vấn đề số vượt quá ngưỡngHiển thị số lớnKiểu dữ liệu dẫn xuấtTham chiếu tới một giá trị hay là tập hợp các giá trị mà biến khai báo.Các kiểu dữ liệu dẫn xuất:Giá trị mặc địnhLỗi hay gặp phải khi lập trình là sử dụng biến chưa khởi tạoJava hỗ trợ khởi tạo các giá trị mặc định cho các biến.HằngTừ khóa final chỉ dẫn đến 1 biến không thể thay đổi giá trị.Các hàm và lớp cũng có thể được khai báo finalHàm final không thể viết chồngLớp final không thể là lớp confinal int MAX = 10;Biến (1)Biến là một vị trí trong bộ nhớ máy tính mà ở đó giá trị được lưu trữ và có thể được truy xuất sau đó.Sử dụng để lưu trữ dữ liệu có thể thay đổi trong quá trình thực thiBiến (2)Tên biến phải là duy nhất trong 1 phạm viCác biến cần được khai báo trước khi sử dụngKhai báo biến bao gồm đặc tả tên biến, và đặc tả kiểu dữ liệu mà biến đại diện.Cú pháp:Type variable;HayType variable = value;Biến (3)Kiểu biến:Kiểu dữ liệu nguyên thủyTên của 1 lớpMột mảngĐể khai báo 1 biến mới ta phải khai báo 1 lớp mới, sau đó kiểu biến mới được khai báo kiểu là lớp mới đó.Biến (4)Các loại biến trong Java:Biến đối tượngBiến lớpBiến cục bộBiến đối tượngDùng để định nghĩa thuộc tính, trạng thái cho 1 đối tượngCó thể là biến toàn cục của 1 đối tượngKhai báoType variable;Biến lớpTương tự biến đối tượng nhưng giá trị nằm trong chính lớp đóẢnh hưởng toàn cục đến 1 lớp và tất cả các đối tượng trong lớp đóThích hợp dùng để trao đổi thông tin giữa các đối tượng khác nhau trong cùng một lớp hau theo dõi trạng thái toàn cục của đối tượngCú phápstatic Type variable;Biến cục bộĐược khai báo và sử dụng trong thân phương thứcBắt buộc phải gán giá trị trước khi sử dụngJava không có biến toàn cục, biến đối tượng hoặc biến lớp được dùng để truyền thông tin toàn cụcStack - heapstatic memorystack memoryheap memorycodestatic dataconstantstemporarydatadynamicdataStack - heapThông thường một biến, hàm hay đối tượng trong Java sẽ được lưu trữ trong stack hoặc heapCác biến khởi tạo và đối tượng sẽ nằm trong heapCác biến cục bộ sẽ nằm trong stackVí dụVí dụPhạm vi của biếnBiến toàn cục: có thể truy cập bất cứ đâu trong toàn bộ chương trìnhBiến cục bộ tồn tại giới hạn và quan hệ chỉ trong phần nhỏ của mãpublic class MyClass {int i; // member variableint first() {int j; // local variable// i va j deu co the truy cap tu dayreturn 1;}int second() {int j; // local variable// i va j deu co the truy cap tu dayreturn 2;}}Chuyển đổi kiểu dữ liệu (1) Dùng để chuyển từ một kiểu dữ liệu này sang kiểu dữ liệu khácCó 2 dạng ép kiểu:Ép kiểu ngầm địnhÉp kiểu tường minhChuyển đổi kiểu dữ liệu (2)Ép kiểu ngầm địnhKhi một kiểu dữ liệu được gán cho 1 biến của 1 kiểu khác  tự động chuyển kiểuĐiều kiện:Hai kiểu phải tương thíchKiểu đích phải lớn hơn kiểu nguồnÉp kiểu tường minhKhi cần chuyển sang kiểu có độ chính xác cao hơnChuyển đổi kiểu dữ liệuCó 3 dạng chuyển đổi kiểu dữ liệuChuyển đổi cho các kiểu dữ liệu cơ bảnChuyển đổi kiểu cho các đối tượng: các lớp chuyển đổi phải kế thừa nhauChuyển đổi cho các kiểu dữ liệu cơ bản sang đối tượng và ngược lại:Chỉ chuyển đổi giữa các đối tượng có sẵn trong gói java.lang tương ứng với các dữ liệu nguyên thủy(New Type) value;(New Class) object;int intObject = new Integer(32);Các lớp bao (wrapper class)Các lớp bao (wrapper class)Khởi tạo:Integer I = new Integer(9); hoặc Integer I = new Integer(“9”);Phương thức valueOf()Integer i2 = Integer.valueOf("101011", 2);  43Float f2 = Float.valueOf("3.14f");  3.14Phương thức xxxValue()Integer i2 = new Integer(42);byte b = i2.byteValue();short s = i2.shortValue();double d = i2.doubleValue();parseXxx()double d4 = Double.parseDouble("3.14");  3.14long L2 = Long.parseLong("101010", 2);42Khởi tạo biếnIntegersbyte largestByte = Byte.MAX_VALUE;short largestShort = Short.MAX_VALUE;int largestInteger = Integer.MAX_VALUE;long largestLong = Long.MAX_VALUE;real numbersfloat largestFloat = Float.MAX_VALUE;double largestDouble = Double.MAX_VALUE;other primitive typeschar aChar = 'S';boolean aBoolean = true;Autoboxing AutoboxingKết quả như thế nào?Boxing, ==, và equals()==: kiểm tra bằng về vị trí bộ nhớequals(): kiểm tra bằng về ngữ nghĩaKết quả là gì?Tại sao?Boxing, ==, và equals()Hai đối tượng wrapper luôn được so sánh dựa trên giá trị nguyên thủy nếu chúng là:Boolean ByteCharacter từ \u0000 đến \u007f (7f là127 trong hệ 10)Short và Integer từ -128 đến127Định dạng nhập xuất (1)Mã định dạng: bất kì một đầu ra được hiển thị trên màn hình cần phải được định dạngĐịnh dạng nhập xuất (2)Hàm printf() trong Java được sử dụng để định dạng kiểu dữ liệu ở consoleVí dụ:public static void main(String[] args) {int i = 10;System.out.printf("gia tri cua i la %d", i);}Lớp ScannerCho phép người dùng đọc giá trị của một vài kiểuMột số phương thức của Scanner với System.in là đối tượng dòng đầu vào:public static void main(String[] args) { Scanner scaner = new Scanner(System.in);}Đối tượng InputStreamDãy EscapeCác toán tử số họcPhép toán 1 ngôiToán tử quan hệ và bằng nhaukết quả trả về luôn là một giá trị booleanCác phép toán điều kiệnCác toán tử làm việc với bitToán tử luận lýCác biểu thức có kiểu trả về là boolean, có thể kết hợp lại với nhau bằng các toán tử luận lý như:AND (& hoặc &&)OR (| hoặc ||)XOR (^)NOT (!)Toán tử gánCú pháp: Ví dụ: a +=4; tương đương với a = a+4;Variable operator = value;Tương ứng vớiVariable = Variable operator value;Một số toán tử khác (1)Một số toán tử khác (2)Biểu thức & toán tửPhép toán trên kiểu chuỗi String:Java dùng toán tử + để nối hai chuỗi lại với nhauĐộ ưu tiên của các toán tửSystem.out.println(name + " is a " + color);Tính kết hợp của các phép toánVí dụKết quả là gì?Vd1:Vd 2:Biểu thứcLà sự kết nối các biến, các từ khóa hay các kí hiệu để trả về 1 giá trị của 1 kiểu nào đó.Giá trị của các biểu thức có thể là số, chuỗi hoặc kiểu dữ liệu khácCác loại biểu thức:Biểu thức logicBiểu thức số họcBiểu thức gánCác câu lệnh điều khiểnKiểuTừ khóaDecision makingif-else, switch-caseLoopingfor, while, do-whileException handlingtry-catch-finally, throwBranchingBreak, continue, label:, returnCác câu lệnh điều khiển quyết địnhCấu trúc rẽ nhánh if (1)conditionfalsestatementtrue Cú pháp:if (expression) { statement(s) } Cấu trúc rẽ nhánh if (2)Cấu trúc rẽ nhánh if (3)Ví dụ: public static void main(String[] args) {int testScore = 76;char grade;if (testScore >= 90) { grade = 'A';}if (testScore >= 80) { grade = 'B';}if (testScore >= 70) { grade = 'C';}if (testScore >= 60) { grade = 'D';}if (testScore >= 50) { grade = 'E';} else { grade = 'F';}System.out.println("Grade = "+ grade);}???Cấu trúc rẽ nhánh phức: switch (1)Cấu trúc rẽ nhánh phức: switch (2)Ví dụpublic static void main(String[] args) {int month = 2;int numdays = 0;switch (month) {case 2:numdays = 28;break;case 1:case 3:case 5:case 7:case 8:case 10:case 12:numdays = 31;break;default: numdays = 30;}System.out.println("num of day = "+ numdays);}So sánh giữa if và switchDemoCác câu lệnh điều khiển lặpVòng lặp for (1)Vòng lặp for (2)Ví dụ:public static void main(String[] args) {for(int i=1; i 10) break; } System.out.println("inside the outer loop: out = " + out + ", in = " + in);}System.out.println("end of the outer loop: out = " + out + ", in = “ + in);}Unlabled formLệnh break (2)public static void main(String[] args) {int out, in = 0;outer: for (out = 0; out 10) break outer;}System.out.println("inside the outer loop: out = " + out + ", in = " + in);}System.out.println("end of the outer loop: out = " + out + ", in = “ + in);}Labeled formLệnh continueDùng để nhảy qua(skip) vòng lặp (for, while, do-while,)Lệnh continue cũng có 2 dạng:Unlabeled formLabeled formUnlabeled formpublic static void main(String[] args) {StringBuffer searchMe = new StringBuffer("peter piper picked a peck of pickled peppers");int max = searchMe.length();int numPs = 0;System.out.println(searchMe);for (int i = 0; i < max; i++) {// interested only in p'sif (searchMe.charAt(i) != 'p') continue;// process p'snumPs++;searchMe.setCharAt(i, 'P');}System.out.println("Found " + numPs + " p's in the string.");System.out.println(searchMe);}Unlabeled formLabeled formpublic static void main(String[] args) {// finds a substring(substring) in given string(serchMe)String searchMe = "Look for a substring in me";String substring = "sub";boolean foundIt = false;int max = searchMe.length() - substring.length();test: for (int i = 0; i <= max; i++) {int n = substring.length(), j = i, k = 0;while (n-- != 0) {if (searchMe.charAt(j++) != substring.charAt(k++)) continue test;}foundIt = true;break test;}System.out.println(foundIt ? "Found it" : "Didn't find it");}Labeled formLệnh return (1)Lệnh return có 2 dạng:Trả về 1 giá trị: return ++count;Giá trị trả về phải phù hợp với kiểu trả về của hàmKhông trả vè giá trị nào cả:return;Kiểu trả về của hàm phải là voidLệnh return (2)public boolean seachFirst() {int[] array = { 10, 5, 9, 3, 8, 5, 8, 5 };int matchValue = 8;for (int i = 0; i < array.length; i++) {if (matchValue == array[i])return true;}return false;}public void displayDayOfWeek(int day) {if (day == 1) {System.out.println("Sunday");return;}if (day == 2) {System.out.println("Monday");return;}if (day == 3) {System.out.println("Tuesday");return;}}Trả về giá trị booleanKhông trả về giá trịGiới thiệu về biệt lệLà 1 kiểu lỗi đặc biệt, xảy ra trong thời gian thực thi khối lệnh và có thể gây ngừng đột ngột chương trình.Các lỗi thường gây nên biệt lệ:Tràn bộ nhớLỗi cấp phát tài nguyênKhông tìm thấy fileLỗi kết nốiMục đích của việc xử lý biệt lệGiảm thiểu việc kết thúc bất thường của hệ thống và của chương trình.Ví dụ: khi đang thao tác trên 1 tập tin nếu gặp lỗi mà không xử lý và chương trình kết thúc đột ngột thì file sẽ không được đóng và có thể dẫn đến hư file và các nguồn tài nguyên sẽ không được giải phóng.Mô hình xử lý ngoại lệCác từ khóa để xử lý ngoại lệtrycacththrowthrowsfinallyJava API Exception HierachyCheck – Uncheck ExceptionHầu hết các lỗi đều nhận tự động từ RuntimeException, do đó không cần phải throws.Các biệt lệ dạng Check Exception (Exception) là các biệt lệ được trình biên dịch Java kiểm tra xem các phương thức có ném các biệt lệ được liệt kê hay không thông qua throws.Các biệt lệ dạng Uncheck Exception (Error) là các biệt lệ được ném ra do lỗi lập trình bất ngờ. Các biệt lệ này phải được xử lý bằng cách sửa lại mã nguồn.Ví dụLỗi???public static void main(String[] args) {int d = 0;int a = 10/d;}Lớp Error(1)Các biệt lệ thuộc lớp Error có tính chất nghiêm trọng thường liên quan tới hệ thống và chưa được kiểm tra.Khi biệt lệ Error xảy ra thì chương trình thường sẽ bị dừngLớp Error(2)Các lớp con của Error:ExceptionInInitializerErrorIncompatibleClassChangeErrorInternalErrorNoClassDefFoundErrorNoSuchMethodErrorStackOverflowErrorUnknownErrorUnsupportedClassVersionErrorVirtualMachineErrorCác lớp con của Error:AbstractMethodErrorClassFormatErrorIllegalAccessErrorLinkageErrorNoSuchFieldErrorOutOfMemoryErrorThreadDeathUnsatisfiedLinkErrorVerifyErrorClassCircularityErrorLớp Error(3)Bạn không nên mở rộng lớp Error vì:Các biệt lệ Error chưa được kiểm tra trình biên dịch không kiểm soát được được phương thức(đã kiểm tra hay bắt lỗi chưa)Các biệt lệ chưa được kiểm tra không cần throws nên không xác định được dòng nào gây lỗi.Có thể gây nên 1 số lỗi hệ thống khi cố gắng thực thi các Error này.Lớp ExceptionCác biệt lệ thộc về lớp Exception là các biệt lệ đã được kiểm traPhương thức ném các biệt lệ trong mệnh đề throwsTrình biên dịch sẽ kiểm tra xem các lỗi này có được bắt trong các câu lệnh try-catch hay không.Lớp RuntimeException(1)Được mở rộng từ lớp ExceptionLà các biệt lệ dạng Unchecked ExceptionÍt nghiêm trọng hơn Error, thường báo lỗi lập trình cần phải xử lý ở mã nguồn.Dạng lỗi này không sửa được trong quá trình thi hành.Không nên mở rộng từ RuntimeException và không nên bắt dạng ngoại lệ này.Lớp RuntimeException(2)Các lớp con của RuntimeException:ClassCastExceptionEmptyStackExceptionIllegalMonitorStateExceptionIllegalThreadStateExceptionMissingResourceExceptionNoSuchElementException (catch được)IndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionUnsupportedOperationExceptionCác lớp con của RuntimeException:ArithmeticExceptionArrayStoreExceptionConcurrentModificationExceptionIllegalArgumentExceptionIllegalStateExceptionNumberFormatException(catch được)NegativeArraySizeExceptionNullPointerExceptionSecurityExceptionUndeclaredThrowableExceptionQuá trình xử lý lỗiXác định loại lỗi và đoạn lệnh xảy ra lỗiXác định cơ chế bắt lỗiXác định vị trí đoạn lệnh cần viết để bắt lỗiXác định thông báo sẽ hiển thị nếu lỗi xảy raViết đoạn lệnh xử lý lỗiLưu, biên dịch và chạy chương trìnhXử lý biệt lệ như thế nào?Khi 1 biệt lệ xảy ra thì một đối tượng tương ứng sẽ được tạo ra.Đối tượng sẽ được truyền tới phương thức nơi mà biệt lệ xảy ra.Đối tượng này chứa các thông tin chi tiết về biệt lệ, các thông tin này sẽ có thể được nhận và xử lý.Lớp “Throwable” của Java là lớp cha của tất cả các biệt lệBiệt lệMô hình xử lý biệt lệCác mô hình dùng để xử lý biệt lệ:Try-catch-finallyThrow / throwsTry-catch-finally (1)Sử dụng khối try, catch, finally để bắt giữ các ngoại lệKhối lệnh có thể ném ngoại lệKhối lệnh sẽ thực hiện nếu ngoại lệ xảy raKhối lệnh sẽ thực hiện bất chấp ngoại lệ xảy ra hay khôngTry-catch-finally (2)public static void method(String s) {try { System.out.println(Integer.parseInt(s));} catch (NumberFormatException e) { System.out.println("wrong fomat");}finally{ System.out.println(“String s = ”+s);}}Mô hình catch-throw nâng caoNgười lập trình chỉ quan tâm tới các lỗi khi cần thiết.Một thông báo lỗi có thể được cung cấp trong exception-handler.Khối try-catch(1)Được sử dụng để thực hiện trong mô hình “cacth and throw” của xử lý biệt lệ.Khối lệnh try gồm tập hợp các lệnh thực thi có thể xảy ra lỗi.Một phương thức có bắt biệt lệ bao gồm:1 khối lệnh try1 hoặc nhiều khối lệnh catchMột phương thức mà có thể bắt biệt lệ cũng bao gồm khối lệnh tryKhối lệnh catch dùng để bắt biệt lệ trong khối tryKhối try-catch(2)Để bắt bất kì một biệt lệ nào cũng cần chỉ ra kiểu biệt lệ là “Exception”Khi không biết rõ biệt lệ thuộc lớp nào ta có thể dùng lớp cha “Exception” để bắt.Lỗi sẽ được truyền thông qua khối lệnh try-catch cho đến khi nó gặp 1 catch tham chiếu tới nó hoặc chương trình sẽ kết thúcKhối lệnh chứa nhiều catchCác khối chứa nhiều catch sẽ xử lý các kiểu biệt lệ một cách độc lập.try{ doFileProcessing(); displayResults(); } catch(LookupException e){ handleLookupException(e); } catch(Exception e){ System.err.println(“Error:”+e.printStackTrace()); }Khối lệnh chứa nhiều tryKhi sử dụng các khối try lồng nhau, thì khối try trong cùng sẽ được thực thi đầu tiên.Bất kỳ biệt lệ nào bị chặn trong khối lệnh try sẽ bị bắt giữ trong khối catch liền sau nó.Nếu không tìm thấy khối catch thích hợp thì sẽ xét đến khối catch bên ngoài.Ngược lại JRE sẽ xử lý biệt lệ.Khối finally(1)Khối finally là không bắt buộcĐược đặt sau khối catch hoặc khối try nếu không có khối catchLuôn được thực thi bất chấp có biệt lệ hay khôngKhối finally(2)Thực thi tất cả các việc thu dọn khi biệt lệ xảy ra.Có thể sử dụng kết hợp với khối tryChứa các câu lệnh thu hồi tài nguyên cho hệ thống hay in các câu lệnh thông báo.Đóng tập tinĐóng bộ kết quả(sử dụng trong CSDL)Đóng các kết nốiThrow và Throws(1)Các biệt lệ được chặn bởi sự trợ giúp của từ khóa throw.Throw giúp chỉ ra biệt lệ vừa xảy ra.Toán hạng của throw là một đối tượng của 1 lớp mà lớp này được dẫn xuất từ Throwabletry{if (flag < 0){ throw new MyException( ) ; // user-defined }}Throw và Throws(2)Một phương thức đơn có thể được chặn bởi nhiều biệt lệ.public class Example {public void exceptionExample( ) throws ExException, LookupException {try{ // statements }catch(ExException exmp){ . }catch(LookupException lkpex){ . } }}Throw và Throws(3)Lớp Exception thực thi giao diện Throwable và cung cấp các tính năng hữu dụng để phân phối các biệt lệ.Một lớp con của lớp Exception là một biệt lệ mới có thể bắt giữ độc lập các Throwable khác nhau.Định nghĩa mới một ngoại lệMuốn định nghĩa mới 1 ngoại lệ  chỉ cần hiện thực Throwable hoặc ExceptionCó thể định nghĩa lại các hành vi của các lớp cha này hoặc định nghĩa mới các hành vi sao cho phù hợp.Trình quản lý bộ nhớ và gom rácJava dùng trình gom rác (garbage collection) để quản lý bộ nhớMục đích của GC là xóa các đối tượng không còn tham chiếu Trình gom rác chỉ làm việc với heap (nơi lưu trữ các đối tượng Java)GC được JVM quản lý và JVM sẽ quyết định khi nào GC sẽ chạy. Bạn có thể gọi GC trong chương trình Java nhưng không đảm bảo JVM sẽ đáp ứng. (bạn chỉ có thể đề nghị)Trình quản lý bộ nhớ và gom rácGC sử dụng việc đếm tham chiếu, thuật đánh dấu và thuật toán quét để gom rác Một đối tượng sẽ bị gom rác trong trường hợp không còn 1 tiến trình nào đang sống tham chiếu tới nó.Có thể gọi Syetem.gc() hoặc Runtime.getRuntime().gc() để gọi trình gom rác thực thi nhưng chưa chắc khi nào GC sẽ thực sự thực thiHàm finallize() sẽ thực thi trước khi đối tượng bị gom rác nhưng không chắc sẽ được chạy, nó sẽ chỉ chạy duy nhất 1 lần  không nên override Định nghĩa mảngMảng là một cấu trúc giữ không hoặc nhiều giá trị cùng kiểu dữ liệu.Chiều dài của mảng phải được xác định khi khởi tạo mảng và không thay đổi  mảng là 1 cấu trúc fix-lengthĐặc điểm mảngCác phần tử trong mảng có thể là:primitive datatypereference datatypeLưu trữ và truy xuất các phần tử theo chỉ mục.Là lớp con của Object và hiện thực 2 interfaces Serializable và Cloneable.Một số đặc tính của mảng:random accesslinear lookupTạo mảngKhai báo mảngKhởi tạo mảngKhởi tạo giá trị mảngtype[] array_name;int[] anArray = new int[10]; int[] anArray; float[] anArrayOfFloats;boolean[] anArrayOfBooleans;Object[] anArrayOfObjects;String[] anArrayOfStrings;new elementType[arraySize]boolean[] answers = { true, false, true};Các cách khi báo mảngint[] type; nên dùng cách nàyint [] type;int type[];int type []: Ví dụString names[] = new String[3];names[0] = "Leonardo";names[1] = "da";names[2] = "Vinci";String names[] = {"Leonardo", "da", "Vinci"};Giống nhauString names[] = new String []{"Leonardo", "da", "Vinci"};Giống nhauMảng các dữ liệu nguyên thủyMảng đối tượngThao tác trên mảngTruy xuất đến các phần tửXác định chiều dàifor (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " ");}arrayname.lengthGhi chúMảng rỗng thì chiều dài của nó bằng 0, lúc này không truy xuất được các phần tử mảng.Sau khi khởi tạo, biến mảng sẽ tham chiếu tới phần tử đầu tiên trong mảng.Mảng nhiều chiềuKhi mỗi phần tử trong mảng tham chiếu tới một mảng khác  bạn cần tới mảng đa chiều.Chỉ cần thêm 1 cặp [] khi muốn có thêm 1 chiềuint coordinates[][];coordinates[0][0] = 2;Mảng nhiều chiềuVí dụVí dụSao chép dữ liệu trên mảngJava hỗ trợ 3 cách sao chép dữ liệu mảngToán tử gánclone()System.arraycopy()Sao chép dữ liệu trên mảngToán tử gán: Nhận xét: cả hai mảng cùng tham chiếu tới 1 đối tượng mảngkhi thay đổi thì cả 2 cùng thay đổiCopy tham chiếuSao chép dữ liệu trên mảngHàm System.arraycopy(): Nhận xét: hai biến mảng tham chiếu tới 2 đối tượng mảng khác nhauKhi thay đổi trên 1 mảng sẽ không ảnh hưởng tới mảng kiaCopy nội dungSao chép dữ liệu trên mảngHàm clone()Nhận xét: hai biến mảng tham chiếu tới 2 đối tượng mảng khác nhauKhi thay đổi trên 1 mảng sẽ không ảnh hưởng tới mảng kiaCopy nội dungSao chép dữ liệu trong mảngHàm System.arraycopy() dùng để copy để copy dữ liệu từ mảng này sang mảng khác.public static void arraycopy(Object source,int srcIndex, Object dest,int destIndex, int length)Ví dụBài tậpLỗi gì?Mảng rải rác tam giác (Triangular Sparse Array)Mảng rải rác tam giác (Triangular Sparse Array)Các biệt lệ trên mảngKhi thao tác trên mảng có thể gặp 1 số biệt lệ sau:NegativeArraySizeExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionArrayStoreExceptionLớp tiện ích ArraysDemo một số phương thức tiện ích trong Arrays

Các file đính kèm theo tài liệu này:

  • pptxphan1_1_7968.pptx
Tài liệu liên quan