我如何解决:java.lang.RuntimeException:无法启动活动ComponentInfo java.lang.NumberFormatException:对于输入字符串:“s%”?

时间:2017-12-27 05:04:07

标签: java android

我是Android工作室的新手,我最近一直在开发一个应用程序,允许您下订单,并为了订购您添加的东西到购物车,然后可以从您的帐户页面查看详细信息。单击购物车时,应用程序崩溃并显示:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.sakaaz.sakaaz, PID: 16627
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sakaaz.sakaaz/edmt.dev.androidsakaaz.Cart}: java.lang.NumberFormatException: For input string: "s%"
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
               Caused by: java.lang.NumberFormatException: For input string: "s%"
                  at java.lang.Integer.parseInt(Integer.java:521)
                  at java.lang.Integer.parseInt(Integer.java:556)
                  at edmt.dev.androidsakaaz.Cart.loadListMakeup(Cart.java:68)
                  at edmt.dev.androidsakaaz.Cart.onCreate(Cart.java:56)
                  at android.app.Activity.performCreate(Activity.java:6679)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                  at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:154) 
                  at android.app.ActivityThread.main(ActivityThread.java:6119) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

我的数据库看起来像:

    public class Database extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "sakaazDB.db";
private static final int DB_VER=1;


public Database(Context context) {
    super( context, DATABASE_NAME, null , DB_VER );
}

public List<Order> getCarts()
{
    SQLiteDatabase db=getReadableDatabase();
    SQLiteQueryBuilder qb= new SQLiteQueryBuilder();

    String[] sqlSelect={"ProductName", "ProductId", "Quantity", "Price", "Discount"};
    String sqlTable="OrderDetail";

    qb.setTables( sqlTable );
    Cursor c = qb.query(db,sqlSelect,null,null,null,null,null);

    final List<Order> result = new ArrayList<>();
    if (c.moveToFirst())
    {
        do{
            result.add( new Order( c.getString(c.getColumnIndex("ProductId")),
                    c.getString(c.getColumnIndex("ProductName")),
                    c.getString(c.getColumnIndex("Quantity")),
                    c.getString(c.getColumnIndex("Price")),
                    c.getString(c.getColumnIndex("Discount"))
                    ));
        }while (c.moveToNext());
    }
    return result;
}

public void addToCart (Order order)
{
    SQLiteDatabase db = getReadableDatabase();
    String query = String.format("INSERT INTO OrderDetail(ProductId, ProductName, Quantity, Price, Discount) VALUES ('%s','%s','%s','%s','%s');",
            order.getProductId(),
            order.getProductName(),
            order.getQuantity(),
            order.getPrice(),
            order.getDiscount());

    db.execSQL(query);
}


public void cleanCart()
{
    SQLiteDatabase db = getReadableDatabase();
    String query = "DELETE FROM OrderDetail";
    db.execSQL(query);
}
}

购物车看起来像:

public class Cart extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;

    FirebaseDatabase database;
    DatabaseReference request;

    TextView txtTotalPrice;
    FButton btnPlace;

    List<Order> cart = new ArrayList<>();

    CartAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_cart );

        //Firebase
        database = FirebaseDatabase.getInstance();
        request = database.getReference("Requests");

        //Init
        recyclerView= (RecyclerView)findViewById(R.id.listCart);
        recyclerView.setHasFixedSize (true);
        layoutManager= new LinearLayoutManager( this );
        recyclerView.setLayoutManager( layoutManager );

        txtTotalPrice = (TextView)findViewById( R.id.total);
        btnPlace = (FButton)findViewById( R.id.btnPlaceOrder);

        loadListMakeup();

    }

    private void loadListMakeup() {
        cart = new Database(this).getCarts();
        adapter = new CartAdapter( cart,this );
        recyclerView.setAdapter( adapter );

        //Calculate total price
        int total=0;
        for (Order order:cart)
            total+=(Integer.parseInt( order.getPrice()))*(Integer.parseInt( order.getQuantity()));
        Locale locale = new Locale( "en","US");
        NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);

        txtTotalPrice.setText(fmt.format( total));
    }
}

我是android studio的新手,这是我第一次使用它而且我很失落,因为我正在为高中IT项目做这个,所以请帮忙!

3 个答案:

答案 0 :(得分:0)

在你的addToCart方法中

..

SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("ProductId", order.getProductId());
//..your all data
database.insert("OrderDetail", null, values);
database.close();

希望这会有所帮助..

答案 1 :(得分:0)

根据LogCat,问题出在此行的格式中。

total+=(Integer.parseInt( order.getPrice()))*(Integer.parseInt( order.getQuantity()));

首先在调用Integer.parseInt()

后删除这些空格

将此setText()方法替换为此

txtTotalPrice.setText(String.valueOf(total));

你的问题是在数据库中你为整数值调用了c.getString(),这就是你得到FormatException的原因。

替换为:

c.getString(c.getColumnIndex("Price")),

并检查您可能复制粘贴的任何其他地方,试图节省五秒钟的生命。

答案 2 :(得分:0)

您的代码中存在多个错误

1.替换你的

 getReadableDatabase();

 getWritableDatabase();

然后,

2.检查以下方法的值,然后返回精确的int值,否则将触发NumberformatException。

 order.getPrice()//may be not an int
 order.getQuantity()//may be not an int