java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出OutOfMemoryError;没有可用的堆栈跟踪 [英] java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

查看:30
本文介绍了java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出OutOfMemoryError;没有可用的堆栈跟踪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将用户提供的 lat long 值与数据库中的 lat long 值进行比较.如果它们在彼此的 15 公里半径内,则应更改文本视图.但我面临以下错误,

我的数据库包含值 source lat = 19.218418 source long = 73.08661经纬度 = 18.9766017 经纬度 = 72.8326658.用户提供的值是soure lat = 19.2213935 source long = 73.081532 des lat = 18.9632933 des long = 72.8324848.

E/AndroidRuntime:致命异常:main进程:com.example.hitesh.nearby,PID:2156java.lang.IllegalStateException: 无法执行 android:onClick 的方法在 android.view.View$DeclaredOnClickListener.onClick(View.java:5347)在 android.view.View.performClick(View.java:6267)在 android.view.View$PerformClick.run(View.java:24763)在 android.os.Handler.handleCallback(Handler.java:789)在 android.os.Handler.dispatchMessage(Handler.java:98)在 android.os.Looper.loop(Looper.java:164)在 android.app.ActivityThread.main(ActivityThread.java:6548)在 java.lang.reflect.Method.invoke(Native Method)在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)引起:java.lang.reflect.InvocationTargetException在 java.lang.reflect.Method.invoke(Native Method)在 android.view.View$DeclaredOnClickListener.onClick(View.java:5342)在 android.view.View.performClick(View.java:6267)在 android.view.View$PerformClick.run(View.java:24763)在 android.os.Handler.handleCallback(Handler.java:789)在 android.os.Handler.dispatchMessage(Handler.java:98)在 android.os.Looper.loop(Looper.java:164)在 android.app.ActivityThread.main(ActivityThread.java:6548)在 java.lang.reflect.Method.invoke(Native Method)在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)引起:java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出OutOfMemoryError;没有可用的堆栈跟踪

Result.java

public class result extends Activity {数据库助手 myDb;@覆盖protected void onCreate(Bundle savedInstanceState) {myDb = 新的 DatabaseHelper(this);super.onCreate(savedInstanceState);setContentView(R.layout.layout_result);String url = getIntent().getExtras().getString("用户名");String url1 = getIntent().getExtras().getString("username1");TextView tv= (TextView)findViewById(R.id.textView2);TextView tv1= (TextView)findViewById(R.id.textView5);String[] 分隔 = url.split("_");字符串 srclat = 分离 [0];双dsrclat = Double.parseDouble(srclat);字符串 srclng = 分离 [1];Double dsrclng=Double.parseDouble(srclng);String[] separator1 = url.split("_");字符串 deslat = 分离 1[0];双 ddeslat=Double.parseDouble(deslat);字符串 deslng = 分离 1[1];双ddeslng = Double.parseDouble(deslng);tv.setText(url);tv1.setText(url1);}公共无效数据库(查看视图){意图意图 = 新意图(result.this, feeder.class);开始活动(意图);}公共无效最近值(查看视图){TextView tv= (TextView)findViewById(R.id.textView2);字符串 s1 = tv.getText().toString();String[] 分隔 = s1.split("_");字符串 deslat = 分离 [0];双纬度= Double.parseDouble(deslat);字符串 deslng = 分离 [1];Double Lng= Double.parseDouble(deslng);ArrayListssList = new ArrayList<>();ssList = myDb.countDatabase(Lat,Lng);int ssize = ssList.size();TextView tvvv = (TextView) findViewById(R.id.textView8);for(int i=0;iddList = new ArrayList<>();ddList = myDb.countDatabase1(Lat1,Lng1);int dsize = ddList.size();TextView tvvvv = (TextView) findViewById(R.id.textView9);for(int i=0;i

数据库助手

 公共类 DatabaseHelper 扩展 SQLiteOpenHelper {public static final String DATABASE_NAME = "Nearby.db";public static final String TABLE_NAME = "halt_details";public static final String COL_2 = "snme";public static final String COL_3 = "slati";public static final String COL_4 = "slong";public static final String COL_5 = "dnme";public static final String COL_6 = "dlati";public static final String COL_7 = "dlong";public static final String COL_8 = "buses";公共数据库助手(上下文上下文){超级(上下文,DATABASE_NAME,空,1);}@覆盖公共无效onCreate(SQLiteDatabase db){db.execSQL("CREATE TABLE" + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, snme VARCHAR, slati DOUBLE, slong DOUBLE, dnme VARCHAR, dlati DOUBLE, dlong DOUBLE, bus VARCHAR)");}@覆盖public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("如果存在则删除表" + TABLE_NAME);onCreate(db);}公共无效插入数据(字符串sname,双板条,双slng,字符串dname,双dlat,双dlng,字符串总线){SQLiteDatabase db = this.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("snme",sname);contentValues.put("slati",slat);contentValues.put("slong",slng);contentValues.put("dnme",dname);contentValues.put("dlati",dlat);contentValues.put("dlong",dlng);contentValues.put("buses",bus);db.insert(TABLE_NAME,null,contentValues);}公共无效clearDatabase(){SQLiteDatabase db = this.getWritableDatabase();String clearDBQuery = "DELETE FROM "+TABLE_NAME;db.execSQL(clearDBQuery);}公共 ArrayList计数数据库(双LAT,双LNG){字符串源名称=空;双地球半径 = 6371.75;ArrayListsList = new ArrayList<>();SQLiteDatabase db = this.getWritableDatabase();Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4+ " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);mCount.moveToNext();而(mCount.moveToFirst()){双纬度 = mCount.getDouble(2);双经度 = mCount.getDouble(3);double dLat = Math.toRadians(Latitude-LAT);double dLng = Math.toRadians(Longitude-LNG);double sindLat = Math.sin(dLat/2);double sindLng = Math.sin(dLng/2);double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));双距离 = 地球半径 * c;如果(距离<15){源名称=mCount.getString(1);sList.add(sourcename);}}mCount.close();返回列表;}公共 ArrayListcountDatabase1(双LAT,双LNG){字符串目的地名称=空;ArrayListdList = new ArrayList();双地球半径 = 6371.75;SQLiteDatabase db = this.getWritableDatabase();Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4+ " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);mCount.moveToFirst();而(mCount.moveToNext()){双纬度 = mCount.getDouble(2);双经度 = mCount.getDouble(3);double dLat = Math.toRadians(Latitude-LAT);double dLng = Math.toRadians(Longitude-LNG);double sindLat = Math.sin(dLat/2);double sindLng = Math.sin(dLng/2);double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));双距离 = 地球半径 * c;如果(距离<15){目的地名称 = mCount.getString(4);dList.add(目的地名称);}}mCount.close();返回 dList;}public String findBus(String sourcename, String desname){SQLiteDatabase db = this.getWritableDatabase();Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);mCount.moveToFirst();String src= mCount.getString(1);mCount.close();返回源代码;}公共光标 getAllData() {SQLiteDatabase db = this.getWritableDatabase();Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);返回资源;}}

解决方案

我建议您在 findBus 方法和调用它的循环中存在一些问题.

1.不必要的循环

围绕调用 findBus 方法的 3 个循环似乎没有用,因为它们重复设置 TextView 但只有最后一个可能是可见的,因此可用.您可以使用 size 方法直接转到 ArrayList 的最后一个元素.

我建议如下:-

tvvv.setText(ddList.get(ddList.size()-1));TextView tvv = (TextView) findViewById(R.id.textView7);tvv.setText(myDB.findBus(ssList.get(ssList.size()-1),ddList.get(ddList.size()-1)));

应该替换:-

for(int i=0;i

2.无效偏移

此外,在 findBus 方法中,当查询仅返回 1 列时,您正尝试访问从查询返回的第二列.即,您已编码偏移量 1,而只有偏移量 0(列 count(*))是唯一可用的列.

我建议将 findBus 方法更改为 :-

public String findBus(String sourcename, String desname){SQLiteDatabase db = this.getWritableDatabase();Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);mCount.moveToFirst();String src= mCount.getString(0);//<<<<将偏移量从 1 更改为 0mCount.close();返回源代码;}

这可能会减少内存需求,如果足够的话我不知道.但是,您可能还希望查看右侧显示的关于 OOM(内存不足错误,可能是带有 (Andorid) 的错误)的相关链接.>

I am trying to compare values of lat long provided by user with values of lat long from database. If they are in 15 km radius of each other textview should be changed. But i am facing following error,

My database contains value source lat = 19.218418 source long = 73.08661 Des lat = 18.9766017 des long = 72.8326658. and values provided by user are soure lat = 19.2213935 source long= 73.081532 des lat = 18.9632933 des long = 72.8324848.

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.hitesh.nearby, PID: 2156
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.view.View$DeclaredOnClickListener.onClick(View.java:5347)
                  at android.view.View.performClick(View.java:6267)
                  at android.view.View$PerformClick.run(View.java:24763)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6548)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Method.invoke(Native Method)
                  at android.view.View$DeclaredOnClickListener.onClick(View.java:5342)
                  at android.view.View.performClick(View.java:6267) 
                  at android.view.View$PerformClick.run(View.java:24763) 
                  at android.os.Handler.handleCallback(Handler.java:789) 
                  at android.os.Handler.dispatchMessage(Handler.java:98) 
                  at android.os.Looper.loop(Looper.java:164) 
                  at android.app.ActivityThread.main(ActivityThread.java:6548) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
               Caused by: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

Result.java

public class result extends Activity {
DatabaseHelper myDb;

@Override
protected void onCreate(Bundle savedInstanceState) {
    myDb = new DatabaseHelper(this);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_result);
    String url = getIntent().getExtras().getString("username");
    String url1 = getIntent().getExtras().getString("username1");
    TextView tv= (TextView)findViewById(R.id.textView2);
    TextView tv1= (TextView)findViewById(R.id.textView5);


    String[] separated = url.split("_");
    String srclat = separated[0];
        Double dsrclat= Double.parseDouble(srclat);
    String srclng = separated[1];
        Double dsrclng= Double.parseDouble(srclng);

    String[] separated1 = url.split("_");
    String deslat = separated1[0];
         Double ddeslat= Double.parseDouble(deslat);
    String deslng = separated1[1];
         Double ddeslng= Double.parseDouble(deslng);

    tv.setText(url);
    tv1.setText(url1);

}

public void Database(View view){
    Intent intent = new Intent(result.this, feeder.class);
    startActivity(intent);
}


public void NearestValue(View view){


    TextView tv= (TextView)findViewById(R.id.textView2);
    String s1 = tv.getText().toString();
    String[] separated = s1.split("_");
    String deslat = separated[0];
    Double Lat= Double.parseDouble(deslat);
    String deslng = separated[1];
    Double Lng= Double.parseDouble(deslng);
    ArrayList<String> ssList = new ArrayList<>();
    ssList = myDb.countDatabase(Lat,Lng);
    int ssize = ssList.size();
    TextView tvvv = (TextView) findViewById(R.id.textView8);
    for(int i=0;i<ssize;i++) {
        tvvv.setText(ssList.get(i));
    }

    TextView tv1= (TextView)findViewById(R.id.textView5);
    String s11 = tv1.getText().toString();
    String[] separated1 = s11.split("_");
    String deslat1 = separated1[0];
    Double Lat1= Double.parseDouble(deslat1);
    String deslng1 = separated1[1];
    Double Lng1= Double.parseDouble(deslng1);
    ArrayList<String> ddList = new ArrayList<>();
    ddList = myDb.countDatabase1(Lat1,Lng1);
    int dsize = ddList.size();
    TextView tvvvv = (TextView) findViewById(R.id.textView9);
    for(int i=0;i<dsize;i++) {
        tvvv.setText(ddList.get(i));
    }

        for(int i=0;i<ssize;i++){
            String source = ssList.get(i);
            for(int j=0;j<dsize;j++) {
                String destination = ddList.get(j);
                String src = myDb.findBus(source, destination);

                    TextView tvv = (TextView) findViewById(R.id.textView7);
                    tvv.setText(src);

            }

        }

    }

}

DatabaseHelper

    public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "Nearby.db";
    public static final String TABLE_NAME = "halt_details";
    public static final String COL_2 = "snme";
    public static final String COL_3 = "slati";
    public static final String COL_4 = "slong";
    public static final String COL_5 = "dnme";
    public static final String COL_6 = "dlati";
    public static final String COL_7 = "dlong";
    public static final String COL_8 = "buses";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, snme VARCHAR, slati DOUBLE, slong DOUBLE, dnme VARCHAR, dlati DOUBLE, dlong DOUBLE, buses VARCHAR)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public void insertData(String sname, Double slat, Double slng, String dname, Double dlat, Double dlng, String bus) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("snme",sname);
        contentValues.put("slati",slat);
        contentValues.put("slong",slng);
        contentValues.put("dnme",dname);
        contentValues.put("dlati",dlat);
        contentValues.put("dlong",dlng);
        contentValues.put("buses",bus);

        db.insert(TABLE_NAME,null ,contentValues);
    }

    public void clearDatabase() {
        SQLiteDatabase db = this.getWritableDatabase();
        String clearDBQuery = "DELETE FROM "+TABLE_NAME;
        db.execSQL(clearDBQuery);
    }

    public ArrayList<String> countDatabase(Double LAT, Double LNG) {
        String sourcename=null;
        double earthRadius = 6371.75;
        ArrayList<String> sList = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4 + " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);
        mCount.moveToNext();
        while (mCount.moveToFirst()) {
            double Latitude = mCount.getDouble(2);
            double Longitude = mCount.getDouble(3);
            double dLat = Math.toRadians(Latitude-LAT);
            double dLng = Math.toRadians(Longitude-LNG);
            double sindLat = Math.sin(dLat / 2);
            double sindLng = Math.sin(dLng / 2);
            double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            double dist = earthRadius * c;
            if (dist<15){
                sourcename=mCount.getString(1);
                sList.add(sourcename);
            }
        }
        mCount.close();
       return sList;
    }

    public ArrayList<String> countDatabase1(Double LAT, Double LNG) {
        String destinationname=null;
        ArrayList<String> dList = new ArrayList<>();
        double earthRadius = 6371.75;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4 + " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);
        mCount.moveToFirst();
        while (mCount.moveToNext() ) {
            double Latitude = mCount.getDouble(2);
            double Longitude = mCount.getDouble(3);
            double dLat = Math.toRadians(Latitude-LAT);
            double dLng = Math.toRadians(Longitude-LNG);
            double sindLat = Math.sin(dLat / 2);
            double sindLng = Math.sin(dLng / 2);
            double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            double dist = earthRadius * c;
            if (dist<15){
                destinationname = mCount.getString(4);
                dList.add(destinationname);
            }
        }
        mCount.close();
        return dList;
    }

    public String findBus(String sourcename, String desname){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);
        mCount.moveToFirst();
        String src= mCount.getString(1);
        mCount.close();
         return src;
    }


    public Cursor getAllData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
        return res;
    }
}

解决方案

I'd suggest that you have a few issues within the findBus method and the loops that invoke it.

1. Unecessary Loops

The 3 loops around the invocation of the findBus method appear to be useless as they repeatedly set the TextView but only the last will likely be visible and thus usable. You could go directly to the last element of the ArrayList's by using their size method.

I'd suggest that the following :-

tvvv.setText(ddList.get(ddList.size()-1));
TextView tvv = (TextView) findViewById(R.id.textView7);
tvv.setText(myDB.findBus(ssList.get(ssList.size()-1),ddList.get(ddList.size()-1)));

should replace :-

for(int i=0;i<dsize;i++) {
    tvvv.setText(ddList.get(i));
}

    for(int i=0;i<ssize;i++){
        String source = ssList.get(i);
        for(int j=0;j<dsize;j++) {
            String destination = ddList.get(j);
            String src = myDb.findBus(source, destination);

                TextView tvv = (TextView) findViewById(R.id.textView7);
                tvv.setText(src);

        }

    }

}

2. Invalid Offset

Additionally within the findBus method you are attempting to access the 2nd column returned from the query, when the query returns only 1 column. i.e. you have coded offset 1 whilst only offset 0 (column count(*)) is the only available column.

I'd suggest changing the findBus method to :-

public String findBus(String sourcename, String desname){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);
    mCount.moveToFirst();
    String src= mCount.getString(0); //<<<< Changed offset to 0 from 1
    mCount.close();
    return src;
}

This would likely reduce the memory requirements, if by enough I have no idea though. However, you may also wish to check the Related links display to the right in regards to OOM (Out of Memory errors, perhaps the one with (Andorid)).

这篇关于java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出OutOfMemoryError;没有可用的堆栈跟踪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆