Những điều khiển lặp khác
Tất cả các lệnh lặp đều có thể được đặt nhãn, vì vậy có thể dùng lệnh break và continue cho bất cứ
cấp độ lồng nhau nào của vòng lặp.
break; //thoát khỏi vòng lặp hoặc lệnh switch gần nhất chứa nó
break label; // thoát khỏi vòng lặp được đặt nhãn (label)
continue; //tiến hành lượt lặp tiếp theo
continue label; //tiến hành lượt lặp tiếp theo với vòng lặp được
đặt nhãn (label).
Nhãn được đặt trước vòng lặp cùng dấu hai chấm, ví dụ:
outer:
for (. . .) {
. . .
continue outer;
}
Ngoại lệ (Exception)
Sử dụng try...catch cho các ngoại lệ
try{
. . . // các lệnh có thể dẫn tới ngoại lệ
}catch(Kiểu_ngoại_lệ x){
. . . // các lệnh để xử lý khi có ngoại lệ
}
throw
throw đối_tượng_ngoại_lệ;
Sử dụng nhiều mệnh đề catch và mệnh đề finally
Thực hiện mệnh đề catch đầu tiên tương ứng với ngoại lệ được chỉ ra bởi lớp ngoại lệ hoặc các lớp
ngoại lệ cha. Mệnh đề finally luôn được thực hiện (bất kể là có hay không có ngoại lệ xảy ra) vì
vậy các tài nguyên sử dụng trước đó có thể được giải phóng (ví dụ, đóng tệp tin):
try{
. . . // các lệnh có khả năng xảy ra ngoại lệ
}catch(kiểu_ngoại_lệ x){
. . . // cách lệnh xử lý ngoại lệ
} catch (kiểu_ngoại_lệ x) {
. . . // cách lệnh xử lý ngoại lệ
}finally{
// các lệnh luôn luôn được thực hiện
// bất kể có xảy ra ngoại lệ hay không
. . .
}
Chuỗi
Cộng chuỗi
Toán tử + cho phép nối hai chuỗi lại với nhau. Nếu một toán hạng là String, toán hạng còn lại sẽ
được chuyển đổi sang kiểu String và sau đó được cộng với nhau. Đây thường là cách dùng để
chuyển đổi các số sang String.
Nếu một đối tượng không phải là String khi được cộng với String phương thức toString() của nó
sẽ được triệu gọi. Một tiện ích dành cho việc ra soát bug đó là viết trong các lớp của bạn phương
thức toString().
"abc" + "def"
"abcdef"
"abc" + 4
"abc4"
"1" + 2
"12"
"xyz" + (2+2 == 4)
"xyztrue"
1 + "2.5"
"12.5"
i = s.length()
cho phép để xác định độ dài của chuỗi s.
So sánh chuỗi (sử dụng thay thế cho toán tử == và !=)
i = s.compareTo(t)
được sử dụng để so sánh chuỗi s với t.
trả về <0 nếu s < t, 0 nếu s == t, >0 nếu s > t
i = s.compareToIgnoreCase(t)
tương tự như trên nhưng không phân biệt ký tự in hoa,
in thường.
b = s.equals(t)
cho kết quả true nếu hai chuỗi có cùng giá trị.
b = s.equalsIgnoreCase(t)
tương tự như trên nhưng không phân biệt ký tự in hoa, in
thường
b = s.startsWith(t)
cho kết quả true nếu chuỗi s chứa chuỗi t ở đầu
b = s.endsWith(t)
cho kết quả true nếu chuỗi s chứa chuỗi t ở cuối
Tìm kiếm trong chuỗi (tất cả các phương thức "indexOf" đều trả về -1 nếu không tìm thấy
kết quả)
i = s.indexOf(t)
trả về vị trí đầu tiên xuất hiện chuỗi t trong chuỗi s.
i = s.indexOf(t, i)
trả về vị đầu tiên trí tính từ i xuất hiện chuỗi t trong chuỗi s.
i = s.lastlndexOf(t)
trả về vị trí cuối cùng xuất hiện chuỗi t trong chuỗi s.
i = s.lastIndexOf(t, i)
trả về vị trí cuối cùng tính từ i xuất hiện chuỗi t trong chuỗi s.
Lấy một phần của chuỗi
c = s.charAt(i)
trả về ký tự tại vị trí i trong chuỗi s.
sl= s.substring(i)
trả về một chuỗi con của chuỗi s tính từ vị trí i đến cuối.
sl= s.substring(i, j
) trả về một chuỗi con của s tình từ vị trí i đến ngay trước vị trí j.
Tạo mới một chuỗi từ chuỗi ban đầu
sl= s.toLowerCase()
tạo một chuỗi mới ở dạng in hoa toàn bộ
sl= s.toUpperCase()
tạo một chuỗi mới ở dạng in thường toàn bộ
sl= s.trim()
cắt bỏ các ký tự trắng ở đầu và cuối chuỗi
sl= s.replace(cs2, cs3)
thay thế tất cả các chuỗi con cs2 trong s bằng chuỗi cs3
StringBuilder
Khả năng sửa đối nhanh hơn so với String, sử dụng bộ nhớ và CPU hiệu quả hơn.
sb = new StringBuilder()
Tạo một StringBuilder rỗng
sb = new StringBuilder(s)
Tạo một StringBuilder từ chuỗi s.
sb = sb.append(x)
Thêm x (bất kể kiểu dữ liệu)vào cuối sb.
sb = sb.insert(offset, x)
Chèn x (bất kể kiểu dữ liệu) vào sb tại vị trí offset.
sb = sb.setCharAt(index, c)
Thay thế ký tự tại vị trí index bằng ký tự c.
sb = sb.deleteCharAt(i)
Xóa ký tự tại vị trí i.
sb = sb.delete(beg, end
) Xóa các ký tự từ vị trí beg tới vị trí end.
sb = sb.reverse()
Đảo ngược nội dung.
sb = sb.replace(beg, end, s
) Thay thế các ký tự từ vị trí beg tới vị trí end bằng s.
Có các phương thức indexOf, lastlndexOf, charAt, equals, substring giống như String!
Mảng
Sử dụng để thao tác với nhiều phần tử dữ liệu, có thể là dữ liệu nguyên thủy hoặc các đối tượng. Tất cả
các phần tử phải cũng kiểu dữ liệu.Mảng không có khả năng mở rộng!
Ví dụ:
int [] scores; // Khai báo scores là mảng các số nguyên.
scores = new int[12]; // Khởi tạo vùng nhớ cho mảng với 12 phần tử.
int[] scores = new int[12]; // Kết hợp cả khai báo và khởi tạo.
Khởi tạo một mảng
Nếu các phần tử của mảng không được gán giá trị khởi tạo, chúng sẽ được khởi tạo là 0 với các
mảng số, null với các mảng tham chiếu đối tượng, và false với các mảng boolean.
Tạo mảng vào khởi tạo giá trị cho phần tử mảng với một dòng lệnh:
String[] names = {"Mickey", "Minnie", "Donald"};
Hoặc có thể tách thành nhiều dòng lệnh:
String[] names = new String[3];
names[0] = "Mickey";
names[1] = "Minnie";
names[2] = "Donald";
Truy cập phần tử mảng
scores[5] = 86; // Gán cho phần tử có chỉ số là 5 giá trị 86.
scores[i]++; // Tăng một đơn vị cho phần tử có chỉ số là i.
Duyệt lần lượt qua các phần tử mảng
Kích thước của một mảng có thể được xác định bằng cách sử dụng thuộc tính length của chúng,
VD, scores.length
// Sử dụng vòng lặp for chuẩn.
int[] scores = new int[12];
...Khởi tạo các giá trị cho mảng scores
int total = 0;
for (int i = 0; i <scores.length; i++)
{
total += scores[i];
}
// Sử dụng vòng lặp for nâng cao.
int[] scores = new int[12];
...Khởi tạo các giá trị cho mảng scores
int total = 0;
for(int scr : scores){
total += scr;
}
Mảng hai chiều
Hầu hết được xử lý với vòng lặp for lồng nhau. Ví dụ:
static final int ROWS = 2; static
final int COLS = 4;
…
int[][] a2 = new int[ROWS][COLS];
// ... Hiển thị các phần tử mảng trong khung hình chữ nhật
for(int i =0; i < ROWS; i++){
for(int j = 0; j < COLS; j++){
Systern.out.print(" " + a2[i][j]);
}
Systern.out.println("");
}
Scanner
Tác dụng chính của java.util.Scanner là giúp đọc các giá trị từ System.in hoặc từ tệp tin.
sc = new Scanner(System.in);
Sử dụng để đọc dữ liệu từ System.in
sc = new Scanner(s
); Sử dụng để đọc giá trị từ chuỗi s.
Các phương thức lấy dữ liệu phổ biến nhất
s = sc.next
() Trả về "token" tiếp theo, nhiều hơn hoặc ít là một "word".
s = sc.nextLine()
Trả về toàn bộ một dòng dữ liệu dưới dạng một chuỗi.
x = sc.nextXYZ()
Trả về giá trị có kiểu là XYZ:
Int, Double, Boolean, Byte, Float, Short
b = sc.hasNext()
Trả về true nếu còn “token” để đọc.
b = sc.hasNextLine()
Trả về true nếu còn dòng dữ liệu để đọc.
b = sc.hasNextXYZ()
Trả về true nếu loại còn dữ liệu XYZ để đọc.
Nhập\Xuất tệp tin Văn bản
Ví dụ:
public static void copyFile(File fromFile,
File toFile) throws IOException {
Scanner freader = new Scanner(fromFile);
BufferedWriter writer = new BufferedWriter(new FileWriter(toFile));
//... Lặp cho tới khi vẫn còn dòng dữ liệu từ tệp đầu vào.
String line = null;
while (freader.hasNextLine()) {
line = freader.nextLine();
writer.write(line);
writer.newLine(); // Viết sang dòng khác trong tệp tin.
}
//... Đóng bộ đọc và ghi tệp tin.
freader.close(); //
Đóng để bỏ khóa đối với tệp tin.
writer.close(); //
Đóng để bỏ khóa đối với tệp tin và đẩy toàn bộ dữ liệu xuống ổ đĩa.
}