Kotlin抛出NullPointer异常

时间:2018-02-03 13:02:11

标签: android nullpointerexception kotlin

我开始将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()

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

  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 个答案:

答案 0 :(得分:4)

如果标记的字段为空,则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

如果您可以使用可为空的参数,请在Java中的字段中添加@Nullable,或在Kotlin中的类型后添加?以允许参数保持为null。我提到了两个问题,因为你在问题中同时拥有Java和Kotlin代码,但是你没有添加Food类。如果您不允许可为空的参数,请不要在第一个位置传递null。而且最终没有非空断言