2013-12-20 40 views
0

下面的代碼將返回總和爲x的整數對,例如:if arr {1,2,3,4,5]並且x是7,那麼list應該包含{3,4}和{2,5} 。主要目標是瞭解如何以私有方法執行參數驗證。問題嵌套在評論中,請僅對提出的問題提出建議。感謝您在代碼中檢查我的問題。私有函數應該如何進行參數驗證或用戶輸入以及內部數據結構?

public static List<Pair> getPairsFromPositiveArray(int[] arr, int x) { 
    // check for all positive integers 
    for (int i : arr) { // if arr is null, then this loop would throw NPE. So no need to make an exclicit check for null. 
     if (i < 0) throw new IllegalArgumentException("No integer should be negative."); 
    } 
    final List<Pair> list = new ArrayList<Pair>(); 
    getPair(arr, x, list); 
    return list; 
} 

private static void getPair(int[] arr, int x, List<Pair> list) { 
    // QUESTION 1: Should check of "all positive integers" be done here too ? 

    /* 
    * QUESTION 2: 
    * list is data structure which we created internally (user did not provide it) 
    * Does anyone suggest, it throw an NPE or do an explicit assert check for list != null ? 
    */ 
    assert list != null; // form my understanding of e effective java. 
    assert arr != null; // form my understanding of e effective java. 

    final Set<Integer> set = new HashSet<Integer>(); 
    /* 
    * QUESTION 3: 
    * arr is a data structure which was input by the user. 
    * Should we check for assert arr != null or let loop throw a NPE ? 
    */ 
    for (int i : arr) { 
     if (set.contains(i)) { 
      System.out.println(i + " : "); 
      list.add(new Pair(i, x - i)); 
     } else { 
      set.add(x - i); 
     } 
    } 
} 
+0

〜「形成我對e的理解」。你需要檢查你的語法。 –

回答

0

問題1:我會在for()循環中執行它,否則您必須循環兩次。但是......你的電話程序在這種情況下期待什麼?

問題2:如果列表是null爲什麼不初始化呢?如果arrnull,那麼是的有一個問題。在這種情況下你又會期待什麼?

問題3:您檢查arr == null每個問題。

通常良好的編程是防禦性編程。始終假定提供了錯誤或錯誤的輸入。另一方面,對於一個合理簡單的方法,你不需要過於複雜的事情。

+0

我不明白你的問題1.你會做什麼for循環?我也使用for循環?我的調用代碼需要添加到x的數字對的列表。 2.你不應該初始化一個列表,它的一個方法參數,它可以包含一些已經存在的值。我期望發生什麼意思? 3.你檢查每個問題的arr == null。 ?這是否意味着你建議使用斷言? – JavaDeveloper

+0

我猜英語不是你的第一語言......對不起,如果我讓你感到困惑。 1.在現有for()循環中執行檢查,而不是執行第二個循環。好的,不要初始化列表......沒有跡象表明它可能包含現有的值。所以做一個斷言。添加方法摘要註釋,指出您期望的真正幫助。 3.是的。 – robnick

2

問題1:在這裏也應該檢查「所有正整數」嗎?

Ans:Nope;因爲你將調用getPairsFromPositiveArray()getPair()之前獲取列表

問題2: *名單是我們內部創建(用戶沒有提供它)
*有誰表明,它拋出一個NPE數據結構或做一個明確的斷言檢查列表!= null?

答案:斷言

問題3: * ARR是一種數據結構,其是由用戶輸入。 *我們應該檢查斷言ARR = null或讓環拋出NPE

答:!

  • ,一定要進行全面的檢查....所以,是的,做檢查的ARR = NULL

  • 總是喜歡斷言對拋NPE

+0

1.不確定你在找什麼?我正在尋找在公共職能中執行的所有正整數的檢查。 2.「所以確保你初始化對象或處理它」,以及我的問題是「如果我得到一個null」我們都知道永遠不會傳遞null,但錯誤發生。 3.當你說「喜歡異常處理我自己」時,你是否建議NPE過於主張? – JavaDeveloper

+0

它總是更好地執行健全性檢查 –

+0

有2種方式來做到這一點 - 使用斷言或使用NPE,你最想什麼? – JavaDeveloper

0

的答案是真的直線前進,

public static List<Pair> getPairsFromPositiveArray(int[] arr, int x) 
{  
    // if arr is null, then this loop would throw NPE. So no need to make an explicit check for null. 

    //  for (int i : arr) //No need we can check downward 
    //  { 
    //  } 
    final List<Pair> list = new ArrayList<Pair>(); 
    getPair(arr, x, list); 
    return list; 
} 

private static void getPair(int[] arr, int x, List<Pair> list) throws NullPointerException //TELLS THIS WILL THROW NPE 
{ 
    // QUESTION 1: Should check of "all positive integers" be done here too ? 

    /* 
    * QUESTION 2: 
    * list is data structure which we created internally (user did not provide it) 
    * Does anyone suggest, it throw an NPE or do an explicit assert check for list != null ? 
    */ 
    //NO CHECK ARE REQUIRED HERE AS List<Pair> list IS NULL THEN IF WE REASSIGN IT ALSO THEN IT WILL NOT BE REFLECTED BACK TO ORIGINAL, YOU CAN THROW A CUSTOM EXCPETION OR NPE AND DOCUMENT IT (ADD TO METHOD THROWS NPE) 


    final Set<Integer> set = new HashSet<Integer>(); 
    /* 
    * QUESTION 3: 
    * arr is a data structure which was input by the user. 
    * Should we check for assert arr != null or let loop throw a NPE ? 
    //NO CHECK ARE REQUIRED HERE AS int[] arr IS NULL THEN IF WE REASSIGN IT ALSO THEN IT WILL NOT BE REFLECTED BACK TO ORIGINAL, YOU CAN THROW A CUSTOM EXCPETION OR NPE AND DOCUMENT IT (ADD TO METHOD THROWS NPE) 
    */ 
    for (int i : arr) 
    { 
     if (i < 0) // ANSWER TO QUESTION 1 
      throw new IllegalArgumentException("No integer should be negative."); 

     if (set.contains(i)) 
     { 
      System.out.println(i + " : "); 
      list.add(new Pair(i, x - i)); 
     } 
     else 
     { 
      set.add(x - i); 
     } 
    } 
} 
+0

我不確定你是什麼意思,然後我們'重新分配'。我不是在談論我問過的任何問題時重新分配什麼? – JavaDeveloper

+0

只需添加更多信息,如果我們檢查null並重新分配變量,那麼更改也不會反映回原始數組或列表.... – dbw