簡體   English   中英

捕獲的 Throwable 或 Exception 為空

[英]Caught Throwable or Exception is null

類似的問題在這里被問了兩次,從來沒有任何答案。 或者答案是:“不可能!” 對不起,可能太多了:

try{
    ...
    // the line that causes the error
    LinearLayout cell = (LinearLayout) inflater.inflate(R.layout.channels_list_cell, column);
    ...
}
catch(Throwable e){
    Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show(); < breakpoint here!
}

在斷點處 e 為空。 請問我該如何查找錯誤? 很可能不是java或Android的問題,而是Eclipse調試器的問題,本身就需要調試。 但是,除了更改為不同的 IDE 之外,我還能做什么? 有任何想法嗎? 先謝過。

我嘗試過 Throwable、Exception、RuntimeException。 結果是一樣的。

嘗試越過斷點會導致 NullPointerException,因此,此時 e 似乎真的為空。 哪里會丟?

編輯:我對每個人表示感謝,對每個回答者都表示 +1。 這是一個 Eclipse 錯誤。 重啟 Eclipse 后,異常不再為空,它是一個正常的 RuntimeException: Binary XML file line #15: You must provide a layout_width 屬性。 這將是另一個需要解決的問題,但這個問題已經解決了。

如果您捕獲的異常是 NullPointerException,則 getMessage() 方法返回“null”,這可能會令人困惑。 我知道這有時讓我感到困惑!

在調試器中,您應該能夠選擇 e 並查看類型及其字段。 此外,當事情變得非常混亂時,另一種調試方法是去

 e.printStackTrace();

(注意 - 我不是 Android 大師,所以如果這在 Android 上的工作方式不同,請評論!)

你有沒有驗證過e實際上是否為空? 即通過添加類似if (e == null) Log.d("Exception is null") 然后我會檢查日志語句是否在正常執行和調試期間都被觸發。 如果兩者的結果不同,則表明存在 VM 錯誤(不太可能,但可能)。 如果在任何一種情況下都沒有觸發消息,則可能是調試器問題。

關於您可以嘗試調試問題的其他事情的一些想法:

  • 嘗試類似 jdb 的東西,看看你是否得到相同的行為

  • 您可以獲得調試器和設備之間的 jdwp 通信的轉儲,並查看該級別發生了什么。 也許使用wireshark或tcpdump並獲取通過USB總線傳輸到設備的數據。

  • 您可以嘗試向 dalvik 本身添加一些調試語句。 例如,獲取一份 AOSP 並構建一個模擬器映像,然后將一些調試語句添加到 dalvik 以嘗試追蹤發生了什么。

  • 您可以嘗試與設備進行某種腳本化的 jdwp 會話

  • 你可以看看字節碼(baksmali/dexdump/dedexer),看看有沒有什么有趣的東西

我知道這個問題是不久前發布的,而且也發布了很多次! 我昨天掉進了這個陷阱,我想我會發布我發現的。

問題定義:我使用了以下代碼

public class myAppActivity extends Activity
{
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      try { -- lots of code -- }
      catch (Exception ex) {
          Log.e ("eTutorPrism Error", "Caught this exception " + ex);
          ex.printStackTrace();
      }
   }
}

Symptom was that 'ex' was always null and resume will give NullPointerException, although the actual exception was an IllegalArgumentException in a call made into another class from the code above.

問題:onCreate() 代碼不顯示捕獲的異常。 相反,它顯示異常 = null。

解決方案:不要在 onCreate() 中使用過多的處理。 盡可能多地移動到另一個線程。 所以我將代碼更改為如下所示。 瞧,它有效!!! 我可以看到 Logcat 中顯示的實際異常。

public class eTutorPrismAppActivity extends Activity
{
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       eTutorPrismTest myTest = new eTutorPrismTest (getApplicationContext());
       myTest.start();
   }
}

class eTutorPrismTest extends Thread
{
   private Context m_AppContext = null;

   public eTutorPrismTest (Context appContext)
   {
      m_AppContext = appContext;
   }

   public void run ()
   {   
      -- lots of code that needs appContext --
   }
}

我不確定是什么導致了這種情況——如前所述,這可能是 Eclipse 錯誤。 無論原因如何,我確實找到了一種似乎有效的解決方法。 我希望它對其他人也有用。

捕獲異常后,將其分配給另一個變量。 分配的變量應該在調試器中包含正確的異常。

SpecificException assignedVar = null;
try {
    ...
}
catch (SpecificException exc) {
    assignedVar = exc; // <-- exc comes up null in the debugger, but assignedVar will be the correct object.
}

希望這對其他人有效作為一種解決方法。

Android並不總是在Throwable拋出異常。 它實際上驅動了catLog所有異常。 即使在 catch 塊中您的異常null ,您也會在那里找到異常的詳細信息。

您可以輕松地從 eclipse 訪問 catlog 控制台並過濾以僅查看錯誤

更新:

你的斷點應該在 catch 塊內

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM