ArrayList.indexOf会杀死代码,但不会使程序崩溃,也不会被捕获

时间:2011-09-04 21:13:14

标签: java arraylist

我有这段代码

public String[][] checkBoxes(String[][] varden){

    ArrayList[][] tillatnaSiffror = new ArrayList[9][9];

    for(int i=0;i<9;i++){
        for(int ruta=0;ruta<9;ruta++){

            if(tillatnaSiffror[i][ruta] == null){
                tillatnaSiffror[i][ruta] = new ArrayList<Integer>();
                for(int add=1;add<=9;add++){
                    tillatnaSiffror[i][ruta].add(add);
                }
            }
            if(varden[i][ruta].equals("X")){
                for(int a=0;a<9;a++){
                    try {

                        System.out.println(tillatnaSiffror[i][ruta].indexOf(Integer.parseInt(varden[i][ruta])));
                        System.out.print("Testing");

                    } catch(Throwable n){
                        System.out.print("Throws exception");
                    }
                }
            }
        }
    }
}

tillatnaSiffror[i][ruta]是一个包含数字1-9的ArrayList,变量iruta来自包含我的代码的for循环。二维数组varden包含数字1到9的字符串。问题是,它不是打印我正在寻找的索引,而是什么都不做。之后它也不会打印“测试”,也不会因为异常而被捕获。我计算了例外情况。

但是,如果我像这样放零:

System.out.println(tillatnaSiffror[0][0].indexOf(Integer.parseInt(varden[0][0])));

然后它打印出索引,以及“测试”文本。任何想法为什么它不适用于变量?这不是ArrayIndexOutOfBounds问题;变量是正确的。

3 个答案:

答案 0 :(得分:3)

如果没有整个代码并且不知道抛出了什么异常,我唯一的建议是将该行拆分为多个语句并查看它弹出的位置。然后你可能会自己找到答案。

String s = varden[i][ruta];
int i = Integer.parseInt(s);
List<Integer> l = tillatnaSiffror[i][ruta];
int idx = l.indexOf(i);
System.out.println(idx);

修改

if(varden[i][ruta].equals("X")){

然后在if

Integer.parseInt(varden[i][ruta]))

你看到了问题吗? 顺便说一句,你似乎没有使用第三个a的{​​{1}},是吗?

答案 1 :(得分:1)

几乎可以肯定的是,你得到一个运行时异常,这是未经检查的 - 这意味着编译器不会警告你需要捕获。您获得的最可能的运行时异常是ArrayIndexOutOfBoundsExceptionNumberFormatExcpetion

要“修复”此问题,请尝试catch (Throwable e) - 这肯定会抓住try内的任何内容。我怀疑你不是实际上捕获异常但是它的一些子类。

答案 2 :(得分:0)

代码将:

  • 打印'测试'
  • 抛出一个由{catch'块
  • 捕获的Exception
  • 或抛出Throwable,而Exception不是Throwable的子类,而是在其他地方捕获。

并非所有Exception都是Error的子类:Throwable s是Exception的子类,但不是{{1}}的子类。