【问题标题】:two array dimensional ArrayIndexOutOfBoundException and NullPointerException二维数组 ArrayIndexOutOfBoundException 和 NullPointerException
【发布时间】:2023-03-19 11:48:01
【问题描述】:

我写了一个代码来计算一些权重。它们是整数权重。 每次单击按钮时我都需要保存它们。 请帮我。当我第二次尝试按下按钮时,我不明白为什么编译器会给我一个错误。这是我的完整代码:

    public class TrainingActivity extends Activity {

    private EditText etIn1, etIn2, etDesired;
    private TextView prevInput;

    int W[][] = new int[2][];
    int X[][] = new int[30][];

    int w0=0, w1=0, w2=0, p=1, sum=0, clicks=0;

    private Button nxtData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.training_activity);

    View backgroundImage = findViewById(R.id.background);
    Drawable background = backgroundImage.getBackground();
    background.setAlpha(40);

    etIn1= (EditText) findViewById(R.id.etInput1);
    etIn2 = (EditText) findViewById(R.id.etInput2);
    etDesired = (EditText) findViewById(R.id.etDesired);

    prevInput = (TextView) findViewById(R.id.prevInput);

    nxtData = (Button) findViewById(R.id.nextData);
    nxtData.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            int sum = 0;
            ++clicks;

            int intetIn1 = Integer.parseInt(etIn1.getText().toString());
            int intetIn2 = Integer.parseInt(etIn2.getText().toString());
            int intetDesired = Integer.parseInt(etDesired.getText().toString());

            X[clicks-1] = new int[] {intetIn1, intetIn2, 1};

            prevInput.setText("Last Inputs: (" + intetIn1 + ", " + intetIn2 +
                    ", " + intetDesired + ")");

            if(clicks == 1) {
            if(intetDesired == 1) {
                W[0] = new int[] {intetIn1, intetIn2, 1};
                W[1] = W[0];
            } else if(intetDesired == (-1)){
                W[0] = new int[] {-intetIn1, -intetIn2, -1};
                W[1] = W[0];
            }
            } else if(clicks > 1) {                 
                for(int i=0; i<3; i++){
                    sum = sum + W[clicks-1][i] * X[clicks-1][i];
                } if(sum>0 && intetDesired==1) {
                    W[clicks] = W[clicks-1];
                } else if(sum<0 && intetDesired==(-1)) {
                    W[clicks] = W[clicks-1];
                } else if(sum<=0 && intetDesired==1) {
                    for(int i=0; i<3; i++) {
                    W[clicks][i] = W[clicks-1][i] + X[clicks-1][i];
                }
                } else if(sum>=0 && intetDesired==(-1)) {
                    for(int i=0; i<3; i++) {
                        W[clicks][i] = W[clicks-1][i] - X[clicks-1][i];
                    }
                }
            } 

            etIn1.setText("");
            etIn2.setText("");
            etDesired.setText("");

        }
    });


}}

这是它抛出的异常:

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2

更新EEEEEEEE 我通过将 W[2][] 更改为 W[20][] 解决了 arrayindexoutofboundexception 的问题。但在某些点击中它给了我这个错误:

java.lang.NullPointerException

目前还不清楚是哪些点击。有时它在第二次点击中。或者有时是第四次点击。请帮忙。

【问题讨论】:

  • 调试你的代码 - 一个长度为 2 的数组有索引 0 和 1 - 你正在尝试访问索引 2,所以程序非常正确地抛出了一个有用、清晰和有意义的异常来帮助你解决问题.
  • 我猜你在这行sum = sum + W[clicks-1][i] * X[clicks-1][i];
  • 是的,你是对的。 W 数组是问题所在。实际上我认为我为此放置了 20 行。但它只有2个。谢谢你。我认为它会解决问题。

标签: android exception nullpointerexception indexoutofboundsexception


【解决方案1】:

W[点击次数] = W[点击次数 - 1];

在上面一行,你得到了错误,因为你只定义了数组的大小

int W[][] = new int[2][];

所以它只分配了 W[0][] 和 W[1][]

当点击第二次变量的点击值为 2 时编译器给出 ArrayIndexOutOfBoundException

已编辑...................................... .....

由于您的逻辑错误并且构建二维数组的方法不正确,您得到了 null 值。请使用调试工具找到实际问题来实现逻辑并使用二维数组,如下面的 java 或 android 示例:

 List<List<Integer>> triangle = new ArrayList<List<Integer>>();

List<Integer> row1 = new ArrayList<Integer>(1);
row1.add(2);
triangle.add(row1);

List<Integer> row2 = new ArrayList<Integer>(2);
row2.add(3);row2.add(4);
triangle.add(row2);

triangle.add(Arrays.asList(6,5,7));
triangle.add(Arrays.asList(4,1,8,3));

System.out.println("Size = "+ triangle.size());
for (int i=0; i<triangle.size();i++)
    System.out.println(triangle.get(i));

【讨论】:

  • 谢谢你。我以为我放了 20 而不是 2。我会检查一下并告诉你结果。但我认为它肯定会解决问题。
  • 如何点击您进行计算?如果您输入 20 而不是 2,则单击 19 次,然后给出相同的错误。所以实现另一个逻辑
  • 我假设用户将点击少于 19 次。但你能告诉我一种基于精确点击构建二维数组的方法吗?不可能。至少我想不到。
  • 问题是。我修复了 2. 并将其设为 20. 但有时它给了我 java.lang.NullPointerException 我真的不知道该怎么办。请帮忙。
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 2013-06-26
  • 2010-12-19
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多