2017-05-14 201 views
0

我有这段代码,我把它从stackoverflow和有点改变它。该代码检索图库的内容并将每个图像路径放入数组列表中。然后它随机选择ArrayList中的一个路径,并将其作为ImageView的资源。感谢您的关注。为什么我会得到“java.lang.IllegalArgumentException”错误?

import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ImageView; 
import java.util.ArrayList; 
import java.util.Random; 

public class MainActivity extends AppCompatActivity { 

    Handler handler = new Handler(); 
    private ImageView randomPicture; 
    private Bitmap currentBitmap = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     randomPicture = (ImageView)findViewById(R.id.random_picture); 
     final ArrayList<String> imagesPath = new ArrayList<>(); 

     String[] projection = new String[]{ 
       MediaStore.Images.Media.DATA, 
     }; 

     Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
     Cursor cur = getContentResolver().query(images, projection, null, null, null) 

     if(cur == null) { 
      randomPicture.setImageResource(R.drawable.picture); 
     } 
     else { 
      if (cur.moveToFirst()) { 

       int dataColumn = cur.getColumnIndex(
         MediaStore.Images.Media.DATA); 
       do { 
        imagesPath.add(cur.getString(dataColumn)); 
       } while (cur.moveToNext()); 
      } 
      cur.close(); 
      final Random random = new Random(); 
      final int count = imagesPath.size(); 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        int number = random.nextInt(count); 
        String path = imagesPath.get(number); 
        if (currentBitmap != null) 
         currentBitmap.recycle(); 
        currentBitmap = BitmapFactory.decodeFile(path); 
        randomPicture.setImageBitmap(currentBitmap); 
        handler.postDelayed(this, 1000); 
       } 
      }); 
     } 
    } 
} 

它崩溃就行与错误光标:

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.postcards, PID: 2424 
java.lang.IllegalArgumentException: n <= 0: 0 
at java.util.Random.nextInt(Random.java:182) 
at com.example.postcards.MainActivity$1.run(MainActivity.java:53) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5254) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+1

请告诉我哪行是** MainActivity.java:53 **? –

+0

正如Mehran所说,突出MainActivity行53 – Zoe

+0

谢谢你所有的答案。我明白了! –

回答

0

错误明确指出不能传递到Random.nextInt()方法的值小于或等于0。

java.lang.IllegalArgumentException: n <= 0: 0 
0

此线路:

int number = random.nextInt(count); 

会给出错误,因为您将0作为计数。使用nextInt(int)需要大于0的输入。输入不能是负数或0

0

问题是来自随机的nextInt。你的计数可能是零?

0

Random#nextInt(int)预计参数为正值。这里不是这种情况。

Source