2011-10-05 34 views
11

nếu tôi làm
tại sao chức năng chia hoạt động như thế này trong java?

String a = "" 
    String b = a.split(" ")[0]; 

Nó không phải là cho ArrayIndexOutOfBoundException

nhưng khi tôi làm

String a = " " 
    String b = a.split(" ")[0]; 

Nó được đem lại cho tôi ArrayIndexOutOfBoundException

một lần nữa khi tôi làm

String a = " abc" 
    String b = a.split(" ")[0]; 

Nó không mang lại cho tôi ngoại lệ TẠI SAO SO?

+7

Một chút không mong muốn: "Phương pháp này hoạt động như thể bằng cách gọi phương thức tách hai đối số với biểu thức đã cho và đối số giới hạn bằng không. Do đó, chuỗi rỗng không được bao gồm trong mảng kết quả." http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29 –

+0

@MariusSolbakkenMellum: bạn nói đúng, đăng nhận xét của bạn như một câu trả lời! – maerics

+0

@Marius - tại sao bạn không đăng câu trả lời này? –

Trả lời

2

Sau:

String a = " " 
String[] arr = a.split(" "); 

arr là một mảng trống. Đó là lý do tại sao nó ném một số ArrayIndexOutOfBoundsException khi bạn cố truy cập phần tử đầu tiên (và không tồn tại) của nó. Bây giờ, sau khi:

String a = " abc" 
String[] arr = a.split(" "); 

arr có một yếu tố: "abc", đó là lý do không phải ngoại lệ được ném khi bạn cố gắng truy cập vào phần tử đầu tiên của nó.

0

Nó luôn luôn là một khả năng rằng String.split() sẽ trả về một mảng rỗng nếu có một trận đấu đầy đủ về các quy regex

3

Đó là loại kỳ lạ.

Thing, trong ví dụ đầu tiên của bạn, Chuỗi trống "" là một Chuỗi, không phải là rỗng. Vì vậy, khi bạn nói: Chia "" này với mã thông báo "", các mẫu không khớp, và mảng bạn nhận được là Chuỗi gốc. Giống như bạn đã làm

String a = "abc"; 
String b = a.split(" ")[0]; 

Mẫu để chia không khớp, vì vậy bạn nhận được một mã thông báo, Chuỗi ban đầu.

Bạn nhận được ngoại lệ đối với trường hợp thứ hai vì nội dung COMPLETE của chuỗi của bạn chính xác là dấu phân cách bạn đã chuyển sang chia tách, vì vậy bạn kết thúc bằng một mảng trống.

Hãy cho tôi biết nếu bạn muốn biết thêm chi tiết, nhưng điều này là khá nhiều.

2

Case # 1

String a = "" 
String b = a.split(" ")[0]; 

Từ Javadoc:

Nếu biểu thức không phù hợp với bất kỳ một phần của đầu vào thì kết quả mảng có chỉ là một yếu tố, cụ thể là chuỗi này .

Vì vậy, split() cung cấp cho bạn một mảng phần tử đơn, bao gồm chuỗi đầu vào (""). Do đó không có ngoại lệ.

Case # 2

String a = " " 
String b = a.split(" ")[0]; 

Từ Javadoc:

Trailing chuỗi rỗng do đó không được đưa vào kết quả mảng.

Bạn có hai chuỗi trống như vậy và không có gì khác. Do đó bạn lấy lại một mảng có kích thước bằng không, dẫn đến ngoại lệ.

Case # 3

String a = " abc" 
String b = a.split(" ")[0]; 

Đó là không nhiều của một trường hợp góc vì nó rõ ràng đã trở lại ít nhất một yếu tố, do đó không phải ngoại lệ.

1

String a = "";

Chuỗi b = a.split ("") [0];

Khi bạn làm điều này, vì không có ký tự 'tách', do đó không có hành động tách nào được thực hiện và mảng được trả về với phần tử đầu tiên và duy nhất dưới dạng chuỗi rỗng.

String a = "";

Chuỗi b = a.split ("") [0];

trong trường hợp này, nó cố gắng tách chuỗi nhưng không có giá trị nào được đặt ở hai bên, do đó không tạo mảng. do đó, khi bạn đang cố gắng truy cập vào phần tử thứ 0 của nó, nó đưa ra ArrayOutOfBoundException.

Chuỗi a = "abc";

Chuỗi b = a.split ("") [0];

Trong trường hợp này, phân tách diễn ra và "abc" được đặt ở vị trí thứ 0 (tôi đoán) và bạn còn lại với một mảng có kích thước lớn hơn 0. Sự cố được giải quyết !! ..

Các vấn đề liên quan