NullPointerException при получении строки из strings.xml

У меня есть вопрос. Почему у меня NullPointerException?

Это мой журнал от отладчика:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: bjd.adrian.e_shop, PID: 5301
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:86)
    at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
    at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:542)
    at android.content.Context.getString(Context.java:476)
    at bjd.adrian.e_shop.LoginView.loggedIn(LoginView.kt:33)
    at bjd.adrian.e_shop.LoginPresenter.endLoginisLogged(LoginPresenter.kt:25)
    at bjd.adrian.e_shop.DbManager$login$stringRequest$2.onResponse(DbManager.kt:48)
    at bjd.adrian.e_shop.DbManager$login$stringRequest$2.onResponse(DbManager.kt:35)
    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

Это мой код:

class LoginView : AppCompatActivity()
{

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login_view)


        loginBTT.setOnClickListener {
            val loginPresenter = LoginPresenter()
            var userName = userNameET.text.toString()
            var password = passwordET.text.toString()

            loginPresenter.login(userName, password, this@LoginView)

        }
    }


    fun loggedIn()
 {
        val logged = [email protected](R.string.logged)
        Toast.makeText(this@LoginView, logged, Toast.LENGTH_LONG).show()
}

    fun unLogged()
    {
        val invalidUserOrPass = [email protected](R.string.invalidUSorPASS)
        Toast.makeText(this@LoginView, invalidUserOrPass, Toast.LENGTH_LONG).show()
}

У меня strings.xml на двух языках (английский как основной и польский).

Это DbManager:

package bjd.adrian.e_shop

class DbManager
{
    val TAG: String = "DbManager"


    var invalidUSorPass = "invalidUserNameOrPassword"
    var signedIn = "signedIn"


    fun login(username: String, password: String, context: Context)
    {
        val loginPresenter = LoginPresenter()
        val requsetQueue = Volley.newRequestQueue(context)

        val url = "https://shoppingcentreeshop.000webhostapp.com/androidAppScripts/hashedLogin.php"


        var stringRequest = object : StringRequest(Method.POST, url,
            Response.Listener<String>{ response ->
                if (response.equals("ERROR"))
                {
                    Log.v(TAG, invalidUSorPass)
                    loginPresenter.endLoginisntLogin()
                }
                else
                {
                    Log.v(TAG, signedIn)

                    val gson = GsonBuilder().create()
                    var loginJSONdata = gson.fromJson<LoginJSONdata>(response, LoginJSONdata::class.java)
                    loginPresenter.endLoginisLogged()

                }

            }, object : Response.ErrorListener
            {
                override fun onErrorResponse(error: VolleyError?)
                {
                    Log.e(TAG, error.toString())
                }
            }){
            override fun getParams(): MutableMap<String, String>
            {
                var params = HashMap<String, String>()

                params.put("user_name", username)
                params.put("user_pass", password)

                return params
            }

        }


    requsetQueue.add(stringRequest)

}
}

Что внутри вашего класса DbManager? Похоже, вы создаете экземпляр Activity, который ты не можешь сделать.

TheWanderer 25.10.2018 22:03
stackoverflow.com/a/44901859/7319704
Abhinav Gupta 25.10.2018 22:15

Зачем вам нужен [email protected], если у вас должна быть возможность напрямую работать с getString?

OneCricketeer 26.10.2018 00:15
0
3
201
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте сделать это так.

val logged: String? = [email protected](R.string.logged)

А также

val invalidUserOrPass: String? = [email protected](R.string.invalidUSorPASS)

Это не проверено, но стоит попробовать

Ответ принят как подходящий

В stacktrace у вас есть

at bjd.adrian.e_shop.LoginPresenter.endLoginisLogged(LoginPresenter.kt:25)

Это означает, что в классе LoginPresenter вы в какой-то момент создали new LoginView() и loginView.loggedIn(), чего делать не следует.

Вы можете начать с попытки Toast непосредственно в методе ответа Volley для начинающих, чтобы удалить весь этот сложный материал Model-View-Presenter.

Я впервые использую Model-View-Presenter. Когда я помещаю Toast в ответ Volley, это будет совместимо с MVP?

DEEEP 1029 26.10.2018 13:44

Я сам не знаю MVP, но думаю, что заставить код работать до изучения шаблонов - лучший способ начать что-либо.

OneCricketeer 26.10.2018 15:32

Другие вопросы по теме