异常处理优先级

时间:2017-10-11 03:46:54

标签: java

我正准备一个包含异常处理的中期,并且难以理解为什么以下代码输出:这里2,我在这里,这里A.看来他们正试图访问在数组列表中创建的有效点尝试阻止,为什么会抛出indexoutofbounds异常?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class MExceptionMulti {
public void method1 () 
{           
    try {
        ArrayList l = new ArrayList(10);
        l.get(1);
    }
    catch (NullPointerException e) {
        System.out.println ("here 1");
    }
    catch (Exception e) {
        System.out.println ("here 2");
        throw new IndexOutOfBoundsException();
    }
    finally {
        System.out.println ("here I am");
    }
    System.out.println ("here 4");
}
public static void main(String[] args) throws IOException  {
    MExceptionMulti example = new MExceptionMulti();

    try {
        example.method1();
        example.method2();
        System.out.println ("I am after the method");
    }
    catch (IndexOutOfBoundsException e) {
        System.out.println ("here A");
        throw new IllegalArgumentException();
    }
//      catch (Exception e) {
//          System.out.println ("here B1");
//      }
//      catch (Exception e) {
//          System.out.println ("here B2");
//      }
//      catch (Throwable e) {
//          System.out.println ("here B3");
//      }
    System.out.println ("Here at the end of it all!!!");
}





public void method2 () throws IOException
{
    BufferedReader in = new BufferedReader (new 
InputStreamReader(System.in));
    System.out.println ("How much do you weight?");
    String inputit="";  

    inputit = in.readLine();
    int weight = Integer.parseInt(inputit);

}

}

已编辑的代码

结果: 这里1 我在这里 这里4 你体重多少?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class MExceptionMulti {
    public void method1 () 
    {           
        try {
            ArrayList l = new ArrayList(10);
            l.get(1);
        }
        catch (IndexOutOfBoundsException e) {
            System.out.println ("here 1");
        }
        catch (Exception e) {
            System.out.println ("here 2");
            throw new IndexOutOfBoundsException();
        }
        finally {
            System.out.println ("here I am");
        }
        System.out.println ("here 4");
    }
    public static void main(String[] args) throws IOException  {
        MExceptionMulti example = new MExceptionMulti();

        try {
            example.method1();
            example.method2();
            System.out.println ("I am after the method");
        }
        catch (IndexOutOfBoundsException e) {
            System.out.println ("here A");
            throw new IllegalArgumentException();
        }
//      catch (Exception e) {
//          System.out.println ("here B1");
//          }
//          catch (Exception e) {
//              System.out.println ("here B2");
//          }
//          catch (Throwable e) {
//              System.out.println ("here B3");
//          }
        System.out.println ("Here at the end of it all!!!");
    }





    public void method2 () throws IOException
    {
        BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
        System.out.println ("How much do you weight?");
        String inputit="";  

        inputit = in.readLine();
        int weight = Integer.parseInt(inputit);

    }

}

2 个答案:

答案 0 :(得分:2)

ArrayList<Object> l = new ArrayList(10);

此构造函数的整数参数基本上是对实现的提示,以便在内部为十个对象分配足够的空间。它仍然返回一个“空”数组列表。在访问这些元素之前,您需要使用l.add(...)向其中添加元素。

答案 1 :(得分:1)

您似乎对ArrayList初始化的工作方式存在误解。 ArrayList l = new ArrayList(10);的分配只会创建ArrayList并为10元素保留内存插槽,但不会以任何方式填充这些插槽。甚至没有null

因此:

  1. example.method1();上,您的ArrayList10命令中使用ArrayList l = new ArrayList(10);个插槽进行实例化,然后您只需尝试get索引处的元素1 {1}}。
  2. ArrayList为空。它不包含任何元素,使得1索引下降OutOfBounds,从而触发OutOfBoundsException,这将在您的常规Exception catch块中处理。
  3. Catch的{​​{1}}块将Exception文本打印到控制台,一旦超出该块的范围,程序将转换为here 2 } block。
  4. 您的finally区块打印finally,当区块超出范围时,方法也是如此,因此使用here I am返回main
  5. 您的主要捕获异常并打印OutOfBoundsException