简体   繁体   English

我无法弄清楚我的NullPointerException有什么问题或者为什么它甚至存在

[英]I can't figure out what's wrong with my NullPointerException or why it even exists

What are they? 这些是什么? My application keeps crashing whenever I try to pass an object over to my database helper. 每当我尝试将对象传递给数据库助手时,我的应用程序都会崩溃。

The variable name is "e". 变量名称为“ e”。 I've had the data in the object display in a toast notification and everything is fine but when i try to pass it to the database helper I get nothing. 我已经在Toast通知中将对象中的数据显示出来,一切都很好,但是当我尝试将其传递给数据库助手时,我什么也没得到。 I've even added Logs to every second line but nothing gets passed as the method never starts. 我什至在每隔两行中都添加了日志,但是由于该方法从未启动,因此没有任何结果通过。

I also tried adding the values from the object into separate variables and passing them through (I rewrote the helper method) but it still crashes. 我还尝试将对象中的值添加到单独的变量中并传递给它们(我重写了helper方法),但仍然崩溃。

I'm very close to throwing my laptop through the window, please help me. 我非常接近将笔记本电脑从窗户扔出去,请帮帮我。

My placeholder search class 我的占位符搜索类

package com.typhoon2099.mediacatalogue;

//This class is used to query the details of the barcode scanned or entered
//This in done in lieu of an open online database
//If an online database is found this class can be replaced to utilise it
public class SearchForBarcode{
//Initialise Variables
public String barcode;
public String mediatype;
public String title;
public String author;

//Set variables based on the input barcode
public SearchForBarcode(String inputBarcode){        
    barcode = inputBarcode;
    //An if statement is used because switch case cannot be used for anything other than int
    //And a 13 digit barcode is too big to fit in an int variable.
    //(JDK 1.7 supports string based cases but Android does not support it)
    if (barcode.equals("5014503113629")){
        mediatype = "DVD";
        title = "The Young Ones Series One";
        author = "Rik Mayall, Ade Edmondson, Nigel Planer, Christopher Ryan, Alexei Sayle";
    }
    else if (barcode.equals("5014503151423")){
        mediatype = "DVD";
        title = "The Office: Complete Series One & Two";
        author = "Ricky Gervais, Martin Freeman, Mackenzie Crook, Lucy Davis";
    }
    else if (barcode.equals("5050582261103")){
        mediatype = "DVD";
        title = "Shaun of the Dead";
        author = "Simon Pegg, Nick Frost, Lucy davis, Kate Ashfield, Dylan Moran, Bill Nighy, Penelope Wilton";
    }
    else if (barcode.equals("5021290037243")){
        mediatype = "Game";
        title = "Batman: Arkham Asylum (PS3)";
        author = "Warner Brothers";
    }
    else if (barcode.equals("5026555402323")){
        mediatype = "Game";
        title = "Bioshock 2 (PS3)";
        author = "2K Games";
    }
    else if (barcode.equals("5021290046573")){
        mediatype = "Game";
        title = "Tomb Raider Trilogy HD (PS3)";
        author = "Crystal Dynamics";
    }
    else if (barcode.equals("6025273901261")){
        mediatype = "CD";
        title = "Flesh Tone";
        author = "Kelis";
    }
    else if (barcode.equals("724358480924")){
        mediatype = "CD";
        title = "Duran Duran";
        author = "Duran Duran";
    }
    else if (barcode.equals("5099969605529")){
        mediatype = "CD";
        title = "Sounds of the Universe";
        author = "Depeche Mode";
    }
    else if (barcode.equals("9781427802118")){
        mediatype = "Book";
        title = "Sgt Frog Vol. 13";
        author = "Mine Yoshizaki";
    }
    else if (barcode.equals("978009940953")){
        mediatype = "Book";
        title = "Star Wars - The New Jedi Order: Vector Prime";
        author = "R. A. Salvatore";
    }
    else{
        mediatype = "Not Found";
        title = "Not Found";
        author = "Not Found";
    }
}
}

My Database Helper class 我的数据库助手类

package com.typhoon2099.mediacatalogue;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper {
    private static final String DATABASE_NAME = "mediaDatabase";
private static final int DATABASE_VERSION = 2;
private static final String TABLE_NAME = "table";

private OpenHelper mDbHelper;
private SQLiteDatabase mDb;
private SQLiteDatabase mDbr;
private final Context mCtx;

private static final String TAG = "UserDbAdapter";

private static class OpenHelper extends SQLiteOpenHelper{
    OpenHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table "+TABLE_NAME+"" +
                " (_id integer primary key," +
                " mediatype text not null," +
                " title text not null" +
                " author text not null" +
                " wishlist integer" +
                ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

}
public DatabaseHelper(Context ctx) {
    this.mCtx = ctx;
}
 //This method is called from the controlling class when the open() call is used
//it creates an instance of openHelper (detailed above) and sets up appropriate   
//connections to the database.
public DatabaseHelper open() throws SQLException {
    mDbHelper = new OpenHelper(mCtx);
    mDb = mDbHelper.getWritableDatabase();
    mDbr = mDbHelper.getReadableDatabase();
    return this;
}
//used to close db connections
public void close() {
    mDbHelper.close();
}
//When we wish to insert a record we can call this method, passing   
//in the appropriate parameters.  The method then binds the   
//parameters to the insert command and then executes it
//against the appropriate table in the mDB database instance
public long addMedia(SearchForBarcode result) {
    Log.d(TAG,"Line 1");        
    ContentValues initialValues = new ContentValues();
    Log.d(TAG,"Line 2");        
    initialValues.put("_id", result.barcode);
    Log.d(TAG,"Line 3");        
    initialValues.put("mediatype", result.mediatype);
    Log.d(TAG,"Line 4");        
    initialValues.put("title", result.title);
    Log.d(TAG,"Line 5");        
    initialValues.put("author", result.author);
    Log.d(TAG,"Line 6");        
    initialValues.put("wishlist", 0);
    Log.d(TAG,"Line 7");        

    return mDb.insert(TABLE_NAME, null, initialValues);
}  
//This function is used to delete an item from the database by passing through the barcode for the item.
public void deleteMedia(String barcode) {
    String args = "_id = "+barcode;
    mDb.delete(TABLE_NAME, args, null);
}

public void UpdateWishlist(String barcode, String addOrRemove){
    ContentValues args = new ContentValues();
    if(addOrRemove.equals("add")){
        args.put("wishlist", "1");
    }
    else{
        args.put("wishlist","0");
    }
    mDb.update(TABLE_NAME, args, "barcode = ?", new String[]{barcode});
}

//This function is used to select all the madia of a particular type for displaying in the tabs
public ArrayList<String[]> selectMedia(String mediatype) {
    ArrayList<String[]> results = new ArrayList<String[]>();
    int counter = 0;
    Cursor cursor = this.mDbr.query(TABLE_NAME, new String[]{"_id", "title", "author", "rating"}, "mediatype = "+"?",new String[]{mediatype}, null, null, "title asc");
    if (cursor.moveToFirst()) {
        do {
            results.add(new String[3]);
            results.get(counter)[0] = cursor.getString(0).toString();
            results.get(counter)[1] = cursor.getString(1).toString();
            results.get(counter)[2] = cursor.getString(2).toString();
            results.get(counter)[3] = cursor.getString(3).toString();
            counter++;
        } while (cursor.moveToNext());
    }
    if (cursor != null && !cursor.isClosed()) {
        cursor.close();
    }
    return results;
}
}

I use the two together like so: 我将两者一起使用,如下所示:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (scanResult != null) {
        if (resultCode == 0){
            //If the user cancels the scan
            Toast.makeText(getApplicationContext(),"You cancelled the scan", 3).show();
        }
        else{
            String contents = intent.getStringExtra("SCAN_RESULT");
            String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
            if (format.equals("EAN_13") || format.equals("UPC_A")){
                //If the barcode scanned is of the correct type then pass the barcode into the search method to get the product details
                SearchForBarcode result = new SearchForBarcode(contents);
                Log.d(TAG,"Got from Database");        
                if(result.title.equals("Not Found")){
                    Toast.makeText(getApplicationContext(), "Details Not Found", 5).show();
                }
                else{
                    if(database.addMedia(result)>=0){
                        Toast.makeText(getApplicationContext(),result.title+" added to catalogue", 5).show();                    
                    }
                    else{
                        Toast.makeText(getApplicationContext(), "The product is already in the database", 5).show();
                    }
                }
            }
            else{
                //If the barcode is not of the correct type then display a notification
                Toast.makeText(getApplicationContext(),contents+" "+format, 3).show();
            }
        }
    }
}

Log cat: 日志猫:

 12-08 16:28:20.525: I/System.out(6862): Sending WAIT chunk 12-08 16:28:20.525: W/ActivityThread(6862): Application com.typhoon2099.mediacatalogue is waiting for the debugger on port 8100... 12-08 16:28:20.626: I/dalvikvm(6862): Debugger is active 12-08 16:28:20.726: I/System.out(6862): Debugger has connected 12-08 16:28:20.726: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:20.926: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:21.126: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:21.326: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:21.526: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:21.737: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:21.937: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:22.137: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:22.337: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:22.537: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:22.738: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:22.938: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:23.138: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:23.338: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:23.538: I/System.out(6862): waiting for debugger to settle... 12-08 16:28:23.739: I/System.out(6862): debugger has settled (1439) 12-08 16:28:24.089: D/dalvikvm(6862): GC_EXTERNAL_ALLOC freed 53K, 50% free 2726K/5379K, external 0K/0K, paused 31ms 12-08 16:28:28.784: W/KeyCharacterMap(6862): Can't open keycharmap file 12-08 16:28:28.784: W/KeyCharacterMap(6862): Error loading keycharmap file '/system/usr/keychars/atmel-touchscreen.kcm.bin'. hw.keyboards.131074.devname='atmel-touchscreen' 12-08 16:28:28.784: I/KeyCharacterMap(6862): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 12-08 16:28:31.636: D/PhoneWindow(6862): couldn't save which view has focus because the focused view com.android.internal.policy.impl.PhoneWindow$DecorView@40515630 has no id. 12-08 16:28:33.718: W/IInputConnectionWrapper(6862): showStatusIcon on inactive InputConnection 12-08 16:28:33.748: W/IInputConnectionWrapper(6862): InputConnection = android.view.inputmethod.BaseInputConnection@4052b0b8, active client = false 12-08 16:28:38.553: D/MainActivity(6862): Got from Database 12-08 16:29:12.206: W/ActivityThread(7049): Application com.typhoon2099.mediacatalogue is waiting for the debugger on port 8100... 12-08 16:29:12.216: I/System.out(7049): Sending WAIT chunk 12-08 16:29:12.226: I/dalvikvm(7049): Debugger is active 12-08 16:29:12.416: I/System.out(7049): Debugger has connected 12-08 16:29:12.416: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:12.616: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:12.817: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:13.017: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:13.217: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:13.427: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:13.627: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:13.817: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:14.028: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:14.228: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:14.428: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:14.628: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:14.828: I/System.out(7049): waiting for debugger to settle... 12-08 16:29:15.029: I/System.out(7049): debugger has settled (1343) 12-08 16:29:15.269: D/dalvikvm(7049): GC_EXTERNAL_ALLOC freed 58K, 50% free 2726K/5379K, external 0K/0K, paused 30ms 12-08 16:29:16.650: W/KeyCharacterMap(7049): Can't open keycharmap file 12-08 16:29:16.650: W/KeyCharacterMap(7049): Error loading keycharmap file '/system/usr/keychars/atmel-touchscreen.kcm.bin'. hw.keyboards.131074.devname='atmel-touchscreen' 12-08 16:29:16.650: I/KeyCharacterMap(7049): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 12-08 16:29:18.973: D/PhoneWindow(7049): couldn't save which view has focus because the focused view com.android.internal.policy.impl.PhoneWindow$DecorView@405132f8 has no id. 12-08 16:29:20.044: W/IInputConnectionWrapper(7049): showStatusIcon on inactive InputConnection 12-08 16:29:20.044: W/IInputConnectionWrapper(7049): InputConnection = android.view.inputmethod.BaseInputConnection@4052b0a8, active client = false 12-08 16:29:25.249: D/MainActivity(7049): Got from Database 12-08 16:29:31.895: D/AndroidRuntime(7049): Shutting down VM 12-08 16:29:31.895: W/dalvikvm(7049): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 12-08 16:29:31.965: E/AndroidRuntime(7049): FATAL EXCEPTION: main 12-08 16:29:31.965: E/AndroidRuntime(7049): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=195543262, result=-1, data=Intent { act=com.google.zxing.client.android.SCAN flg=0x80000 (has extras) }} to activity {com.typhoon2099.mediacatalogue/com.typhoon2099.mediacatalogue.MainActivity}: java.lang.NullPointerException 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityThread.deliverResults(ActivityThread.java:2883) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2925) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityThread.access$2000(ActivityThread.java:132) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1063) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.os.Handler.dispatchMessage(Handler.java:99) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.os.Looper.loop(Looper.java:143) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityThread.main(ActivityThread.java:4196) 12-08 16:29:31.965: E/AndroidRuntime(7049): at java.lang.reflect.Method.invokeNative(Native Method) 12-08 16:29:31.965: E/AndroidRuntime(7049): at java.lang.reflect.Method.invoke(Method.java:507) 12-08 16:29:31.965: E/AndroidRuntime(7049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 12-08 16:29:31.965: E/AndroidRuntime(7049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 12-08 16:29:31.965: E/AndroidRuntime(7049): at dalvik.system.NativeStart.main(Native Method) 12-08 16:29:31.965: E/AndroidRuntime(7049): Caused by: java.lang.NullPointerException 12-08 16:29:31.965: E/AndroidRuntime(7049): at com.typhoon2099.mediacatalogue.MainActivity.onActivityResult(MainActivity.java:193) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.Activity.dispatchActivityResult(Activity.java:4010) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityGroup.dispatchActivityResult(ActivityGroup.java:123) 12-08 16:29:31.965: E/AndroidRuntime(7049): at android.app.ActivityThread.deliverResults(ActivityThread.java:2879) 12-08 16:29:31.965: E/AndroidRuntime(7049): ... 11 more 12-08 16:29:33.467: I/Process(7049): Sending signal. PID: 7049 SIG: 9 

If you look towards the bottom of your console output, the stack contains the line number where the NullPointerException occurs: 如果您查看控制台输出的底部,则堆栈包含发生NullPointerException的行号:

...
12-08 16:29:31.965: E/AndroidRuntime(7049): Caused by: java.lang.NullPointerException
12-08 16:29:31.965: E/AndroidRuntime(7049):     at com.typhoon2099.mediacatalogue.MainActivity.onActivityResult(MainActivity.java:193)
12-08 16:29:31.965: E/AndroidRuntime(7049):     at android.app.Activity.dispatchActivityResult(Activity.java:4010)
12-08 16:29:31.965: E/AndroidRuntime(7049):     at android.app.ActivityGroup.dispatchActivityResult(ActivityGroup.java:123)
...

As you can see above, on line 193 of the MainActivity class, in the onActivityResult() method, you're calling a method on a variable that is null . 如上所示,在MainActivity类的第193行的onActivityResult()方法中,您正在对null变量进行调用。 Since we can't see the line numbers for the code posted, you'll have to venture to this point in your code and determine which variable(s) can be/are null at this point. 由于我们看不到所发布代码的行号,因此您必须在代码中冒险到这一点,并确定此时哪些变量可以为null

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法弄清楚为什么我在 EditText 上收到此 NullPointerException - Can't figure out why I get this NullPointerException on my EditText 无法弄清楚我的DocumentFilter有什么问题 - Can't figure out what's wrong with my DocumentFilter 我不知道怎么了,我的逻辑似乎正确 - I can't figure out what's wrong, my logic seems correct Android Studio - 我无法弄清楚是什么导致我的 StringArray 返回 NullPointerException,因为它记录为已初始化和填充 - Android Studio - I can't figure out what's causing my StringArray to return a NullPointerException because it's logging as initialized & populated 无法弄清楚我在此方法中做错了什么(compute_even) - Can't figure out what I am doing wrong in this method ( compute_even ) 我想弄清楚我的代码有什么问题 - i want to figure out what's wrong in my code 无法弄清楚我的合并排序代码有什么问题 - Can't figure out what is wrong with my merge sort code 我无法弄清楚出了什么问题,出现了“类型已定义的错误” - I can't figure out what's wrong, getting a 'type already defined error' 我无法弄清楚比较数组索引有什么问题 - I can't figure out what's wrong with comparing array indexes 项目Euler#23(Java)。 我不知道怎么了。 答案是64 - Project Euler #23 (Java). I can't figure out what's wrong. Answer is off by 64
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM