1. 简述Java Error类与Exception类的区别。
- Error不是程序需要捕获和进行处理的
- 例如OutOfMemoryError(当Java虚拟机在为对象分配内存空间时,剩余的空间不够,同时也没有可以释放的内容时,将会发生这样的错误)不由程序进行捕获或处理,当Error发生时,程序将会停止。
2. 简述异常处理的两种方式,并举例说明区别。
- 声明抛出处理
- 隐式声明抛出
异常类型是RuntimeException或是其子类,程序方法可以对异常不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码行给出提示
public class TestArray {
private static int[] x;
public static void main(String[] args){
System.out.println(x[0]);
}
}
运行结果:
Exception in thread “main” java.lang.NullPointerException
at TestArray.main(TestArray.java:4)
- 显式声明抛出
只需将方法进行如下改动就实现了显示声明抛出:
public static void main(String args[])
修改为
public static void main(String args[]) throws IOException
如果main中readLine()方法处发生异常,main不负责异常处理,由调用main方法的地方去处理异常,而调用main方法的是Java虚拟机,因此由Java虚拟机进行默认处理。
- 程序捕获处理
以上程序按如下方式修改就是捕获处理
当readLine发生输入异常的时候(注意此处有可能发生异常,而不是一定能发生异常),产生的异常对象将赋值给catch块中的参数e。此后可对e进行操作,例如通过e.printStackTrace()
输出异常信息。
3. 选取RuntimeException类的五个子类,编写抛出并捕获上述子类异常的程序。
- 算数异常
public class ExampleException {
public static void main(String[] args) {
int a,b,c;
a=67; b=0;
c=a/b;
System.out.println(a+"/"+b+"="+c);
}
}
运行结果:
Exception in thread “main” java.lang.ArithmeticException: / by zero
at ExampleException.main(ExampleException.java:5)
- 空栈异常
import java.util.*;
class TestEmptyStack {
public static void main(String[] args){
Stack st = new Stack();
Object ob = st.pop();
}
}
运行结果:
Exception in thread “main” java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at java.util.Stack.pop(Unknown Source)
at TestEmptyStack.main(TestEmptyStack.java:5)
- 空指针异常
public class TestArray {
private static int[] x;
public static void main(String[] args){
System.out.println(x[0]);
}
}
运行结果:
Exception in thread “main” java.lang.NullPointerException
at TestArray.main(TestArray.java:4)
- 类型转换异常
public static void main(String[] args) {
// 类型强制转换异常
Object x = new String(“String”);
System.out.println((Integer) x);
}
运行结果:
Exception in thread “main” java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at cn.com.gjw.MyClass.main(MyClass.java:7)
- 数组越界异常
public class TestArgs {
public static void main( String[] args) {
String foo = args[1];
System.out.println("foo = " + foo);
}
}
运行结果:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1
at TestArgs.main(TestArgs.java:3)
4. 自定义一个异常类,并在某场景下抛出该异常对象。
public class SelfGenerateException extends Exception{
SelfGenerateException(String msg){
super(msg); //调用Exception的构造方法
}
static void throwOne() throws SelfGenerateException{
int a = 1;
if (a==1){
//如果a为1就认为在特定应用下存在异常,改变执行路径,抛出异常
throw new SelfGenerateException("a为1");
}
}
public static void main(String args[]){
try{
throwOne();
}
catch(SelfGenerateException e){
e.printStackTrace();
}
}
}
运行结果:
SelfGenerateException: a为1
at SelfGenerateException.throwOne(SelfGenerateException.java:9)
at SelfGenerateException.main(SelfGenerateException.java:13)