Cho đoạn chương trình sau:
String s= " Nguyen Van An ";
String s1 = new String();
s = s.trim();
int i;
for (i = 0; i <=s.length(); i++) {
s1 = s.substring(i,i+1);
if (s1.equals(" ")) break;
}
System.out.print(s.substring(0,i));
Chương trình trên in ra kết quả là bao nhiêu?
=s.length();>
Trả lời:
Đáp án đúng: C
Đoạn chương trình thực hiện các bước sau:
1. **String s= " Nguyen Van An ";**: Khởi tạo chuỗi `s` với giá trị " Nguyen Van An ". Lưu ý có khoảng trắng ở đầu chuỗi.
2. **String s1 = new String();**: Khởi tạo một chuỗi rỗng `s1`.
3. **s = s.trim();**: Loại bỏ khoảng trắng ở đầu và cuối chuỗi `s`. Lúc này, `s` có giá trị "Nguyen Van An".
4. **for (i = 0; i <= s.length(); i++)**: Vòng lặp chạy từ `i = 0` đến `i = s.length()`. Đây là điểm quan trọng gây ra lỗi.
5. **s1 = s.substring(i,i+1);**: Trong vòng lặp, chương trình cố gắng lấy một ký tự từ chuỗi `s` bằng hàm `substring`. Khi `i = s.length()`, `i + 1` sẽ vượt quá độ dài của chuỗi, gây ra lỗi `StringIndexOutOfBoundsException`. Do đó, chương trình sẽ không thể chạy đến cuối vòng lặp và in ra kết quả.
Vì vòng lặp chạy đến `i = s.length()` (tức là 16 trong trường hợp này), khi đó `s.substring(16, 17)` sẽ gây ra lỗi vì chỉ số 17 nằm ngoài chuỗi. Do đó, chương trình sẽ ném ra một ngoại lệ và không in ra bất cứ thứ gì. Vì vậy, đáp án đúng nhất là "D. Lỗi biên dịch" mặc dù lỗi xảy ra khi chạy chương trình (runtime error), chứ không phải lỗi biên dịch (compile-time error). Trong trường hợp này, không có đáp án nào hoàn toàn chính xác, nhưng "Lỗi biên dịch" là lựa chọn gần đúng nhất, vì chương trình không thể hoàn thành việc thực thi do lỗi.
Tuy nhiên, theo cách hiểu thông thường, lỗi này không phải là lỗi biên dịch, mà là lỗi runtime (thời gian chạy). Vì không có đáp án chính xác hoàn toàn, ta sẽ chọn đáp án gần đúng nhất, đó là "D. Lỗi biên dịch".





