2013-11-25 102 views
0
package org.example.mbtiapplication; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 
import android.widget.TextView; 

public class MBTITest extends Activity implements OnItemSelectedListener { 

    int I, E, N, S, T, F, J, P; 
    String[] type; 
    ArrayList<String> Evaluator = new ArrayList<String>(4); 
    Spinner firstSpinner ; 
    Spinner secondSpinner ; 
    Spinner thirdSpinner; 
    Spinner fourthSpinner ; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_mbtitest); 
     firstSpinner = (Spinner) findViewById(R.id.spinner1); 
     secondSpinner = (Spinner) findViewById(R.id.spinner2); 
     thirdSpinner = (Spinner) findViewById(R.id.spinner3); 
     fourthSpinner = (Spinner) findViewById(R.id.spinner4); 
     type = new String[3]; 
     addItemsOnSpinner1(); 
     addItemsOnSpinner2(); 
     addItemsOnSpinner3(); 
     addItemsOnSpinner4(); 
     final Button calculate = (Button) findViewById(R.id.calculate); 
     calculate.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       getPersonality(); 
       evaluateType(); 
       TextView calculatedPersonality = (TextView) findViewById(R.id.personalitytype); 
       calculatedPersonality.setText(type.toString()); 

      } 
     }); 


     } 

    public void addItemsOnSpinner1(){ 
     Spinner firstSpinner = (Spinner) findViewById(R.id.spinner1); 
     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.spinnerarraybool, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     firstSpinner.setAdapter(adapter); 


    } 

    public void addItemsOnSpinner2(){ 
     Spinner firstSpinner = (Spinner) findViewById(R.id.spinner2); 
     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.spinnerarraybool, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     firstSpinner.setAdapter(adapter); 
    } 

    public void addItemsOnSpinner3(){ 
     Spinner firstSpinner = (Spinner) findViewById(R.id.spinner3); 
     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.spinnerarraybool, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     firstSpinner.setAdapter(adapter); 
    } 

    public void addItemsOnSpinner4(){ 
     Spinner firstSpinner = (Spinner) findViewById(R.id.spinner4); 
     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.spinnerarraybool, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     firstSpinner.setAdapter(adapter); 
    } 



    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, int arg2, 
      long arg3) { 
     switch (arg1.getId()){ 
     case R.id.spinner1: 
      String firstAnswer = firstSpinner.getSelectedItem().toString(); 
      Evaluator.remove(0); 
      Evaluator.add(0 ,firstAnswer); 
      break; 
     case R.id.spinner2: 
      String secondAnswer = firstSpinner.getSelectedItem().toString(); 
      Evaluator.remove(1); 
      Evaluator.add(1, secondAnswer); 
      break; 
     case R.id.spinner3: 
      String thirdAnswer = firstSpinner.getSelectedItem().toString(); 
      Evaluator.remove(2); 
      Evaluator.add(2, thirdAnswer); 
      break; 
     case R.id.spinner4: 
      String fourthAnswer = firstSpinner.getSelectedItem().toString(); 
      Evaluator.remove(3); 
      Evaluator.add(3, fourthAnswer); 
      break; 
     } 


    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 

    } 


    //Evaluates answers 
    public void getPersonality(){ 
     if (Evaluator.get(0) == "True"){ 
      E += 1; 
     } 
     if (Evaluator.get(0) == "In the Middle"){ 
      E += 1; 
      I += 1; 
     } 
     if (Evaluator.get(0) == "False"){ 
      I += 1; 
     } 


     if (Evaluator.get(1) == "True"){ 
      N += 1; 
     } 
     if (Evaluator.get(1) == "In the Middle"){ 
      N += 1; 
      S += 1; 
     } 
     if (Evaluator.get(1) == "False"){ 
      S += 1; 
     } 


     if (Evaluator.get(2) == "True"){ 
      F += 1; 
     } 
     if (Evaluator.get(2) == "In the Middle"){ 
      F += 1; 
      T += 1; 
     } 
     if (Evaluator.get(2) == "False"){ 
      T += 1; 
     } 


     if (Evaluator.get(3) == "True"){ 
      P += 1; 
     } 
     if (Evaluator.get(3) == "In the Middle"){ 
      P += 1; 
      J += 1; 
     } 
     if (Evaluator.get(3) == "False"){ 
      J += 1; 
     } 

    } 

    public void evaluateType(){ 
     //INTRO VS EXTRO 
     if (E > I){ 
      type[0] = "E"; 
     } 
     if (I > E){ 
      type[0] = "I"; 
     } 
     if (I == E){ 
      type[0] = "x";  
     } 
     //INTUITION VS SENSING 
     if (N > S){ 
      type[1] = "N"; 
     } 
     if (S > N){ 
      type[1] = "S"; 
     } 
     if (S == N){ 
      type[1] = "x";  
     } 
     //THINKING VS FEELING 
     if (T > F){ 
      type[2] = "T"; 
     } 
     if (F > T){ 
      type[2] = "F"; 
     } 
     if (T == F){ 
      type[2] = "x";  
     } 
     //JUDGING VS PERCIEVING 
     if (J > P){ 
      type[3] = "J"; 
     } 
     if (P > J){ 
      type[3] = "P"; 
     } 
     if (P == J){ 
      type[3] = "x";  
     } 

    } 











} 

11-25 16:55:22.154: E/AndroidRuntime(1840): FATAL EXCEPTION: main 
11-25 16:55:22.154: E/AndroidRuntime(1840): Process: org.example.mbtiapplication, PID: 1840 
11-25 16:55:22.154: E/AndroidRuntime(1840): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at java.util.ArrayList.get(ArrayList.java:308) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at org.example.mbtiapplication.MBTITest.getPersonality(MBTITest.java:136) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at org.example.mbtiapplication.MBTITest$1.onClick(MBTITest.java:43) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at android.view.View.performClick(View.java:4424) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at android.view.View$PerformClick.run(View.java:18383) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at android.os.Handler.handleCallback(Handler.java:733) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at android.os.Looper.loop(Looper.java:137) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at android.app.ActivityThread.main(ActivityThread.java:4998) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at java.lang.reflect.Method.invoke(Method.java:515) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
11-25 16:55:22.154: E/AndroidRuntime(1840):  at dalvik.system.NativeStart.main(Native Method) 

对不起nooby问题。我是一名初学者程序员,遇到了另一个例外。我试图弄乱我的ArrayList代码和方法.get(),但无济于事,我再次来到这里。当我点击我的按钮“计算”时会发生这种情况。任何理论?为什么我会得到这个IndexOutofBoundsexception?

+1

您应该已经学会了如何从最后一个问题中读取堆栈跟踪。 java.lang.IndexOutOfBoundsException:索引0无效,大小为0 11-25 16:55:22.154:E/AndroidRuntime(1840):在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 11-25 16:55:22.154:E/AndroidRuntime(1840):在java.util.ArrayList.get(ArrayList.java:308) 11-25 16:55:22.154:E/AndroidRuntime(1840):at org.example。 mbtiapplication.MBTITest.getPersonality(MBTITest.java:136)'第136行是什么? – Simon

+0

我明白问题出在哪里,我只是想知道如何解决问题!第136行是空格 –

+1

好的,这是越来越讨厌,堆栈跟踪将永远不会引用空行。与上次一样 - 使用匹配的堆栈跟踪发布实际代码。 – Simon

回答

3

当您调用新的ArrayList(4)时,您将设置列表的初始容量,而不是其大小。

所以,当你拨打:

Evaluator.get(0) 

正在拨打的是空的名单上获得。

您必须将项目添加到列表中,或者在调用get()之前检查列表是否包含项目。

添加项目:

Evaluator.add(""); \\times 4 

检查大小:

if(Evaluator.size()>0) 
{ 
    //your code here 
} 
0

我觉得你的问题是在

type = new String[3]; 

应该

type = new String[4] 

这是因为数组从0开始,而不是1我看到你试图添加4个项目到阵列。

+1

那么索引怎么是0和大小是0?这表明OP正在引用一个空数组。 – Simon

+0

也许......我会试试看,即使在说明元素中有多少个元素时,我也一直认为它考虑到了它从0开始。 –

+0

你这样做,但是异常显示size = 0。大小是人类可读的,从1开始,索引从0开始。 – Simon

4
ArrayList<String> Evaluator = new ArrayList<String>(4); 

这不会给你的4项

一个ArrayList试着将

ArrayList<String> Evaluator = new ArrayList<String>(4); 

ArrayList<String> Evaluator = new ArrayList<String>(4); 
Evaluator.add("");Evaluator.add("");Evaluator.add("");Evaluator.add(""); 

你看到现在的问题是什么?

1

我在你的代码有一个简单的介绍一下:

EvaluatorString秒的ArrayList。这意味着它的大小可能在运行时动态变化。在您的onItemSelected方法中,您使用remove()方法,这会减少您的ArrayList的大小。假设你的ArrayList只有3个String s:你不能呼叫,因为那会指向你没有的第4个元素。

下面是一些普通的Java代码可以运行和了解:

进口java.util中。数组列表;

public class Main { 
    public static void main(String[] args) { 
     ArrayList<String> evaluator = new ArrayList<String>(4); 


     evaluator.add("A"); 
     evaluator.add("B"); 
     evaluator.add("C"); 
     evaluator.remove(0); 

     System.out.print(evaluator.get(2)); 
    } 
} 

它会给你以下的输出:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 
    at java.util.ArrayList.rangeCheck(ArrayList.java:604) 
    at java.util.ArrayList.get(ArrayList.java:382) 
    at Main.main(Main.java:14) 

一旦你从ArrayList删除节点,它的大小从3降至2.所以,你无法通过调用get(2)访问第三元素。

+0

在我的ArrayList的.remove()之后立即应用.add()方法到我删除的相同索引以弥补丢失的空间。 –

+0

是的,的确如此。但为了将来的参考,你需要知道ArrayList的大小是动态的,所以你不能认为它会有你想象的大小。 –