2010-04-12 65 views
18

Trước hết, tôi khá mới đối với Java, vì vậy xin lỗi nếu câu hỏi này hoàn toàn đơn giản.Làm cách nào để kiểm tra xem biến đã được khởi tạo chưa

Vấn đề là: Tôi có một String[] s làm bằng cách tách một chuỗi trong đó mỗi mục là một con số. Tôi muốn chuyển các mục của s vào một int[] n.

s[0] chứa số lượng các mục n sẽ giữ, hiệu quả s.length-1. Tôi đang cố gắng để làm điều này bằng cách sử dụng vòng lặp foreach:

int[] n; 
for(String num: s){ 
    //if(n is not initialized){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 

Bây giờ, tôi nhận ra rằng tôi có thể sử dụng một cái gì đó như thế này:

int[] n = new int[(int) s[0]]; 
for(int i=1; i < s.length; i++){ 
    n[i-1] = (int) s[i]; 
} 

Nhưng tôi chắc chắn rằng tôi sẽ phải đối mặt với điều đó "nếu n không được khởi tạo nó" vấn đề trong tương lai.

+0

Nếu s [0] là "s.length-1 hiệu quả", tại sao lại bao gồm nó? Tại sao không chỉ để chiều dài của đại diện cho chính nó? – CPerkins

+0

Tôi đồng ý, nhưng không kiểm soát được dữ liệu nhập đó. :) –

Trả lời

13

Bạn không thể truyền String đến int. Java được gõ mạnh mẽ, và không có chuyển đổi kiểu ngầm như bạn có thể tìm thấy trong một ngôn ngữ kịch bản lệnh.

Để chuyển đổi một String thành int, hãy sử dụng chuyển đổi rõ ràng, như Integer.parseInt(String).

Tất cả các biến thành viên và phần tử của mảng được khởi tạo với giá trị mặc định. Đối với các loại int, giá trị là 0. Đối với các loại tham chiếu (bất kỳ loại phụ nào là Object), giá trị mặc định là null. Biến cục bộ không nhận được giá trị mặc định, nhưng trình biên dịch phân tích mã để đảm bảo rằng giá trị được gán trước khi biến được đọc. Nếu không, mã sẽ không biên dịch.

Tôi nghĩ rằng những gì bạn muốn là một cái gì đó như thế này:

int[] n = new int[Integer.parseInt(s[0]); 
for (int idx = 0; idx < n; ++idx) 
    n[idx] = Integer.parseInt(s[idx + 1]); 
+0

Phần về kiểu tham chiếu nên là "kiểu tham chiếu (bất kỳ * kiểu con * của đối tượng)", vì 'Object []' không phải là một phân lớp của 'Object', nhưng nó là một kiểu con. –

+0

Cảm ơn, sau khi chơi một chút với nó tôi thấy rằng tôi đã phải làm mới Integer (s) để đúc nó. –

+2

@Javier: một lần nữa: đó không phải là "đúc", đó là "chuyển đổi". –

1

Nếu bạn khởi tạo các biến hoặc đối tượng của bạn để null trước khi sử dụng chúng,

String myVar1 = null; 
Person bobby = null; 

Bạn có thể so sánh các biến hoặc đối tượng để không null,

if (myVar != null) { 
    // myVar has a value. 
} 
+1

chỉ khi nó đã ban đầu và rõ ràng đã được khởi tạo để null HOẶC nó là một thành viên đối tượng/lớp – Yaneeve

+0

Tôi đã chỉnh sửa câu trả lời của tôi, tôi nên có được rõ ràng hơn với hướng của tôi. –

0

Bạn có thể kiểm tra null:

int[] n; 
for(String num: s){ 
    if(n == null) { 
     n = new int[(int) num]; 
    } 
    n[n.length] = (int) num; 
} 

Lưu ý rằng điều này chỉ có thể ha ppen nếu n là một thành viên của lớp. Nếu nó là một biến địa phương, trình biên dịch sẽ không cho phép bạn làm bất cứ điều gì với nó mà không có nó được khởi tạo.

+3

Điều này sẽ không biên dịch: các biến cục bộ * không * được đặt thành 'null' theo mặc định. (Ngoài ra còn có vấn đề với việc int-casting không hoạt động như @erickson). –

2
int[] n = null; 
for(String num: s){ 
    if(n == null){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 
+0

Cảm ơn. Tôi không biết tôi có thể gán null cho bất kỳ loại biến nào. –

+0

@Javier: chỉ để biến/trường tham chiếu. Vì vậy, tất cả mọi thứ trừ 'int',' boolean', 'char',' short', 'long',' float', 'double'. Các kiểu tham chiếu bao gồm 'Integer',' int [] ', và vô số các khả năng khác. – polygenelubricants

+0

@polygenelubricants nhờ làm rõ, vì vậy nó là tất cả mọi thứ nhưng các loại bản địa, phải không? –

12

Bạn không thể kiểm tra nếu một biến được khởi tạo trong mã của bạn, bởi vì đọc định nghĩa từ một biến mà thể không được khởi tạo dẫn đến lỗi biên dịch.

Bạn có thể khởi tạo các biến để null và kiểm tra các giá trị mà nếu biến của bạn không phải là một loại nguyên thủy null không phải là một giá trị hợp lệ sau khi khởi tạo.

Trong ví dụ cụ thể, mã thứ hai bạn cho thấy chắc chắn sẽ sạch hơn.

1

Chỉ có điều bạn có thể làm là kiểm tra đối với null. Nếu mã của bạn nằm trong một phương thức, nó sẽ không biên dịch nếu bạn không khởi tạo. Vì vậy, nếu nó biên dịch và chạy bạn biết nó được khởi tạo ít nhất null và sau đó thực hiện kiểm tra null.

1

Như những người khác đã lưu ý, điều gần nhất với "đúng cách" để làm điều này là khởi tạo mảng thành null.

Trên các điểm khác:

"n [n.length]" sẽ ném một ngoại lệ "ngoài giới hạn". Mảng có các phần tử từ 0 đến dài-1. Trong mọi trường hợp, tôi nghĩ rằng những gì bạn định nói trong trường hợp đầu tiên là "n [0]" và thứ hai là "n [i]".

Lưu trữ kích thước của một mảng trong phần tử đầu tiên có lẽ là một ý tưởng tồi. Nó có thể được thực hiện cho một mảng int, nhưng nó sẽ là lộn xộn trong một mảng String và nó sẽ không làm việc ở tất cả cho một mảng boolean. Ngay cả trong trường hợp int, bây giờ bạn đang trộn hai thứ rất khác nhau trong cùng một cấu trúc dữ liệu, có khả năng gây nhầm lẫn. Nếu kích thước mảng là cố định, "chiều dài" giữ kích thước anyway. Nếu kích thước mảng là biến và bạn đang nghĩ rằng bạn sẽ tạo một mảng đủ lớn và sau đó lưu trữ số tiền bạn thực sự sử dụng, bạn nên sử dụng ArrayList, xử lý mảng kích thước động một cách rõ ràng.

+0

Cảm ơn câu trả lời của bạn. Yeah, tôi đã đến n.length luôn quay trở lại x, tôi không hiểu được việc thực hiện chiều dài của java, bây giờ tôi thấy nó, nó có ý nghĩa rất nhiều, sau khi tôi khởi tạo nó với các phần tử x, vì vậy n.length nên luôn quay trở lại x. Và vâng tôi đồng ý, lưu trữ kích thước trong phần tử đầu tiên là lộn xộn, nhưng tôi không kiểm soát được (tôi đang viết mã một số bài tập, và đó là đầu vào được mong đợi) –

+0

Ah, các yêu cầu phi nhạy cảm một lần nữa dẫn đến thiết kế không hợp lý . Nhắc tôi về một lớp kinh tế tôi học đại học. Một chương trong sách giáo khoa nói về chi phí chìm và làm cho điểm mà chi phí chìm là không thích hợp với kế hoạch tương lai. Vào cuối chương có một bài tập nói rằng, "Giả sử bạn có việc và sếp của bạn nói, 'Tôi không quan tâm họ nói gì với bạn trong lớp kinh tế! Tôi muốn bạn tính đến tất cả chi phí chìm hoặc bạn bị sa thải! ' Chi phí bị chìm hiện giờ có liên quan đến bạn không? " – Jay

0

Tôi gặp sự cố này, kiểm tra xem int đã được khởi tạo hay chưa. Trong chương trình của tôi, có thể nó đã được khởi tạo thành 0, vì vậy việc kiểm tra if (int i = 0) sẽ không hoạt động tốt.

Là giải pháp/công việc, tôi đã tạo biến số boolean được đặt khi int được khởi tạo. Hi vọng điêu nay co ich.

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