【问题标题】:How to solve array out of bound exception?如何解决数组越界异常?
【发布时间】:2014-06-27 14:59:33
【问题描述】:

这是我的代码,我的数组越界异常。我如何解决这个错误?我使用位图对象而不是字符串。当我将位图图像存储到数组列表中时,我得到了这个错误。

MainActivity.java

public class MainActivity extends Activity {
    ListView lv;
    Context context;

    ArrayList prgmName;
    Bitmap bitmap;
    //bitmap=getBitmapFromUrl("http://content6.flixster.com/movie/11/17/75/11177548_pro.jpg");

    public static String [] prgmNameList={"Let Us C","c++","JAVA","Jsp","Microsoft .Net","Android","PHP","Jquery","JavaScript"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bitmap=getBitmapFromUrl("http://content6.flixster.com/movie/11/17/75/11177548_pro.jpg");
        context=this;
        Bitmap  [] prgmImages ={bitmap,bitmap};
        lv=(ListView) findViewById(R.id.listView);
        lv.setAdapter(new CustomAdapter(this, prgmNameList,prgmImages));

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    private Bitmap getBitmapFromUrl(String src) {
        // TODO Auto-generated method stub
        try {

            URL url =new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input=connection.getInputStream();
            Bitmap mybiBitmap=BitmapFactory.decodeStream(input);
            return mybiBitmap;


         } catch (Exception e) {
            // TODO: handle exception
           e.printStackTrace();
           return null;
         }


    }

}

CustomerAdapter.java

public class CustomAdapter extends BaseAdapter{
    String [] result;
    Context context;
 Bitmap[] imageId;
      private static LayoutInflater inflater=null;
    public CustomAdapter(MainActivity mainActivity, String[] prgmNameList, Bitmap[] prgmImages) {
        // TODO Auto-generated constructor stub
        result=prgmNameList;
        context=mainActivity;
        imageId=prgmImages;
         inflater = ( LayoutInflater )context.
                 getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return result.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class Holder
    {
        TextView tv;
        ImageView img;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder=new Holder();
        View rowView;        
             rowView = inflater.inflate(R.layout.list_item, null);
             holder.tv=(TextView) rowView.findViewById(R.id.textView1);
             holder.img=(ImageView) rowView.findViewById(R.id.imageView1);       
         holder.tv.setText(result[position]);
         holder.img.setImageBitmap(imageId[position]);         
         rowView.setOnClickListener(new OnClickListener() {         
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "You Clicked "+result[position], Toast.LENGTH_LONG).show();
            }
        });  
        return rowView;
    }

}

【问题讨论】:

    标签: android


    【解决方案1】:

    您得到 ArrayIndexOutOfBound 是因为 imageId 的数组大小与 result 不同。

    你可以看到你的 result 数组有 9 个元素,而 imageId 只有 2 个元素,而且两个元素都是一样的,那么为什么你使用数组,只需传递简单的位图数组。

    你的结果数组:

     public static String [] prgmNameList={"Let Us C","c++","JAVA","Jsp","Microsoft .Net","Android","PHP","Jquery","JavaScript"};
    

    你的 imageId 数组:

     Bitmap  [] prgmImages ={bitmap,bitmap};
    

    解决方案:

    1) 如果要为行项目显示不同的图像,则传递 imageId 数组相同大小 结果数组。 2) 如果您想在所有行项目中显示相同的图像,则只传递单个位图而不是数组。

    【讨论】:

    • 我做了更改,if(result != null && result.length > position) { holder.tv.setText(result[position]); } if(imageId != null && imageId.length > 0) { holder.img.setImageBitmap(imageId[0]); } 但图像未显示到列表视图中,我如何显示图像?
    • ya 错误已解决,但图像仍未显示到列表视图中,为什么图像未显示到列表视图中?我该如何解决这个问题?
    • 位图 [] prgmImages ={位图,位图,位图,位图,位图,位图,位图,位图,位图};
    • @user3354610 可能是位图为空。
    • public View getView(final int position, View convertView, ViewGroup parent) {Holder holder=new Holder();View rowView;rowView = inflater.inflate(R.layout.list_item, null);holder .tv=(TextView) rowView.findViewById(R.id.textView1);holder.img=(ImageView) rowView.findViewById(R.id.imageView1);if(result != null && result.length > position){ holder .tv.setText(result[position]);}if(imageId != null && imageId.length > 0){ holder.img.setImageBitmap(imageId[0]);}
    【解决方案2】:

    您的字符串数组有 9 个项目。所以你的适配器在 getCount() 中返回 9

    public static String [] prgmNameList={"Let Us C","c++","JAVA","Jsp","Microsoft .Net","Android","PHP","Jquery","JavaScript"};
    

    但是你的位图数组只有 2 项

    Bitmap  [] prgmImages ={bitmap,bitmap};
    

    所以在getView 方法中,当listView 请求创建列表中的第三项时,您将在这一行收到越界消息。

    holder.img.setImageBitmap(imageId[position]); 
    

    要修复它,您必须扩展图像数组。它的大小必须与字符串数组的大小相匹配。

    【讨论】:

      【解决方案3】:

      在您的 getView 方法中,您有大小为 2 的 prgmImage 数组 但是pos可能有n个。

      试试这个...

         if(result != null && result.length > position)
              { 
                holder.tv.setText(result[position]);
              }
      
              if(imageId != null && imageId.length > 0)
              {
                 holder.img.setImageBitmap(imageId[0]); 
              }
      

      这完全取决于你从 getCount() 返回的计数 如果返回 10 并访问数组的第 10 个元素(例如 arr[position]),但提到的数组大小为 2,那么它会抛出异常。

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多