数组边界出错

时间:2011-07-24 14:16:50

标签: android io android-intent

我一直在用谷歌搜索和玩弄不同的方法,我仍然没有成功。

基本上我正在做的是将意图中的资源ID传递给新活动。我从intent中提取int,并尝试使用我从intent中解压缩的context和resource id来实例化一个对象。

打包意图并开始下一个活动的第一个活动:

case R.id.KoreanVocabularymenuBButton:          
Intent openBeginnerVocabularyActivity = new Intent(v.getContext(), KoreanVocabularyActivity.class); 
openBeginnerVocabularyActivity.putExtra("difficulty", R.raw.beginner_numbers);
startActivity(openBeginnerVocabularyActivity);
break;

第二个活动解压缩intent并尝试使用数据实例化对象:

int resource = getIntent().getExtras().getInt("difficulty");
korean = new KoreanVocabulary(this, resource);

这是对象的构造函数,并且出现错误:

    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    String word = null;

    try {
        while ((word = br.readLine()) != null){
            vocabulary[index++] = word;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

编辑:

index是一个整数。词汇表[]数组是函数的私有成员。构造函数正在尝试初始化数组。

我尝试使用logcat并且有点混乱:

I/ActivityManager(   51): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000     cmp=korean.koreanstudy/.MainMenuActivity bnds=[5,234][115,352] }
W/WindowManager(   51): No window to dispatch pointer action 0
W/WindowManager(   51): No window to dispatch pointer action 1
I/ActivityManager(   51): Displayed activity korean.koreanstudy/.MainMenuActivity: 388 ms (total 388 ms)
I/ActivityManager(   51): Starting activity: Intent {   cmp=korean.koreanstudy/.VocabularyMenuActivity }
I/ActivityManager(   51): Displayed activity korean.koreanstudy/.VocabularyMenuActivity: 322 ms (total 322 ms)
I/ActivityManager(   51): Starting activity: Intent { cmp=korean.koreanstudy/.KoreanVocabularyActivity (has extras) }
I/global  (  250): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
D/AndroidRuntime(  250): Shutting down VM
W/dalvikvm(  250): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime(  250): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  250): java.lang.RuntimeException: Unable to start activity   ComponentInfo{korean.koreanstudy/korean.koreanstudy.KoreanVocabularyActivity}:      java.lang.ArrayIndexOutOfBoundsException

我想要资源ID的原因是因为我想用特定的文件资源初始化对象。我需要一种方法来识别特定文件。我一直在尝试的方式是在菜单上的开关盒内。用户单击难度级别,将在下一个活动中为该难度加载特定列表。但是,我需要知道用户选择了哪个难度。这就是我试图跟踪ID的原因。

编辑2:

这是数组的类和构造函数信息。

private int index = 0; 
private int max = 0;
private String[] vocabulary = new String[255];

public KoreanVocabulary(Context context, int resource){
    InputStream is = context.getResources().openRawResource(resource);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    String word = null;

    try {
        while ((word = br.readLine()) != null){
            vocabulary[index++] = word;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    max = index;
    index = 0;
    } 

编辑3:

对不起大家,我发现了问题。从数组中读取时,我以某种方式关闭了一个引用。我认为问题出在文件阅读上,但是你们都指出这很好 - 你说得对!遗憾!

3 个答案:

答案 0 :(得分:0)

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String word = null;

try {
    while ((word = br.readLine()) != null){
        vocabulary[index++] = word; //<!-- POI#1
    }
} catch (IOException e) {
    e.printStackTrace(); //<!-- POI#2
}

兴趣点#1:vocabulary / index来自哪里?他们是什么数据类型? index可能是int,但问问题并没有什么坏处。

兴趣点#2:你得到例外吗?如果是,那是IOException吗?不是,你得到的实际错误是什么?我想你忘了原帖子中的那部分 - logcat应该能够提供你需要的信息。

答案 1 :(得分:0)

如果您只需要获取上下文所需的资源(您的Activity已经拥有此资源)并正常调用它。你不应该传递资源。

此外,您并没有完全按照说法传递资源...您正在传递该资源的值,因此最好从您的下一个活动中访问该资源

答案 2 :(得分:0)

我试图找到构造函数之间的连接

korean = new KoreanVocabulary(this, resource);

和你的其余代码,但找不到任何代码。我猜,你得到的错误是IOException ......其中是

BufferedReader br = new BufferedReader(new InputStreamReader(is));

从中获取输入? 我确实认为问题的标题有些错误 - 你确实在两个活动之间传递了资源。这不是代码中的问题(当然,除非logcat会显示不同的东西)。 * 编辑 - 更不用说,正如其他人已经说过的那样,R。资源全部可用,无需在活动之间传递它们......