我在AWS教程中关注笔记应用(link here)。在我添加DynamoDB之前,一切都进展顺利。我已经按照本教程的每一步进行操作,但在尝试保存新注释时出现错误。 Here是android studio的logcat输出的pastebin,它粘贴在下面。
我想知道是否有人可以查看教程和错误日志,看看他们是否可以帮助我弄清楚我做错了什么。我最终需要了解如何为学校项目做这件事,所以非常感谢任何帮助。
03-27 17:20:35.300 2331-2415/com.amazonaws.mobile.samples.notes E/CRASH: java.lang.NullPointerException: uri
at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:111)
at android.content.ContentResolver.update(ContentResolver.java:1402)
at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:100)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
03-27 17:20:35.300 2331-2415/com.amazonaws.mobile.samples.notes E/CRASH: java.lang.NullPointerException: uri
03-27 17:20:35.300 2331-2415/com.amazonaws.mobile.samples.notes E/AndroidRuntime: FATAL EXCEPTION: AsyncQueryWorker
Process: com.amazonaws.mobile.samples.notes, PID: 2331
java.lang.NullPointerException: uri
at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:111)
at android.content.ContentResolver.update(ContentResolver.java:1402)
at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:100)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
答案 0 :(得分:0)
我看了看这个项目。第185行的NotesContentProvider.java
文件中有一行构建新笔记的URI。用以下代码替换代码:
DynamoDBMapper dbMapper = AWSProvider.getInstance().getDynamoDBMapper();
final NotesDO newNote = toNotesDO(values);
dbMapper.save(newNote);
Uri item = NotesContentContract.Notes.uriBuilder(newNote.getNoteId());
notifyAllListeners(item);
return item;
对于你来说,了解我是如何发现这一点可能更重要。首先,有一个ApplicationCrashHandler.java类。在这里有一行代表"在这里放置一个断点"。我这样做是为了捕获堆栈跟踪(尽管显示了完整的堆栈跟踪)。这告诉我notifyListeners(uri)
是原因,在NotesContentProvider中和插入期间(而不是其他)。接下来,我在NotesContentProvider中的插入上设置断点,重新运行应用程序,并添加了一个新注释。一旦断点被击中,我逐步完成了代码并观察了变量。
我注意到的是URI格式错误。具体而言,内容提供商URI以content://
开头。变量的URI以/content
开头,它不是有效的URI。自从我编写代码以来,我知道内容契约中有一个uriBuilder方法。我用它来创建适当的URI。
如果您打算在任何类型的开发中取得进展,您需要了解如何调试您正在使用的程序。这意味着要学习你正在使用的工具。