我正准备一个包含异常处理的中期,并且难以理解为什么以下代码输出:这里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);
}
}
答案 0 :(得分:2)
ArrayList<Object> l = new ArrayList(10);
此构造函数的整数参数基本上是对实现的提示,以便在内部为十个对象分配足够的空间。它仍然返回一个“空”数组列表。在访问这些元素之前,您需要使用l.add(...)
向其中添加元素。
答案 1 :(得分:1)
您似乎对ArrayList
初始化的工作方式存在误解。 ArrayList l = new ArrayList(10);
的分配只会创建ArrayList
并为10
元素保留内存插槽,但不会以任何方式填充这些插槽。甚至没有null
。
因此:
example.method1();
上,您的ArrayList
在10
命令中使用ArrayList l = new ArrayList(10);
个插槽进行实例化,然后您只需尝试get
索引处的元素1
{1}}。ArrayList
为空。它不包含任何元素,使得1
索引下降OutOfBounds
,从而触发OutOfBoundsException
,这将在您的常规Exception
catch块中处理。Catch
的{{1}}块将Exception
文本打印到控制台,一旦超出该块的范围,程序将转换为here 2
} block。finally
区块打印finally
,当区块超出范围时,方法也是如此,因此使用here I am
返回main
。OutOfBoundsException
。