Caught Throwable或Exception为null

时间:2012-01-17 16:45:00

标签: java android eclipse debugging 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 bug。重新启动Eclipse后,Exception不再为null,这是正常的RuntimeException:二进制XML文件行#15:您必须提供layout_width属性。这将是另一个需要解决的问题,但是这个问题已经解决了。

5 个答案:

答案 0 :(得分:2)

如果您捕获的异常是NullPointerException,则getMessage()方法返回“null”,这可能会造成混淆。我知道这有时让我很困惑!

在调试器中,您应该能够选择e并查看类型及其字段。另外,当事情变得非常混乱时,调试的另一种方法是去

 e.printStackTrace();

(请注意 - 我不是Android专家,所以如果在Android上有所不同,那么请评论!)

答案 1 :(得分:2)

您是否确认e是否实际为空?即通过添加类似if (e == null) Log.d("Exception is null")的内容。然后,我将检查在正常执行期间和调试期间是否触发了日志语句。如果两者之间的结果不同,则表示VM错误(不太可能,但可能)。如果在任何一种情况下都没有触发消息,则可能是调试器问题。

您可以尝试调试问题的一些想法:

  • 尝试类似jdb的内容,看看你是否有同样的行为

  • 您可以在调试器和设备之间转储jdwp通信,并查看该级别的情况。也许使用wireshark或tcpdump并抓住通过usb总线传输到设备的数据。

  • 您可以尝试向dalvik本身添加一些调试语句。例如。获取AOSP的副本并构建模拟器映像,然后向dalvik添加一些调试语句,以尝试追踪正在发生的事情。

  • 您可以尝试与设备进行某种脚本化的jdwp会话

  • 您可以查看字节码(baksmali / dexdump / dedexer),看看是否有什么看起来很有趣

答案 2 :(得分:1)

Android 并不总是在Throwable中引发异常。它实际上驱动catLog的所有例外。在那里,你会发现你的例外的详细信息,即使在catch块中你的例外null

您可以从eclipse轻松访问catlog控制台并过滤以仅查看错误

<强>更新

你的断点应该在catch块中

答案 3 :(得分:1)

我知道这个问题是在不久前发布的,也是很多次!我昨天陷入了这个陷阱,我以为我会发布我找到的东西。

问题定义:我使用了以下代码

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.

ISSUE: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 --
   }
}

答案 4 :(得分:1)

我不确定导致这种情况的原因 - 它可能是前面所述的Eclipse错误。无论原因如何,我确实找到了似乎有效的解决方法。我希望它对其他人也有用。

捕获异常后,将其分配给另一个变量。指定的变量应在调试器中包含正确的Exception。

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

希望这适用于其他人作为解决方法。