概念
操作的过程中可能有很多出错的情况,出错的原因可能是多方面的,有的是不可控的内部原因量未初始化就直接调用实例方法。这些非正常情况在Java中统一被认为是异常,Java使用异常机制来统一处理
常见异常
- NullPointerException (空指针异常)
(1)案例
public class ExceptionTest {
public static void main(String[] args) {
String s = null;
s.indexOf("a");
System.out.println("end");
}
}
(2)输出
Exception in thread "main" java.lang.NullPointerException
at ExceptionTest.main(ExceptionTest.java:5)
(3)解析
输出是告诉我们:在ExceptionTest类的main函数中,代码第5行,出现了空指针异常(java.lang.NullPointerException)。
执行s.indexOf("a")的时候,Java系统发现s的值为null, 没有办法继续执行了,这时就启用异常处理机制,首先创建一个异常对象,这里是类NullPointerException的对象,然后查找看谁能处理这个异常,在示例代码中,没有代码能处理这个异常,Java就启用默认处理机制,那就是打印异常栈信息到屏幕,并退出程序。异常发生点后的代码都不会执行,所以示例代码中最后一行System.out.println("end")不会执行
异常栈信息就包括了从异常发生点到最上层调用者的轨迹,还包括行号,可以说,这个栈信息是分析异常最为重要的信息
- NumberFormatException (数字格式异常)
(1)案例
public class ExceptionTest {
public static void main(String[] args) {
if(args.length<1){
System.out.println("请输入数字");
return;
}
int num = Integer.parseInt(args[0]);
System.out.println(num);
}
}
(2)当输入123输出123,当输入abc输出
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at ExceptionTest.main(ExceptionTest.java:7)
(3)解析
args表示命令行参数,这段代码要求参数为一个数字
栈信息
NumberFormatException类65行
Integer类492行
new NumberFormatException(...)是我们容易理解的,就是创建了一个类的对象,只是这个类是一个异常类
throw就是抛出异常,它会触发Java的异常处理机制。在之前的空指针异常中,我们没有看到throw的代码,可以认为throw是由Java虚拟机自己实现的。
throw VS return
return代表正常退出,throw代表异常退出,return的返回位置是确定的, 就是上一级调用者,而throw后执行哪行代码则经常是不确定的,由异常处理机制动态确定。
捕获"try/catch
(1)案例
public class ExceptionTest {
public static void main(String[] args) {
if(args.length<1){
System.out.println("请输入数字");
return;
}
try{
int num = Integer.parseInt(args[0]);
System.out.println(num);
}catch(NumberFormatException e){
System.err.println("参数"+args[0]
+"不是有效的数字,请输入数字");
}
}
}
(2)分析
我们使用try/catch捕获并处理了异常,try后面的大括号{}内包含可能抛出异常的代码,括号后的catch语句包含能捕获的异常和处理代码,catch后面括号内是异常信息,包括异常类型和变量名,这里是NumberFormatException e,通过它可以获取更多异常信息,大括号{}内是处理代码,这里输出了一个更为友好的提示信息
捕获异常后,程序就不会异常退出了,但try语句内异常点之后的其他代码就不会执行了,执行完catch内的语句后,程序会继续执行catch大括号外的代码。