我正在尝试根据用户提交的崩溃报告来追踪错误的来源,并得出结论我需要一些关于如何解释崩溃报告的基本培训。
例如,崩溃报告如下:
java.lang.NumberFormatException: Invalid int: ""
at java.lang.Integer.invalidInt(Integer.java:138)
at java.lang.Integer.parseInt(Integer.java:358)
at java.lang.Integer.parseInt(Integer.java:334)
at java.lang.Integer.valueOf(Integer.java:525)
at com.cloud3squared.meteogram.MeteogramService.cacheFileName(MeteogramService.java)
cacheBaseName(MeteogramService.java)
getAppWidgetId(MeteogramService.java)
createAdhocWidgetUpdateIntent(MeteogramService.java)
setupBasicClickStuff(MeteogramService.java)
setAdhocAppWidgetAlarm(MeteogramService.java)
setNextClockWidgetUpdateAlarm(MeteogramService.java)
cancelAppWidgetAlarm(MeteogramService.java)
cancelAppWidgetAlarms(MeteogramService.java)
logAction$3aaf2084(MeteogramService.java)
logActionAgainstAllWidgets$62dc3a79(MeteogramService.java)
updateAppWidget(MeteogramService.java)
showButtons(MeteogramService.java)
hideButtons(MeteogramService.java)
fetchOk(MeteogramService.java)
getViewId(MeteogramService.java)
putBitmapIntoWidget(MeteogramService.java)
lngNow(MeteogramService.java)
showNotification(MeteogramService.java)
showMessageInWidget(MeteogramService.java)
sharpen(MeteogramService.java)
removeFromRequestsList(MeteogramService.java)
removeFromRequestsList$204347ff(MeteogramService.java)
MeteogramService.java)
displayStuffInWidget(MeteogramService.java)
access$000(MeteogramService.java)
access$100(MeteogramService.java)
access$300(MeteogramService.java)
at com.cloud3squared.meteogram.MeteogramService$GetServerWidgetAsyncTask.onPostExecute(MeteogramService.java)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.access$500(AsyncTask.java:180)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
这是否显示了导致NumberFormatException
的通话顺序,如果是,按什么顺序?我是否从下到上阅读at
行?嵌套在access
内的MeteogramService
是什么?...该类中没有access
方法。如何确定NumberFormatException
实际发生在哪个函数内?从逻辑上讲,我会在cacheFileName
内部说,但是那里没有任何内容可能导致这样的异常......在String
到int
的解析之前发生了...解析int简单地传递到cacheFileName
。
感激不尽的任何帮助。
修改
以下评论中提及的更多代码段:
static String cacheFileName(Context context, int appWidgetId, int pxWidth, int pxHeight) {
String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";
logAction(context, appWidgetId, "cacheFileName " + fileName, TAG);
return fileName;
}
static String cacheBaseName(int appWidgetId) {
return (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) ? "widget_" : "widget_" + appWidgetId;
}
答案 0 :(得分:3)
错误发生在public partial class Foo : UserControl
{
public static readonly DependencyProperty AnchorPointProperty =
DependencyProperty.Register(
"AnchorPoint", typeof(Point), typeof(Foo),
new FrameworkPropertyMetadata(new Point(0, 0),
FrameworkPropertyMetadataOptions.AffectsMeasure));
public Point AnchorPoint
{
get { return (Point)GetValue(AnchorPointProperty); }
set { SetValue(AnchorPointProperty, value); }
}
private Canvas mCanvas;
public Foo(Canvas canvas, bool isInput)
{
InitializeComponent();
mCanvas = canvas;
this.LayoutUpdated += Node_LayoutUpdated;
}
void Node_LayoutUpdated(object sender, EventArgs e)
{
Size size = RenderSize;
Point ofs = new Point(size.Width / 2, size.Height / 2);
AnchorPoint = TransformToVisual(this.mCanvas).Transform(ofs);
}
}
文件中。
错误MeteogramService.java
是由于int值无效,这可能是因为将字符串或无效变量传递给int。
类名或方法名列表是从上到下的顺序,其中访问了变量。验证您是否正在传递int,如果它是用户定义的值,则使用try / catch块并在输入非int值时显示toast。
答案 1 :(得分:3)
您必须从从上到下和从下到上一起阅读。
通常从顶部到底部更广泛。
从TOP :您会找到确切的异常原因
在这种情况下,java.lang.NumberFormatException
在cacheFileName
cacheBaseName
GetServerWidgetAsyncTask.onPostExecute
爆发pxWidth
从BOTTOM :您会找到问题的一般区域
pxHeight
这对我来说是这样的,它可能是在AsyncTask的后台工作中完成的一些值,格式不正确并在onPostExecute中用作int。
我开始的地方是调试appWidgetId
中的String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";
,Integer.valueOf
和appWidgetId
的值
getAppWidgetId
表示它可能正在尝试将字符串解析为int,例如:字符串“13”进入int 13。
在这3个变量中,最可能的关系是{{1}},因为还有另一个关于{{1}}的提示。但可以肯定的是,记录所有3个! =)
答案 2 :(得分:2)
这是否显示导致NumberFormatException
的调用顺序
是的,这个堆栈跟踪肯定会向您显示导致异常的调用顺序。从下到上读取堆栈跟踪以了解方法调用的顺序 -
什么是嵌套在MeteogramService中的访问?...该类中没有访问方法
这些访问方法是自动生成的方法,用于从内部类访问外部类的成员。有关详细信息,请查看Jake Wharton的video。
如何确定NumberFormatException实际发生在哪个函数内
检查堆栈跟踪中的所有方法调用。最顶层的将告诉您首先抛出异常的方法。因此,如果检查堆栈跟踪,第2行到第4行中的方法调用来自Integer.java类,这是一个未由您定义的类,但该异常是从此类启动的。现在,如果你来到第5行,它清楚地告诉你下一个方法调用是MeteogramService.cacheFileName()
。因此,当您尝试使用此方法执行某些操作时,会出现异常。
那里没有任何可能导致这种异常的内容
仔细阅读堆栈跟踪。在第一行,它说java.lang.NumberFormatException: Invalid int: ""
。这意味着您将空字符串或“”传递给整数类。现在,如果您在MeteogramService.cacheFileName()
之前检查该行,则表示您已调用java.lang.Integer.valueOf()
方法。
因此得出的结论是,您正在调用valueOf()方法并且空字符串,这不是有效的整数,因此NumberFormatException
答案 3 :(得分:0)
我同意其他人的意见,
通常在崩溃报告中,您要查找异常,在本例中为NumberFormatException
,然后查找您的类包名称。
假设您的软件包是com.cloud3squared.meteogram.
,问题来自您的Meteogram服务,并且您使用的是Integer.parseInt()
错误。
请注意,对于Integer.parseInt()
,您需要一个包含数字的字符串,例如" 3"或" 5"。如果它没有这个,该方法将崩溃NumberFormatException
。我在cacheFileName()
类中没有看到该方法调用,因此我建议您通过堆栈跟踪搜索getAppWidgetID()和其他方法调用。