Unable to start activity ComponentInfo java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
Учу JSON, вот решил написать легкую игру угадай звезду. Написал все как в примерах, ошибок в коде нет, но при запуске в логах вылазит эта ошибка. С чем это связано и как решить не знаю...может подскажет кто?
public class MainActivity extends AppCompatActivity {
private ImageView photoStar;
private Button btn0, btn1, btn2, btn3;
private String url = "https://bodysize.org/ru/top100/";
private ArrayList<String> imgUrls;
private ArrayList<String> names;
private ArrayList<Button> buttons;
private int numberoOfQuestions;
private int numberOfRightAnswer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
photoStar = (ImageView) findViewById(R.id.photoStar);
btn0 = (Button) findViewById(R.id.btn0);
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
imgUrls = new ArrayList<>();
names = new ArrayList<>();
buttons = new ArrayList<>();
buttons.add(btn0);
buttons.add(btn1);
buttons.add(btn2);
buttons.add(btn3);
getContent();
game();
}
private void getContent(){
DownloadContent downloadContent = new DownloadContent();
try {
String content = downloadContent.execute(url).get();
String start = "<article class=\"top1-person\">"; // cтрока с которой начинаем
String finish = "</article><div style=\"margin: 1em 0 2em;\">"; // cтрока на которой закончим
Pattern pattern = Pattern.compile(start + "(.*?)" + finish);
Matcher matcher = pattern.matcher(content);
String newContent = "";
while (matcher.find()){
newContent = matcher.group(1);
}
Pattern patternImg = pattern.compile("background-image: url( (.*?) );" );
Pattern patternName = pattern.compile("target=\"_blank\"> (.*?) </a>");
Matcher matcherImg = patternImg.matcher(newContent);
Matcher matcherName = patternName.matcher(newContent);
while (matcherImg.find()){
imgUrls.add(matcherImg.group(1));
}
while (matcherName.find()){
names.add(matcherName.group(1));
}
for(String s:imgUrls){
Log.i("MyResult", s);
}
// Log.i("MyResult", newContent);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void game (){
generateQuestions();
DownloadPhoto task = new DownloadPhoto();
try {
Bitmap bitmap = task.execute(imgUrls.get(numberoOfQuestions)).get();
if(bitmap != null){
photoStar.setImageBitmap(bitmap);
for (int i = 0; i<buttons.size(); i++){
if(i == numberOfRightAnswer){
buttons.get(i).setText(names.get(numberoOfQuestions));
} else {
int wrongAnswer = generateWrongAnswer();
buttons.get(i).setText(names.get(wrongAnswer));
}
}
}
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void generateQuestions (){
numberoOfQuestions = (int) ( Math.random() * names.size() );
numberOfRightAnswer = (int) ( Math.random() * buttons.size() );
}
private int generateWrongAnswer (){
return (int) ( Math.random() * names.size() ) ;
}
private static class DownloadPhoto extends AsyncTask<String,Void, Bitmap>{
@Override
protected Bitmap doInBackground(String... strings) {
URL url = null;
HttpURLConnection httpURLConnection = null;
StringBuilder resultContent = new StringBuilder();
try {
url = new URL(strings[0]);
httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (httpURLConnection != null){
httpURLConnection.disconnect();
}
}
return null;
}
}
private static class DownloadContent extends AsyncTask<String,Void,String>{
@Override
protected String doInBackground(String... strings) {
URL url = null;
HttpURLConnection httpURLConnection = null;
StringBuilder resultContent = new StringBuilder();
try {
url = new URL(strings[0]);
httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null){
resultContent.append(line);
line = reader.readLine();
}
return resultContent.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (httpURLConnection != null){
httpURLConnection.disconnect();
}
}
return null;
}
}
}
Вот логи
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.guessstar, PID: 23810
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.guessstar/com.example.guessstar.MainActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2511)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2571)
at android.app.ActivityThread.access$900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1409)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:5620)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.example.guessstar.MainActivity.game(MainActivity.java:99)
at com.example.guessstar.MainActivity.onCreate(MainActivity.java:58)
at android.app.Activity.performCreate(Activity.java:6320)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1121)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464)