首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

BitmapFactory.decodeStream 兩種寫法差異:為何第一種報錯

     編輯:程式設計疑難解答

程式碼對比

// 寫法一:直接傳遞
BitmapFactory.decodeStream(conn.getInputStream());

// 寫法二:存入變數
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);

分析

兩種寫法在語義上 **完全等價**,decodeStream 參數型別為 InputStream,無論是直接傳遞方法回傳值,還是先存變數再傳遞,位元碼行為一致。

可能導致「第一種報錯」的真實原因

  1. 變數遮蔽/重複宣告:若成員變數已有 InputStream is,區域變數 InputStream is = ... 會遮蔽成員,導致後續邏輯使用錯誤的串流。
  2. 串流被重複讀取/關閉:若在兩次呼叫之間(或 try-catch 區塊中)對同一串流操作,導致位置改變或關閉。
  3. 例外處理差異:寫法一若在未捕獲 IOException 的上下文中,編譯錯誤;寫法二若包在 try-catch 中則通過編譯。

除錯建議

try {
    InputStream is = conn.getInputStream();
    if (is == null) { Log.e("TAG", "InputStream is null"); return; }
    bitmap = BitmapFactory.decodeStream(is);
    if (bitmap == null) Log.w("TAG", "decodeStream returned null");
} catch (IOException e) {
    Log.e("TAG", "decodeStream failed", e);
} finally {
    try { if (is != null) is.close(); } catch (IOException ignored) {}
}

最佳實踐

  • 統一使用「寫法二」:明確變數便於除錯、加上 null 檢查、確保 finally 關閉串流。
  • 大圖片載入請使用 BitmapFactory.Options 設定 inSampleSize 避免 OOM。
  • 網路圖片建議改用 Glide/Picasso/Coil 等圖片庫,自動處理緩存、生命週期、錯誤佔位圖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved