Ошибка в java.lang.RuntimeException: невозможно запустить активность ComponentInfo{}: java.lang.NullPointerException

У меня есть следующая ошибка в студии Android. И проблема заключается в том, что при добавлении продуктов, потому что, если продукта нет, он открывает корзину для покупок, но при добавлении одного и желании повторно войти в нее он закрывается, и когда вы хотите войти в корзина покупок приложение закрывается.

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

ПокупкиСумкаАдаптер

class ShoppingBagAdapter (контекст val: Activity, val products: ArrayList): RecyclerView.Adapter<ShoppingBagAdapter.ShoppingBagViewHolder>() {

val sharedPref = SharedPref(context)
val TAG = "ShoppingBag"


init {
    (context as ClientShoppingBagActivity).setTotal(getTotal())
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ShoppingBagViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.cardview_shopping_bag, parent, false)
    return ShoppingBagViewHolder(view)
}

override fun getItemCount(): Int {
    return products.size
}


override fun onBindViewHolder(holder: ShoppingBagViewHolder, position: Int) {

    val product = products[position] // CADA UNA DE LAS CATEGORIAS

    holder.textViewName.text = product.name
    holder.textViewCounter.text = "${product.quantity}"
    holder.textViewPrice.text = "${product.price * product.quantity!!}"
    Glide.with(context).load(product.image1).into(holder.imageViewProduct)

    holder.imageViewAdd.setOnClickListener { addItem(product, holder) }
    holder.imageViewRemove.setOnClickListener { removeItem(product, holder) }
    holder.imageViewDelete.setOnClickListener { deleteItem(position) }

// держатель.itemView.setOnClickListener { goToDetail (продукт) } }

private fun getTotal(): Double {
    var total = 0.0

    for (p in products) {
        total = total + (p.quantity!! * p.price)
    }
    return total
}

private fun getIndexOf(idProduct: String): Int {
    var pos = 0

    for (p in products) {
        if (p.id == idProduct) {
            return pos
        }
        pos++
    }

    return -1
}

private fun deleteItem(position: Int) {
    products.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeRemoved(position, products.size)
    sharedPref.save("order", products)
    (context as ClientShoppingBagActivity).setTotal(getTotal())
}


private fun addItem(product: Product, holder: ShoppingBagViewHolder) {

    val index = getIndexOf(product.id!!)
    product.quantity = product.quantity!! + 1
    products[index].quantity = product.quantity

    holder.textViewCounter.text = "${product.quantity}"
    holder.textViewPrice.text = "${product.quantity!! * product.price}$"

    sharedPref.save("order", products)
    (context as ClientShoppingBagActivity).setTotal(getTotal())
}

private fun removeItem(product: Product, holder: ShoppingBagViewHolder) {

    if (product.quantity!! > 1) {

        val index = getIndexOf(product.id!!)
        product.quantity = product.quantity!! - 1
        products[index].quantity = product.quantity

        holder.textViewCounter.text = "${product.quantity}"
        holder.textViewPrice.text = "${product.quantity!! * product.price}$"

        sharedPref.save("order", products)
        (context as ClientShoppingBagActivity).setTotal(getTotal())

    }

}

private fun goToDetail(product: Product) {
    val i = Intent(context, ClientProductsDetailActivity::class.java)
    i.putExtra("product", product.toJson())
    context.startActivity(i)
}

class ShoppingBagViewHolder(view: View): RecyclerView.ViewHolder(view) {

    val textViewName: TextView
    val textViewPrice: TextView
    val textViewCounter: TextView
    val imageViewProduct: ImageView
    val imageViewAdd: ImageView
    val imageViewRemove: ImageView
    val imageViewDelete: ImageView

    init {
        textViewName = view.findViewById(R.id.textview_name)
        textViewPrice = view.findViewById(R.id.textview_price)
        textViewCounter = view.findViewById(R.id.textview_counter)
        imageViewProduct = view.findViewById(R.id.imageview_product)
        imageViewAdd = view.findViewById(R.id.imageview_add)
        imageViewRemove = view.findViewById(R.id.imageview_remove)
        imageViewDelete = view.findViewById(R.id.imageview_delete)
    }

}

КлиентПокупкиСумкаАктивность

класс ClientShoppingBagActivity: AppCompatActivity() {

var recyclerViewShoppingBag:  RecyclerView? = null
var textViewTotal: TextView? = null
var buttomNext: Button? = null
var toolbar: Toolbar? = null


var adapter: ShoppingBagAdapter? = null
var sharedPref: SharedPref? = null
var gson = Gson()
var selectedProducts = ArrayList<Product>()

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

    sharedPref = SharedPref(this)

    recyclerViewShoppingBag = findViewById(R.id.recyclerview_shopping_bag)
    textViewTotal = findViewById(R.id.textview_total)
    buttomNext = findViewById(R.id.btn_next)
    toolbar = findViewById(R.id.toolbar)
    toolbar?.setTitleTextColor(ContextCompat.getColor(this, R.color.white))
    toolbar?.title = "Tu orden"

    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)

    recyclerViewShoppingBag?.layoutManager = LinearLayoutManager(this)

    getProductsFromSharedPref()

    buttomNext?.setOnClickListener{goToAddressList() }

}

private fun goToAddressList(){
    val i = Intent(this, ClientAddressListActivity::class.java)
    startActivity(i)
}

fun setTotal(total: Double){
    textViewTotal?.text = "${total}$"
}

private fun getProductsFromSharedPref() {

    if (!sharedPref?.getData("order").isNullOrBlank()) { // EXISTE UNA ORDEN EN SHARED PREF
        val type = object : TypeToken<ArrayList<Product>>() {}.type
        selectedProducts = gson.fromJson(sharedPref?.getData("order"), type)

        adapter = ShoppingBagAdapter(this, selectedProducts)
        recyclerViewShoppingBag?.adapter = adapter
    }
}

ссылка на видео, где запущено приложение, чтобы вы могли видеть, где ошибка https://youtu.be/iUNCo5aCLLY

вот более откровенное видео о рассматриваемой проблеме, очень надеюсь, что вы мне поможете https://youtu.be/T262TUQxRVw

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

изображение 1, где полная ошибка

на этом изображении я указываю строку ошибки

на этом изображении я указываю другую строку ошибки

на этом изображении я указываю другую строку ошибки

на этом изображении я указываю другую строку ошибки

полное описание ошибки

2022-05-16 16:28:46.508 6163-6163/com.blader.domicilios E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.blader.domicilios, PID: 6163 java.lang.RuntimeException: невозможно запустить активность в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) в android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) в android.os.Handler.dispatchMessage(Handler.java:106) на android.os.Looper.loop(Looper.java:223) в android.app.ActivityThread.main(ActivityThread.java:7656) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Вызвано: java.lang.NullPointerException на com.blader.domicilios.adapters.ShoppingBagAdapter.getTotal(ShoppingBagAdapter.kt:57) на com.blader.domicilios.adapters.ShoppingBagAdapter.(ShoppingBagAdapter.kt:25) на com.blader.domicilios.activities.client.shopping_bag.ClientShoppingBagActivity.getProductsFromSharedPref(ClientShoppingBagActivity.kt:73) на com.blader.domicilios.activities.client.shopping_bag.ClientShoppingBagActivity.onCreate(ClientShoppingBagActivity.kt:52) в android.app.Activity.performCreate(Activity.java:8000) в android.app.Activity.performCreate(Activity.java:7984) в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) в android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) в android.os.Handler.dispatchMessage(Handler.java:106) на android.os.Looper.loop(Looper.java:223) в android.app.ActivityThread.main(ActivityThread.java:7656) в java.lang.reflect.Method.invoke (собственный метод)


Я очень надеюсь, что вы сможете мне помочь, так как я очень беспокоюсь о том, что не смогу выполнить свою работу вовремя, а у меня действительно очень мало времени.**

Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы не опубликовали полную трассировку стека, поэтому я просто предполагаю, но я предполагаю, что это эта строка:

total = total + (p.quantity!! * p.price)

quantity — это тип, допускающий значение NULL, и вы должны проверять их на нуль, чтобы убедиться, что они имеют значение нет null, прежде чем что-либо с ними делать. !! всегда плохой знак, это означает «Я обещаю, что это никогда не будет нулевым», и я предполагаю, что quantityявляется нулевой, и поэтому он падает. (Вот почему вы всегда должны обрабатывать нули и никогда не использовать !!, если вы абсолютно не знаете, что делаете и зачем вам это нужно)

Вероятно, вы можете исправить это с помощью этого:

private fun getTotal(): Double {
    var total = 0.0

    for (p in products) {
        if (p.quantity != null) total += p.quantity * p.price
    }
    return total
}

Или, если вам нравится:

private fun getTotal(): Double =
    products.sumByDouble { p -> (p.quantity ?: 0) * p.price }

Я понятия не имею, есть ли какие-либо другие проблемы с вашим приложением, но, надеюсь, это должно помешать вам получить это конкретное исключение NullPointerException.

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

BLADERVAN GAMER 17.05.2022 03:16

братан и по поводу этого выражения !! та же студия Android рекомендует мне его использовать, и правда, поскольку я новичок, правда в том, что я мало что знаю

BLADERVAN GAMER 17.05.2022 03:17

братан, я отправил ответ, чтобы вы могли видеть, куда теперь переместилась ошибка

BLADERVAN GAMER 17.05.2022 03:29

@BLADERVANGAMER вам придется опубликовать еще один вопрос о любых новых проблемах и посмотреть, может ли кто-нибудь помочь, мне нужно спать - и опубликовать текст трассировки стека (все) вместо скриншотов, иначе люди просто проигнорируют их, они больно читать. И AS не рекомендует вам использовать !!, это предлагаю это как способ исправить ошибку (что вы не проверили на ноль вещь, которая может быть нулевой, прежде чем пытаться использовать ее опасным образом). Это не решение, если вы не знаю наверняка, это значение никогда не будет нулевым, и обычно это означает, что оно вообще не должно быть нулевым.

cactustictacs 17.05.2022 03:32

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

введите описание изображения здесь

код, где он снова отправляет мне ошибку****

import android.app.Activity
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.blader.domicilios.R
import com.blader.domicilios.activities.client.products.detail.ClientProductsDetailActivity
import com.blader.domicilios.activities.client.shopping_bag.ClientShoppingBagActivity
import com.blader.domicilios.models.Product
import com.blader.domicilios.utils.SharedPref
import com.bumptech.glide.Glide

class ShoppingBagAdapter(val context: Activity, val products: ArrayList<Product>): RecyclerView.Adapter<ShoppingBagAdapter.ShoppingBagViewHolder>() {

    val sharedPref = SharedPref(context)
    val TAG = "ShoppingBag"


    init {
        (context as ClientShoppingBagActivity).setTotal(getTotal())
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ShoppingBagViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.cardview_shopping_bag, parent, false)
        return ShoppingBagViewHolder(view)
    }

    override fun getItemCount(): Int {
        return products.size
    }


    override fun onBindViewHolder(holder: ShoppingBagViewHolder, position: Int) {

        val product = products[position] // CADA UNA DE LAS CATEGORIAS

        holder.textViewName.text = product.name
        holder.textViewCounter.text = "${product.quantity}"
        holder.textViewPrice.text = "${product.price * product.quantity!!}"
        Glide.with(context).load(product.image1).into(holder.imageViewProduct)

        holder.imageViewAdd.setOnClickListener { addItem(product, holder) }
        holder.imageViewRemove.setOnClickListener { removeItem(product, holder) }
        holder.imageViewDelete.setOnClickListener { deleteItem(position) }
//        holder.itemView.setOnClickListener { goToDetail(product) }
    }

    private fun getTotal(): Double =
        products.sumByDouble { p -> (p.quantity ?: 0) * p.price }

    private fun getIndexOf(idProduct: String): Int {
        var pos = 0

        for (p in products) {
            if (p.id == idProduct) {
                return pos
            }
            pos++
        }

        return -1
    }

    private fun deleteItem(position: Int) {
        products.removeAt(position)
        notifyItemRemoved(position)
        notifyItemRangeRemoved(position, products.size)
        sharedPref.save("order", products)
        (context as ClientShoppingBagActivity).setTotal(getTotal())
    }


    private fun addItem(product: Product, holder: ShoppingBagViewHolder) {

        val index = getIndexOf(product.id!!)
        product.quantity = product.quantity!! + 1
        products[index].quantity = product.quantity

        holder.textViewCounter.text = "${product.quantity}"
        holder.textViewPrice.text = "${product.quantity!! * product.price}$"

        sharedPref.save("order", products)
        (context as ClientShoppingBagActivity).setTotal(getTotal())
    }

    private fun removeItem(product: Product, holder: ShoppingBagViewHolder) {

        if (product.quantity!! > 1) {

            val index = getIndexOf(product.id!!)
            product.quantity = product.quantity!! - 1
            products[index].quantity = product.quantity

            holder.textViewCounter.text = "${product.quantity}"
            holder.textViewPrice.text = "${product.quantity!! * product.price}$"

            sharedPref.save("order", products)
            (context as ClientShoppingBagActivity).setTotal(getTotal())

        }

    }

    private fun goToDetail(product: Product) {
        val i = Intent(context, ClientProductsDetailActivity::class.java)
        i.putExtra("product", product.toJson())
        context.startActivity(i)
    }

    class ShoppingBagViewHolder(view: View): RecyclerView.ViewHolder(view) {

        val textViewName: TextView
        val textViewPrice: TextView
        val textViewCounter: TextView
        val imageViewProduct: ImageView
        val imageViewAdd: ImageView
        val imageViewRemove: ImageView
        val imageViewDelete: ImageView

        init {
            textViewName = view.findViewById(R.id.textview_name)
            textViewPrice = view.findViewById(R.id.textview_price)
            textViewCounter = view.findViewById(R.id.textview_counter)
            imageViewProduct = view.findViewById(R.id.imageview_product)
            imageViewAdd = view.findViewById(R.id.imageview_add)
            imageViewRemove = view.findViewById(R.id.imageview_remove)
            imageViewDelete = view.findViewById(R.id.imageview_delete)
        }

    }

Это точно такая же проблема, чувак, ты снова пытаешься умножить price на null. И не выкладывайте скриншоты, вы отрезали самую важную часть (которая говорит вам, где ошибка) - я знаю только потому, что это снова quantity!! вещь

cactustictacs 17.05.2022 03:33

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

BLADERVAN GAMER 17.05.2022 03:57

una pregunta como haria para operar en este caso, ya que me sale el mismo error y creo que es lo ultimo que me toca arreg ****productPrice = product?.price!! * товар?.количество!!****

BLADERVAN GAMER 17.05.2022 04:02

Проблема в том, что нет возможного множителя для нулевой, y quantity может быть нулевым. Pues primero hay que verificar que no es null (if (product.quantity != null)) или usar el "elvis" ?: operador por proofer una alternativa valor ((product.quantity ?: 0)). Нулевая безопасность является очень важной концепцией, которая имеет значение: kotlinlang.org/docs/null-safety.html (используется на испанском языке)

cactustictacs 17.05.2022 20:22

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