2012-08-25 60 views
4

我有以下兩種方法捕捉錯誤輸入例外

方法1

public String[] getSongIds(String whereClause) 
    { 
     String countQuery = "SELECT songid FROM TABLE_INDEX WHERE " + whereClause; 
     Cursor cursor = db.rawQuery(countQuery, null); 
     int cursorSize = cursor.getCount(); 

     int[] songIds = new int[cursorSize]; 
     int count=0; 
     if (cursor != null) { 
      if (cursor.moveToFirst()){ 
        do{ 
         songIds[count] = cursor.getInt(cursor.getColumnIndex("songid")); 
         count++; 
        }while(cursor.moveToNext()); 
       } 
     } 
     cursor.close(); 
     db.close(); 
     return getSongTitles(songIds); 
    } 

方法2

private String[] getSongTitles(int[] songIds) { 

    /some algorithm 
    return songTitles; 

} 

方法1是從不同的封裝調用。方法1對SQLite數據庫運行查詢並調用第二種方法。我需要通過執行方法1中的SQLite查詢來捕獲異常。最好返回(-1)或其他東西,以便我可以從最初調用這些方法的包中向用戶顯示消息。所以我想方法1,以避免調用方法2,如果有(錯誤的輸入)SQL異常,而不是返回一些東西回到另一個包

ps我看到了一些方法來捕捉這個異常,但不滿意他們的方法。想知道什麼是處理這個問題的最佳方法。歡呼聲

回答

3

捕獲異常,包裝在一個自定義,並把它:

public String[] getSongIds(String whereClause) throws FetchSongException { 
    String countQuery = "SELECT songid FROM TABLE_INDEX WHERE " + whereClause; 
    try { 
    Cursor cursor = db.rawQuery(countQuery, null); 
    int cursorSize = cursor.getCount(); 

    int[] songIds = new int[cursorSize]; 
    int count=0; 
    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
     do { 
      songIds[count] = cursor.getInt(cursor.getColumnIndex("songid")); 
      count++; 
     } while(cursor.moveToNext()); 
     } 
     cursor.close(); // you should put this in a finally block 
     db.close(); 
     return getSongTitles(songIds); 
    } 
    } catch (SQLException sqle) { 
    throw new FetchSongException("Unable to fetch song ids.", sqle); 
    } 
} 

於是,誰要叫getSongIds需要抓住這個新的異常:

try { 
    String[] result = getSongsIds("something"); 
} catch (FetchSongException e) { 
    // Display user message with e.getMessage(); 
} 
+0

只有一個問題。如果我想爲用戶創建一個android Toast(彈出消息),請他們重新輸入他們的輸入,會怎麼樣?這是否在調用getSongIds的人的catch塊中? – Achilles

+1

@Achilles不一定,通常你想要調用UI組件來顯示屏幕上的東西,以保持業務邏輯和UI邏輯分離的方法 –

+0

無論誰調用'getSongIds'。業務邏輯和數據庫訪問之間應該有一個明確的分離,即表示組件。 –