在现有节点更新firebase数据库时遇到了一个奇怪的问题。 它返回InvocationTargetException并进一步在stackoverflow错误之下(是网站从中获取其名称的位置)。 我已经尝试了所有我能想到的东西并搜索了SO,仍然无法修复它。问题似乎不在构建文件中。我最近更改了我的应用程序包名称并将其添加到firebase控制台。 我刚刚注意到日志调试部分仍在引用我的应用程序以前的包名com.example.shopper。这可能导致它。 或者是下面指出的两行。
else {
InventoryItem updatedItem = items.get(position).getInventoryItem();
updatedItem.setPrice(price);
updatedItem.setQuantity(quantity);
updatedItem.setUnitName(unitType);
Map<String, Object> databaseUpdate = new HashMap<>();
databaseUpdate.put(updatedItem.getName(), updatedItem);
Log.d(TAG, "done: updatedItem: "+updatedItem.toString());
inventoryDatabaseReference=inventoryDatabaseReference.child(updatedItem.getCategory());
Log.d(TAG, "done: updateNotWorking: "+inventoryDatabaseReference.toString());
inventoryDatabaseReference.updateChildren(databaseUpdate).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: "+e.toString());
}
});
}
跟踪指向我的失败监听器的行。我添加了监听器以查看出现了什么问题,但是一旦调用该行就发现我得到错误,因为上面的日志是最后的成功操作 要获取值以更改项目,我使用对话框片段。该片段用于多个类似目的,例如该数据的初始放置并且用于该目的。 它下面的跟踪指向第一行调用donelistener.done
builder.setTitle(title).setPositiveButton("Done", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (setPrice || isUpdating)
doneListener.done(quantity, unitSelected, position, priceSet);
else {
priceInBasket = priceSet * quantityToBuy;
Log.d("n", "onClick: TotalPrice toBasket " + priceInBasket + "individiual price" + priceSet);
doneListener.done(quantityToBuy, buyerItemUnitName, position, priceInBasket);
}
}
})
很抱歉,如果这是一个简单的错误,浪费时间,但我昨晚花了整整一个时间,看不到解决方案。 您可能需要的任何其他信息让我知道 跟踪如下
06-07 14:13:21.434 14585-14585/com.example.testing.shopper D/CurrentInventory: done: updatedItem: InventoryItem{quantity=6, price=0.5, unitName='/100g'}
06-07 14:13:21.435 14585-14585/com.example.testing.shopper D/CurrentInventory: done: updateNotWorking: https://shopper-a34fb.firebaseio.com/ShopInventory/-KkgxqStvYBMm1fz0lOZ/Energy%20Drinks
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: threadid=1: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: method requires 28+20+20=68 bytes, fp is 0x419a2334 (52 left)
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: expanding stack end (0x419a2300 to 0x419a2000)
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: Shrank stack (to 0x419a2300, curFrame is 0x419a248c)
06-07 14:13:21.765 14585-14585/com.example.testing.shopper D/AndroidRuntime: Shutting down VM
06-07 14:13:21.765 14585-14585/com.example.testing.shopper D/dalvikvm: threadid=1: detach (group=0x41aa3ce0)
06-07 14:13:21.765 14585-14585/com.example.testing.shopper W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41aa3ce0)
06-07 14:13:21.765 14585-14585/com.example.testing.shopper W/dalvikvm: threadid=1: uncaught exception occurred
06-07 14:13:21.765 14585-14585/com.example.testing.shopper W/System.err: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
06-07 14:13:21.772 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source)
一堆这些
06-07 14:13:21.859 14585-14585/com.example.testing.shopper D/dalvikvm: GC_FOR_ALLOC freed 5052K (46469), 38% free 8607K/13700K, paused 34ms, total 35ms
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source)
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source)
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source)
然后显示我的代码所在的行
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source)
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err: at com.google.android.gms.internal.zzbqi.zzaF(Unknown Source)
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err: at com.google.firebase.database.DatabaseReference.zza(Unknown Source)
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err: at com.google.firebase.database.DatabaseReference.updateChildren(Unknown Source)
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err: at com.aihsoftware.shopper.CurrentInventoryFragment.done(CurrentInventoryFragment.java:288)
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err: at com.aihsoftware.shopper.DialogFragments.AddItemToInventoryDialogFragment$2.onClick(AddItemToInventoryDialogFragment.java:145)
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err: at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err: at android.os.Handler.dispatchMessage(Handler.java:110)
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err: at android.os.Looper.loop(Looper.java:193)
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err: rr: at java.lang.reflect.Method.invoke(Method.java:515)
06-07 14:13:21.894 14585-14585/com.example.testing.shopper W/System.err: ... 557 more
06-07 14:13:21.895 14585-14585/com.example.testing.shopper W/System.err: Caused by: java.lang.StackOverflowError
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:163)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at java.lang.StringBuilder.append(StringBuilder.java:311)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at android.net.Uri.encode(Uri.java:1864)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at android.net.Uri$PathPart.getEncoded(Uri.java:2112)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at android.net.Uri$HierarchicalUri.appendSspTo(Uri.java:1216)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at android.net.Uri$HierarchicalUri.makeSchemeSpecificPart(Uri.java:1205)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at android.net.Uri$HierarchicalUri.getSsp(Uri.java:1188)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: at android.net.Uri$HierarchicalUri.getSchemeSpecificPart(Uri.java:1197)
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: ... 559 more
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/dalvikvm: threadid=1: calling UncaughtExceptionHandler
最后一堆红色
06-07 14:13:21.927 14585-14585/com.example.testing.shopper E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.testing.shopper, PID: 14585
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source)
at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
先谢谢大家
编辑:完成了一些挖掘,调用目标是堆栈溢出错误的包装器。忘记指出这一点。 这意味着URI&stringbuilder存在问题。 firebase数据库.updateChildren()无法使用URI&#39;答案 0 :(得分:0)
我找到了一个解决方法。我很高兴它的工作但不是我仍然不知道为什么发生stackoverflow错误。 我将updateChildren()更改为指向对象的每个单独数据成员而不是对象本身。这工作但首先出现了一个错误,当多次更新项目导致另一棵树时。 比如我有 类别:{ 项目:{ 价格:1 数量:1 } } 它会导致 类别:{ 类别:{ 价:2(更新) 数量:2(更新) } 项目:{ 价格:1 数量:1 } } 这会不断重复所需的更新,我相信这就是问题的来源。但是我无法理解代码中的错误是什么。我总是使用updateChildren()作为最佳实践。 所有我能想到的是这些线是导致多个子类别的问题。我将这两个类别作为变体放置
databaseUpdate.put(updatedItem.getName(), updatedItem);
inventoryDatabaseReference=inventoryDatabaseReference.child(updatedItem.getCategory());
这是有效的
databaseUpdate.put(updatedItem.getCategory()+"/"+updatedItem.getName()+"/price",price);
databaseUpdate.put(updatedItem.getCategory()+"/"+updatedItem.getName()+"/quantity",quantity);
databaseUpdate.put(updatedItem.getCategory()+"/"+updatedItem.getName()+"/unitName",unitType);
inventoryDatabaseReference.updateChildren(databaseUpdate)