Member 14647830 Ответов: 1

Исключение Java nullpointer


привет всем , я делаю форму входа/регистрации в своем приложении для android , я храню информацию, которую пользователь вводит в моей базе данных SQLiteDatabase (класс, который расширяет SQLitOpenHelper и соединяется с базой данных throw ContentProvider) , в регистрационной части я проверяю электронную почту , введенную пользователем, чтобы увидеть, существует ли она уже или нет, я всегда получаю NullPointerException

public class DressHelper extends SQLiteOpenHelper {
                 private static final String TAG = "DressHelper";
                 public static final String DB_NAME="Dress";
                 public static final int DB_VERSION=1;
                
                private  static DressHelper instance;
                
                public static DressHelper getInstance(Context c){
                 if(instance==null){
                            instance=new DressHelper(c.getApplicationContext());
                        }
                 return instance;
                    }
                
                private DressHelper(Context c){
                 super(c,DB_NAME,null,DB_VERSION);
                    }
                
                   @Override
                 public void onCreate(SQLiteDatabase db) {
                
                       String DB_CREATE="CREATE TABLE "+ DressContract.Users.Table_NAME+ " ("+
                                DressContract.Users._ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+
                                DressContract.Users.NAME+" TEXT NOT NULL,"+
                                DressContract.Users.EMAIL+" TEXT NOT NULL,"+
                                DressContract.Users.PASSWORD+" TEXT NOT NULL);";
                
                       db.execSQL(DB_CREATE);
                
                   }
                
                   @Override
                 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                
                   }
                }
                 
        
        
        ---------------------------------------------------------------
        
                
                public class DressProvider extends ContentProvider {
                
                private DressHelper helper;
                
                public static final String TAG = DressProvider.class.getSimpleName();
                 private static final int test=1;
                 private static final int test_id=2;
                
                private static final UriMatcher urim=new UriMatcher(UriMatcher.NO_MATCH);
                
                static{
                 urim.addURI(DressContract.Users.authorit, DressContract.Users.Table_NAME,test);
                 urim.addURI(DressContract.Users.authorit, DressContract.Users.Table_NAME+"/#",test_id);
                    }
                 @Override
                 public boolean onCreate() {
                 helper= DressHelper.getInstance(getContext());
                
                return true;
                    }
                
                @Nullable
                    @Override
                 public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
                 int match=urim.match(uri);
                        SQLiteDatabase db;
                        db=helper.getReadableDatabase();
                
                       Cursor c;
                
                switch(match){
                 case test:
                                c=db.query(DressContract.Users.Table_NAME,projection,selection,selectionArgs,null,null,sortOrder);
                 break;
                
                case test_id:
                                selection= DressContract.Users._ID+"=?";
                                selectionArgs=new String[]{String.valueOf(ContentUris.parseId(uri))};
                                c=db.query(DressContract.Users.Table_NAME,projection,selection,selectionArgs,null,null,sortOrder);
                
                break;
                
                default:
                 throw new IllegalStateException("Cannot query form: " + uri);
                        }
                
                       db.close();
                        c.close();
                 return null;
                    }
                
                @Nullable
                    @Override
                 public String getType(@NonNull Uri uri) {
                 return null;
                    }
                
                @Nullable
                    @Override
                 public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
                
                       SQLiteDatabase db;
                        db=helper.getWritableDatabase();
                
                       String email=values.getAsString(DressContract.Users.EMAIL);
                
                int match=urim.match(uri);
                
                switch (match){
                 case test:
                 int   id=(int)(db.insert(DressContract.Users.Table_NAME,null,values));
                
                               uri= ContentUris.withAppendedId(uri, id);
                        }
                
                       db.close();
                
                return uri;
                    }
                
                @Override
                 public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
                 return 0;
                    }
                
                @Override
                 public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
                 return 0;
                    }
                
                 public boolean verifyUser(String email) {
                
                if (helper == null) {
                 helper = DressHelper.getInstance(getContext());
                     }
                     Log.v(TAG, "helper=" + helper);
                
                    SQLiteDatabase db = helper.getReadableDatabase();
                
                    Cursor c;
                
                    String pro[] = {DressContract.Users._ID};
                     String select = DressContract.Users.EMAIL + " =?";
                     String args[] = {email};
                
                    c = db.query(DressContract.Users.Table_NAME, pro, select, args, null, null, null);
                
                if (c.getCount() > 0) {
                 return true;
                     }
                     db.close();
                 return false;
                     }
                }


Что я уже пробовал:

исключение отображается при последнем методе (verifUser(String email)):

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase com.example.testapp.DatatBaseHelper.getReadableDatabase()' on a null object reference)

Richard MacCutchan

Вам нужно использовать свой отладчик, чтобы выяснить, почему helper не получает действительный объект db.

1 Ответов

Рейтинг:
1

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!