Caught Throwable或Exception为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属性。 这将是另一个需要解决的问题,但是这个问题已经解决了。

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

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

  e.printStackTrace(); 

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

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

关于您可以尝试调试问题的其他事项的一些想法:

  • 尝试像jdb这样的东西,看看你是否有同样的行为

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

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

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

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

Android并不总是在Throwable抛出exception。 它实际上驱动了catLog所有exception。 在那里,您将找到exception的详细信息,即使在catch块中您的exceptionnull

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

更新:

你的断点应该在catch块内

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

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

 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()代码不显示捕获的exception。 相反,它显示exception = null。

解决方案:不要在onCreate()中使用太多处理。 尽可能多地移动到另一个线程。 所以我将代码更改为如下所示。 瞧,它有效! 我可以看到Logcat中显示的实际exception。

 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 bug。 无论原因如何,我确实找到了似乎有效的解决方法。 我希望它对其他人也有用。

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

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

希望这对其他人来说是一种解决方法。