[英]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.