类似的问题在这里被问了两次,从来没有任何答案。或者答案是:“这是不可能的!”对不起,这可能太多了:
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属性。这将是另一个需要解决的问题,但是这个问题已经解决了。
答案 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.
}
希望这适用于其他人作为解决方法。