0

I have question. Why I have NullPointerException ?

This is my log from debuger:

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)

This is my code:

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()
}

I have strings.xml in two language ( English as main and Polish ).

This is 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)

}
}
3
  • 1
    What's inside your DbManager class? It looks like you're instantiating your Activity, which you cannot do. Commented Oct 25, 2018 at 20:03
  • stackoverflow.com/a/44901859/7319704 Commented Oct 25, 2018 at 20:15
  • Why do you need [email protected] when you should be able to do getString directly? Commented Oct 25, 2018 at 22:15

2 Answers 2

0

In the stacktrace, you have

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

Which means in LoginPresenter class you have made a new LoginView(), and loginView.loggedIn() at somepoint, which you should not be doing.

You can start by trying to Toast directly in the Volley response method for starters, in order to remove all this complex Model-View-Presenter stuff.

Sign up to request clarification or add additional context in comments.

2 Comments

I use Model-View-Presenter first time. When I put Toast into Volley response, this will be compatible with MVP ?
I don't know MVP myself, but I think getting code working before learning patterns is a better way to get started on anything
0

Try doing it this way.

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

And

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

This is untested but worth a try

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.