java语言根据错误性质将运行错误分为两类:异常和错误
java语言认为那些可预料和不可预料的出错称为Throwable
API 中标准异常的顶级父类是Throwable
Throwable类中有两个子类Exception和Error
错误Error:
错误程序没法处理,例如内存泄漏;所有错误都是Error类的直接或间接子类。
包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。
这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理,程序本身无法捕获和处理。
异常Exception:
在程序运行时不正常的事件;如果程序员处理异常,程序可以继续执行;
所有异常都是Exception类的直接或间接子类。
为了保证程序的健壮性,Java要求必须对这些可能出现的异常进行捕获,并对其进行处理。
Exception分类:
- 运行期异常 = 非检查异常:
RuntimeException的子类;
这些异常在编译期不检测,程序中可以选择处理,也可以不处理
如果不处理运行时会中断,但是编译没问题
- 非运行期异常 = 检查异常:
其他的Exception子类
是必须进行处理的异常,如果不处理,将发生编译期错误
常见的运行期异常:
空指针异常:
NullPointerException
String str = null;
System.out.println(str.length());
注意如果String s="";调用s.length()不会发生空指针异常;因为“”不等于null
数组下标越界异常:
ArrayIndexOutOfBoundsException
int[] nums = new int[3];
System.out.println(nums[10]);
类转换异常:
ClassCastException
Object obj = new Object();
ExceptionTest e = (ExceptionTest)obj;
数字格式异常:
NumberFormatException
int num1 = Integer.parseInt("abc");
算数异常:
ArithmeticException
int res = 10/0;
System.out.println("结果:"+res);
处理异常try...catch...finally...
try{
[可能抛出异常的代码块];
}catch(异常类型1 变量名){
[处理异常的代码];
} catch(异常类型2 变量名){
[处理异常的代码];
}finally{
[不管什么情况,一定被执行的代码块];
}
try 不能单独使用,可以跟上 catch 或者是 finally;可以是 try 和 catch;或者 try 和 finally。
Throwable、Exception、RuntimeException可以同时使用,但是父子关系的,子类型方法前边。
catch可以使用多个,finally最多只有一个。
自定义异常:
一般自定义异常类中不写其他方法,只重载必要的构造方法
可以用throw抛出自定义异常对象,使用throws声明自定义异常类型
public class MyScoreException extends Exception {
//构造方法
public MyScoreException(String msg){
super(msg);
}
}
public class MyExceptionTest {
//方式2
public static void main(String[] args) throws MyScoreException{
Scanner input = new Scanner(System.in);
System.out.print("请输入成绩:");
int score = input.nextInt();
if(score<0 || score>100){
//抛出自定义异常
throw new MyScoreException("成绩必须是百分制");
//方式1
/*try{
throw new MyScoreException("成绩必须是百分制");
}catch(MyScoreException e){
e.printStackTrace();
System.out.println("捕获了异常");
}*/
}
System.out.println("您输入的成绩是:"+score);
}
}
本文深入解析Java中的异常处理机制,区分异常与错误的概念,详细阐述运行期异常与非运行期异常的区别,以及如何通过try...catch...finally...进行异常处理。同时,介绍了自定义异常的创建与使用。
277

被折叠的 条评论
为什么被折叠?



