【问题标题】:Can't reproduce android crash无法重现安卓崩溃
【发布时间】:2013-08-08 12:34:40
【问题描述】:

Android 不断报告我无法在手机上重现的用户崩溃。 我可以找到似乎不正确的行:

cursor.moveToFirst();
elechs=cursor.getString(2);
elecls=cursor.getString(3);
gass=cursor.getString(4);
waters=cursor.getString(5);

cursor.close();

if (elechs.length()!=0){
  elechdb=Double.valueOf(elechs);
}
else {
  elechdb=0.0;
}

if (elecls.length()!=0){
  elecldb=Double.valueOf(elecls);}
else {
  elecldb=0.0;
}

if (gass.length()!=0){
  gasdb=Double.valueOf(gass);
}
else {
  gasdb=0.0;
}

if (waters.length()!=0){
  waterdb=Double.valueOf(waters);
}
else {
  waterdb=0.0;
}

elecldb=Double.valueOf(elecls);
gasdb=Double.valueOf(gass);
waterdb=Double.valueOf(waters);

如果我查看代码,它没有任何意义。

我想我忘了删除最后三行。首先我检查字符串。如果字符串为空,它将将该值存储为零。

如果单元格为空,不正确的最后三行也会尝试生成。这会导致很多崩溃。但不在我的机器上。

我认为不可能将 a 做成一个空单元格。

有人知道为什么这个错误不会让我的手机崩溃吗?

【问题讨论】:

  • 你试过调试它吗?如果你的字符串是空的,当你到达这些行时会发生什么?
  • 调试并没有给我太多帮助,因为它不会崩溃。它似乎仍然会进一步计算为零值
  • 用户会遇到哪些异常?如果 cursor 为 null 或任何 getString 调用返回 null,您可能会收到 NullPointerExceptions。如果任一字符串无法解析为双精度,您可能会收到 NumberFormatException。
  • 他们收到:java.lang.NumberFormatException 并且 stacktrace 显示在 dalvik.system.NativeStart.main(Native Method) 原因:java.lang.NumberFormatException: Invalid double: "" at java.lang .StringToReal.invalidReal(StringToReal.java:63)
  • 尝试使用 try/catch 块解析字符串,因为 Double.valueOf 会抛出 NumberFormatException。

标签: double android double crash-reports value-of


【解决方案1】:

您最好的解决方案可能只是删除无论如何都不应该存在的有问题的行,最好在对Double.valueOf() 的调用周围添加实际错误处理,以防输入完全错误(如果单元格是空,但如果它说“hello world”,一切都会崩溃),并发布更新。

【讨论】:

  • 嗯,输入验证设置为整数。但是因为我正在使用一个数据库,所以它转换为一个字符串,我将它转换回双精度。无法输入文本。它可以是空白的,因此我检查了这段代码。今晚马上更新
【解决方案2】:

由于用户收到 NumberFormatException,您应该捕获异常并在发生时执行适当的操作。

if (elechs.length()!=0) {
   try {
       elechdb=Double.valueOf(elechs);
   } catch (NumberFormatException e) { 
       // Perform error handling
   }
}

如果用户遇到 NullPointerException,您应该在检查字符串长度之前检查字符串是否为空。

如果数据是用户输入的,你应该同时做以上两个,以避免以后出现问题。

【讨论】:

  • 这看起来是个好主意!!但是我需要其他设备的崩溃来检查它是否有效。或者我可以在模拟器中模拟吗?
  • 嗯,您可以通过将任一字符串设置为无法转换为双精度的值来模拟它(f.x. elchedb = "bla")。
  • 是的,好吧..这只是创建了一个异常。我将用模拟器检查它,看看我是否可以让我的原件崩溃。然后我也可以测试解决方案。
  • 你是对的,你必须重现问题才能找出导致问题的字符串的确切值。我认为,您应该查看保存数据的代码,看看那里是否存在任何问题。同时,作为避免崩溃的快速修复,您可以捕获异常,并将双精度值设置为一些有意义的默认值。
  • 谢谢.. 我发布了更新,不再报告崩溃。看起来成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多