2012-04-11 36 views
7

Tôi muốn viết một tấm séc đối với một số điều kiện mà không cần phải sử dụng try/catch và tôi muốn tránh các khả năng nhận Index Out of lỗi DảiNgăn chặn Index Out of Lỗi Phạm vi

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values 
{     
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty 
     { 
      // execute code here 
     } 
} 

Vì vậy, vấn đề tôi Tôi đang phải đối mặt là trong lần kiểm tra thứ hai, tôi cần xem liệu tôi có một Sản phẩm không có sản phẩm nào không. Tuy nhiên, nếu tôi không có Element[1], tôi sẽ nhận được ngoại lệ trong phạm vi chỉ mục. Vấn đề là có thể có 2 phần tử và một (hoặc cả hai) trong số chúng có thể có các mảng Đối tượng trống. Mã sẽ chỉ được thực hiện nếu một trong các chuỗi mục không bị trống.

Hy vọng rằng, tôi đã giải thích rõ. Làm thế nào để tôi tránh được ngoại lệ dưới bất kỳ điều kiện nào?

+2

Tại sao không sử dụng một 'Danh sách 'thay vì một mảng? –

+1

Hai điều kiện trong dòng đầu tiên giống nhau - có lẽ đó không phải là cố ý? –

+0

Tôi xin lỗi, cần có hai điều kiện khác nhau, tôi đã thay đổi nó. – Victor

Trả lời

3

Được rồi, bạn cần một số tốt hơn null checking và một số mã thận trọng hơn tại đây.

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values 
{     
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty 
    { 
     // execute code here 
    } 
} 

không thể chấp nhận được.

Trước tiên, hãy kiểm tra null

if (array != null) 
{ 
    if (array.Element != null) 

vì đơn giản, bạn có thể sử dụng &&

if (array != null && array.Element != null) 

sau đó, bên trong đó nếu chúng tôi sử dụng một vòng lặp for (since you're stuck on arrays) và vô giá trị kiểm tra xem nó

for (int i = 0; i < array.Element; ++i) 
{ 
    if (array.Element[i] != null && array.Element[i].Object != null) 
    { 

sau đó, vì bạn có mảng lồng nhau, chúng tôi lặp lại lần nữa. Điều này được gọi là nested loop, và nó thường là thực hành xấu, tôi sẽ cho bạn thấy lý do tại sao nó hoạt động trong một giây.

for (int o = 0; o < array.Element[i].Object.length; ++o) 
{ 
    if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item)) 
    { 

Bây giờ, với tất cả sự khó chịu lồng nhau xấu xí, chúng tôi đã phát hiện ra rằng Mặt hàng của bạn không rỗng. Trên hết, bạn có quyền truy cập TẤT CẢ các giá trị tiềm năng ở đây và có thể nhóm chúng theo ý muốn. Đây là cách tôi sẽ đặt toàn bộ thứ lại với nhau để đơn giản hóa.

List<string> arrayValues = new List<string>(); 
if (array != null && array.Element != null) 
{ 
    for (int i = 0; i < array.Element.length; ++i) 
    { 
     //bool found = false; 
     if (array.Element[i] != null && array.Element[i].Object != null) 
     { 
      for (int o = 0; o < array.Element[i].Object.length; ++o) 
      { 
       if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item)) 
       { 
        arrayValues.Add(array.Element[i].Object[o].Item); 
        //if you want to drop out here, you put a boolean in the bottom loop and break and then break out of the bottom loop if true 
        //found = true; 
        //break; 
       } 
      } 
     } 
     //if (found) 
     // break; 
    } 
} 
if (arrayValues.Count > 0) 
{ 
    //do stuff with arrayValues 
} 
+1

Thật tuyệt vời! Khi tôi bắt đầu cần mã như thế này là khi tôi bắt đầu suy nghĩ liệu thiết kế của tôi có phù hợp ngay từ đầu không. Tôi nghi ngờ thiết kế của OP có thể hưởng lợi từ một số thay đổi cơ bản. –

0

Bạn có thể làm một cái gì đó như:

if(array.Element[0] != null || array.Element[1] != null){ 
    //execute code 
} 
+0

Tôi nghĩ rằng điều này sẽ vẫn có ngoại lệ nếu 'Element [1]' không tồn tại. – Victor

+0

Ah, tôi tin rằng bạn là đúng. – Ryan

0

Mã của bạn có lẽ là tùy thuộc vào cấu trúc lại.

tôi cho rằng nó có thể làm việc theo cách này:

var obj = array.Element.FirstOrDefault(x => x.Object.Length > 0); 
if (obj != null) 
{ 
    if (obj.Object[0].Item.Length != 0) 
    { 
    // do whatever is necessary 
    } 
} 
1

Nơi cả hai bài thi nhau bằng cách sử dụng ngắn mạch && để thử nghiệm thứ hai không xảy ra nếu người đầu tiên thất bại:

object element0 = array.Element[0].Object; 
object element1 = array.Element[1].Object; 

// Ensure at least one Object array has a non-empty value. 
if ((element0.Length > 0 && !string.IsNullOrEmpty((string)element0.Object[0].Item)) 
    || (element1.Length > 0 && !string.IsNullOrEmpty((string)element1.Object[1].Item))) 
{ 
    // ... 
} 

Tôi giả sử nó là Object[1] gây ra ngoại lệ - bạn không rõ ràng về điều đó. Nếu đó là Element[1] gây ra ngoại lệ (hoặc cả hai), sau đó bạn cần phải pre-kiểm tra độ dài của mảng:

if ((array.Element[0].Length != 0 && HasValue(array.Element[0].Object)) 
    || (array.Element[1].Length > 1 && HasValue(array.Element[1].Object))) 
{ 
    // ... 
} 

// <summary> 
// Returns true if the specified string array contains a non-empty value at 
// the specified index. 
// </summary> 
private bool HasValue(System.Array array, int index) 
{ 
    return array.Length > index && 
     !string.IsNullOrEmpty((string)array.Object[index].Item); 
} 
0

Tôi nghĩ rằng bạn có thể đặt séc của bạn theo đúng nghĩa trước đầu tiên nếu Kiểm tra của bạn.

if (array.Length > 1 && array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values 
{     
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty 
     { 
      // execute code here 
     } 
} 

Điều này sẽ chỉ ngắn mạch nếu mảng của bạn không có cả hai yếu tố.

0
for (long i = 0; i <= (output3.Length); i++) 
{ 
    output1.WriteByte(output3[i]); -----> index out of range exception correct it 
    output1.WriteByte(output3rx[i]); 
} 
+1

"Chỉ mục ngoài phạm vi ngoại lệ chính xác". Er, anh ta đã yêu cầu _how_ làm điều đó. –

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