数据库无法检索图像或为空,导致数组错误。如何修复它?

2024-05-04

我的问题是java.lang.IndexOutOfBoundsException:无效索引 0,大小为 0。我不知道如何修复此错误,并且我的阵列上没有发现任何问题。我是安卓新手。希望大家理解。也许这是我的错误的原因value.put(KEY_IMG, Utility.getBytes(quest.getBitmap()));。对不起我的英语。

UPDATE

数据库问题原因java.lang.IndexOutOfBoundsException:无效索引 0,大小为 0

MainActivity.java

package com.example.quizjavatest;

import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import java.util.List;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends Activity  {

    List<Question> quesList;
    int score=0;
    int qid=0;
    ImageView quizimg; 
    Question currentQ;
    TextView txtQuestion;
    RadioButton rda, rdb, rdc;
    Button butNext;

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


            DbHelper db=new DbHelper(this);
            quesList=db.getAllQuestions();
            currentQ=quesList.get(qid);
            quizimg=(ImageView) findViewById(R.id.ImgQuiz); //img quiz
            txtQuestion=(TextView)findViewById(R.id.textView1); //question
            rda=(RadioButton)findViewById(R.id.radio0); //option A
            rdb=(RadioButton)findViewById(R.id.radio1); //option B
            rdc=(RadioButton)findViewById(R.id.radio2); //option C
            butNext=(Button)findViewById(R.id.button1); //button next
            setQuestionView();


            butNext.setOnClickListener(new View.OnClickListener() {     
                @Override
                public void onClick(View v) {
                    RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup1);
                    RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId());
                    Log.d("yourans", currentQ.getANSWER()+" "+answer.getText());
                    if(currentQ.getANSWER().equals(answer.getText()))
                    {
                        score++;
                        Log.d("score", "Your score"+score);
                    }
                    if(qid<5){                  
                        currentQ=quesList.get(qid);
                        setQuestionView();
                    }else{
                        Intent intent = new Intent(MainActivity.this, ResultActivity.class);
                        Bundle b = new Bundle();
                        b.putInt("score", score); //Your score
                        intent.putExtras(b); //Put your score to your next Intent
                        startActivity(intent);
                        finish();
                    }
                }
            });
        }

        private void setQuestionView()
        {
            quizimg.setImageBitmap(currentQ.getBitmap());
            txtQuestion.setText(currentQ.getQUESTION());
            rda.setText(currentQ.getOPTA());
            rdb.setText(currentQ.getOPTB());
            rdc.setText(currentQ.getOPTC());
            qid++  ;
        }
}

数据库助手.java

package com.example.quizjavatest;

import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.BitmapFactory;

public class DbHelper extends SQLiteOpenHelper{

    private Context mContext;
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "PediaKids";
    // tasks table name

    private static final String TABLE_QUEST = "planet";

    // tasks Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_IMG = "img";
    private static final String KEY_QUES = "question";
    private static final String KEY_ANSWER = "answer"; //correct option
    private static final String KEY_OPTA= "opta"; //option a
    private static final String KEY_OPTB= "optb"; //option b
    private static final String KEY_OPTC= "optc"; //option c
    private SQLiteDatabase dbase;
    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        mContext = context;

    }
        @Override
        public void onCreate(SQLiteDatabase db) {

            dbase=db;
            String Sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUEST + " ( "
                    + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ KEY_IMG + "BLOB," + KEY_QUES
                    + " TEXT, "  + KEY_OPTA +" TEXT, " + KEY_OPTB +" TEXT, "+KEY_OPTC+" TEXT," + KEY_ANSWER + " TEXT)";



            db.execSQL(Sql);
            addQuestion();


            //db.close();
        }
        private void addQuestion()
        {
            Question q1=new Question(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher),"an operating system?", "SuSe", "BIOS", "DOS", "BIOS");
            this.addQuestion(q1);
            Question q2=new Question(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher),"Which of the following is NOT  "," SuSe", "BIOS", "DOS", "BIOS");
            this.addQuestion(q2);
            Question q3=new Question(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher),"Which of the following is the fastest","RAM", "FLASH","Register","Register");
            this.addQuestion(q3);
            Question q4=new Question(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher),"Which of the following device", "Router", "Bridge", "Hub","Router");
            this.addQuestion(q4);
            Question q5=new Question(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher),"Which of the following is NOT an" ,"Ruby","Python","BASIC","BASIC");
            this.addQuestion(q5);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
            // Drop older table if existed

            db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUEST);

            // Create tables again
            onCreate(db);
        }

        // Adding new question

        public void addQuestion(Question quest) {
            //SQLiteDatabase db = this.getWritableDatabase();
            ContentValues values = new ContentValues();
            //values.put(KEY_ID, quest.getID());
            values.put(KEY_IMG, Utility.getBytes(quest.getBitmap()));
            values.put(KEY_QUES, quest.getQUESTION()); 
            values.put(KEY_ANSWER, quest.getANSWER());
            values.put(KEY_OPTA, quest.getOPTA());
            values.put(KEY_OPTB, quest.getOPTB());
            values.put(KEY_OPTC, quest.getOPTC());
            // Inserting Row
            dbase.insert(TABLE_QUEST, null, values);


        }


        public List<Question> getAllQuestions(){
            List<Question> quesList = new ArrayList<Question>();
            String selectQuery = "SELECT * FROM " + TABLE_QUEST + " ORDER BY RANDOM() LIMIT 5";
            dbase=this.getReadableDatabase();
            Cursor cursor = dbase.rawQuery(selectQuery, null);
            // looping through all rows and adding to list
            //==============================================
            if (cursor.moveToFirst()) {
                do {
                    Question quest = new Question();

                    quest.setID(cursor.getInt(0));
                    quest.setImage(Utility.getPhoto(cursor.getBlob(1)));
                    quest.setQUESTION(cursor.getString(2));
                    quest.setANSWER(cursor.getString(3));
                    quest.setOPTA(cursor.getString(4));
                    quest.setOPTB(cursor.getString(5));
                    quest.setOPTC(cursor.getString(6));
                    quesList.add(quest);
                } while (cursor.moveToNext());
            }
            // return quest list
            return quesList;
        }
        //==============================================

        public int rowcount()
        {
            int row=0;
            String selectQuery = "SELECT  * FROM " + TABLE_QUEST;
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor cursor = db.rawQuery(selectQuery, null);
            row=cursor.getCount();
            return row;
        }
    }

问题.java

package com.example.quizjavatest;

import android.graphics.Bitmap;

public class Question {

        private int ID;
        private Bitmap bmp;
        //byte[] _image;
        private String QUESTION;
        private String OPTA;
        private String OPTB;
        private String OPTC;
        private String ANSWER;
        public Question()
        {
            /*ID=0;

            QUESTION="";
            OPTA="";
            OPTB="";
            OPTC="";
            ANSWER="";*/
        }
        public Question(Bitmap img, String qUESTION, String oPTA, String oPTB, String oPTC,
                String aNSWER ) {

            bmp = img;
            QUESTION = qUESTION;
            OPTA = oPTA;
            OPTB = oPTB;
            OPTC = oPTC;
            ANSWER = aNSWER;
        }
        public int getID()
        {
            return ID;

        }
        public Bitmap getBitmap(){
            return bmp;
        }
        public void setImage(Bitmap img){
            bmp = img;
        }
        /*public byte[] getImage(){
            return _image;
        }*/

        public String getQUESTION() {
            return QUESTION;
        }
        public String getOPTA() {
            return OPTA;
        }
        public String getOPTB() {
            return OPTB;
        }
        public String getOPTC() {
            return OPTC;
        }
        public String getANSWER() {
            return ANSWER;
        }
        public void setID(int id)
        {
            ID=id;
        }
        public void setQUESTION(String qUESTION) {
            QUESTION = qUESTION;
        }
        public void setOPTA(String oPTA) {
            OPTA = oPTA;
        }
        public void setOPTB(String oPTB) {
            OPTB = oPTB;
        }
        public void setOPTC(String oPTC) {
            OPTC = oPTC;
        }
        public void setANSWER(String aNSWER) {
            ANSWER = aNSWER;
        }

}

实用程序.java

package com.example.quizjavatest;

import java.io.ByteArrayOutputStream;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;

public class Utility {
    // convert from bitmap to byte array
    public static byte[] getBytes(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 0, stream);
        return stream.toByteArray();
    }

    // convert from byte array to bitmap
    public static Bitmap getPhoto(byte[] image) {
        return BitmapFactory.decodeByteArray(image, 0, image.length);
    }
}

Logcat

    05-03 10:46:26.520: W/dalvikvm(9053): threadid=1: thread exiting with uncaught exception (group=0x41cff700)
05-03 10:46:26.585: E/AndroidRuntime(9053): FATAL EXCEPTION: main
05-03 10:46:26.585: E/AndroidRuntime(9053): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.quizjavatest/com.example.quizjavatest.MainActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.ActivityThread.access$700(ActivityThread.java:159)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.os.Looper.loop(Looper.java:176)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.ActivityThread.main(ActivityThread.java:5419)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at java.lang.reflect.Method.invokeNative(Native Method)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at java.lang.reflect.Method.invoke(Method.java:525)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at dalvik.system.NativeStart.main(Native Method)
05-03 10:46:26.585: E/AndroidRuntime(9053): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
05-03 10:46:26.585: E/AndroidRuntime(9053):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at java.util.ArrayList.get(ArrayList.java:308)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at com.example.quizjavatest.MainActivity.onCreate(MainActivity.java:36)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.Activity.performCreate(Activity.java:5372)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
05-03 10:46:26.585: E/AndroidRuntime(9053):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
05-03 10:46:26.585: E/AndroidRuntime(9053):     ... 11 more

问题是这两行代码:

        quesList=db.getAllQuestions();
        currentQ=quesList.get(qid);

第一行实际上只返回一个空数组,因此第二行抛出无法获取位置 0 处的项目。

我认为在这种情况下最好在访问 quesList 之前检查它的长度:

if(quesList.size()>0){
  currentQ=quesList.get(qid);
}else{
  //maybe put some default question or show no question found message
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库无法检索图像或为空,导致数组错误。如何修复它? 的相关文章

随机推荐

  • SwiftUI withAnimation 完成回调

    我有一个基于某种状态的 swiftUI 动画 withAnimation linear duration 0 1 self someState newState 上述动画完成时是否会触发任何回调 如果有关于如何在 SwiftUI 中使用完成
  • 如何在 C++ 中重载数组的运算符<<?

    我正在尝试这样做 template
  • 多个构建配置可以共享一个配置转换吗?

    我正在使用 SlowCheetah 进行 XML 转换项目中的一堆配置文件 但是 这个相同的解决方案是负载平衡设置的一部分 其中不同服务器 在本例中为两个 之间的某些配置值有所不同 我有以下构建配置 Debug Release 发布 测试
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • 使用 Admin SDK 将文件上传到 Firebase 存储

    根据Docs https cloud google com storage docs uploading objects storage upload object nodejs 我必须将文件名传递给函数才能上传文件 Uploads a l
  • 在达到 API 配额限制之前 YouTube 视频上传被拒绝

    我的项目的API配额通过申请过程成功增加到4M 通过以下方式在配额详细信息中确认了这一点 谷歌开发者控制台 https console developers google com已启用 API 的配额页面 然而 在标准的 50 次上传后 视
  • 使用 NDB 中的 Key 检索实体

    我有这样的结构 有章节的书籍 祖先 书 有页面 祖先 章节 我很清楚 要通过 ID 搜索章节 我需要通过祖先查询来搜索书籍 今天我了解到 如果我拥有所有密钥 我可以直接检索实体 而无需先获取书籍 然后获取章节 然后获取页面 如下所示 pag
  • 读取目标设备上 UIAutomation 的 UIAApplication.setPreferencesValueForKey() 设置的首选项?

    在过去的几天里 我一直在使用 Apple 的 UIAutomation 框架 试图组合一套验收测试来推动我正在开发的应用程序的开发 以 BDD 类型的方式 我遇到的一件事是如何让 SUT 进入给定状态 以便在我需要设置一些内部状态时可以开始
  • Eclipse CTRL+A、CTRL+E 转到行首 转到行尾

    I searched and was very surprised that I can t find a possibility to make CTRL A CTRL E work So I can jump to the beginn
  • 设置使用 pandas 绘图方法创建的图表上的 x 轴格式

    pandas DataFrame plot 是一种从数据帧绘制数据的便捷方法 但是 我不明白如何使用此方法格式化轴 例如 import pandas as pd import datetime df pd DataFrame index d
  • Web 服务代码不返回字符串数组

    我想从我的 Web 服务方法返回 abc xyz ghi tru 其中 是分隔符 形式的字符串数组 但是我做不到 这是我当前的网络服务代码 using System using System Collections using System
  • 在 Hyperledger Composer 中包含外部库文件

    有没有办法在 Hyperledger Composer 中包含外部库 我想用这个图书馆 http numeraljs com 用于货币计算 我在这看到post https stackoverflow com questions 446888
  • 使用 Caret 包的测试集的 ROC 曲线

    我正在尝试从测试集上的插入符号中获取最佳模型的 ROC 曲线 我碰到MLeval包似乎很方便 输出非常全面 使用几行代码提供了所有需要的指标和图表 一个很好的例子在这里 https stackoverflow com a 59134729
  • LogCat 不显示标签“SMS”

    Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R layout main L
  • 如何防止在 CSS 中调整图像大小?

    我有以下代码来创建图像库 他们需要做出反应 但问题是 当窗口宽度发生变化时 图像也会调整大小并失去纵横比 我怎样才能解决这个问题 我是 CSS 新手 padding 0 margin 0 HEADER STYLES header width
  • 垂直和水平平行度

    最近在并行领域工作 我了解到有两个术语 垂直并行 和 水平并行 有人说openmp 共享内存并行 是垂直并行 而mpi 分布式内存并行 是水平并行 为什么这些术语这么称呼 我不明白原因 这么称呼它们只是术语吗 这些术语似乎没有被广泛使用 也
  • 如何重定向Python中包含的类的所有方法?

    如何实现组合模式 我有课Container它有一个属性对象Contained 我想重定向 允许访问所有方法Contained班级来自Container只需调用my container some contained method 我是否以正确
  • SQLAlchemy TypeDecorator 不起作用

    我在用着xml在我的 postgresql 数据库中 我需要一个可以处理的自定义类型xmlSQLAlchemy 中的数据 所以我做了XMLType班级与xml etree 但它并没有按照我的意愿工作 这是我写的代码 import xml e
  • 如何减小heroku slug的大小?

    我的 slug 大小为 89 5MB 非常大 然而 存储库的大小非常小 du hsc 8 0M 8 0M total 继这篇博文之后 http dazedthots blogspot com 2011 07 reducing slug si
  • 数据库无法检索图像或为空,导致数组错误。如何修复它?

    我的问题是java lang IndexOutOfBoundsException 无效索引 0 大小为 0 我不知道如何修复此错误 并且我的阵列上没有发现任何问题 我是安卓新手 希望大家理解 也许这是我的错误的原因value put KEY