代码之家  ›  专栏  ›  技术社区  ›  Ashiqul Islam

Kotlin引发NullPointer异常[重复]

  •  -4
  • Ashiqul Islam  · 技术社区  · 6 年前

    我开始将Kotlin与Java结合使用。 下面是java代码。不引发空指针异常

     initFoodQuantitySpinner();
    
        CartDb cartDb = new CartDb(getActivity());
    
        try {
            P.addToCart(getActivity(), food.getId(), food.getPrice(), foodQuantity);
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        FoodCartModel foodCartModel = new FoodCartModel(new Food(food.getId(),
                food.getName(), 0, "", "",
                food.getPrice(), 0,
                0, null, "", "", null));
    
        cartDb.insertFood(foodCartModel);
        if (getActivity() != null)
            getActivity().invalidateOptionsMenu();
    

    Kotlin中的以下代码引发空指针异常。

    spinFoodQuantity.visibility = View.VISIBLE
        val cartDb = CartDb(context)
    
        val id = food.id
        val name = food.name
        val price = food.price
        try {
            P.addToCart(activity, id, price, foodQuantity)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    
        val foodCartModel = FoodCartModel(
                Food(id, name, 0, "", "", price, 0,
                        0, null!!, "", "", null!!),
                foodQuantity)
    
        cartDb.insertFood(foodCartModel)
        activity!!.invalidateOptionsMenu()
    

    在共享pref中添加到购物车功能

      public static synchronized void addToCart(Context context, int id, int price, int quantity)
            throws JSONException {
        assurePrefNotNull(context);
        String data = getCartData(context);
        JSONArray array;
    
        if (data.equals(""))
            array = new JSONArray();
        else array = new JSONArray(data);
    
        JSONObject item = new JSONObject();
    
        item.put("id", id);
        item.put("price", price);
        item.put("quantity", quantity);
    
        array.put(item);
    
        prefsEditor.putString(PREF_CART_DATA, array.toString());
        prefsEditor.commit();
    }
    

    有人能解释一下kotlin抛出空指针异常的错误在哪里吗?android studio显示关于无法访问代码的警告(针对kotlin中的以下代码)

      val foodCartModel = FoodCartModel(
                Food(id, name, 0, "", "", price, 0,
                        0, null!!, "", "", null!!),
                foodQuantity)
    
        cartDb.insertFood(foodCartModel)
        activity!!.invalidateOptionsMenu()
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Zoe - Save the data dump    6 年前

    !! 在中,如果标记的字段为null,则Kotlin抛出KotlinNullPointerException。例如:

    var n: String? = null;
    //changes to n based on whatever; not at all relevant. Should it end up as null afterwards
    println(n!!)//throw an exception when something is done with it
    

    如果n为null,将引发异常。

    意思是当你这样做的时候 null!! 它总是会抛出异常,因为null显然是null,并且永远不会有实际值。

    由于它总是会引发异常,下面的代码将无法访问。与以下内容相同:

    var n: String = "some string"
    throw RuntimeException();//different exception obviously, but the idea is the same
    println(n);//unreachable code
    

    如果可以有可为null的参数,请添加 @Nullable 到Java或 ? 在Kotlin中键入后,允许参数保持为null。我提到这两个,因为您在问题中同时拥有Java和Kotlin代码,但您没有添加 Food 班如果不允许可为null的参数,那么首先不要传递null。并且最终不使用非空断言