异常概述
在java中,在运行时可能出现的错误称为异常。异常是在程序执行期间发生的事件,它中断了正在执行的程序的正常指令。
例子:
运行的结果:
算法的异常
异常的抛出与捕捉
抛出异常
异常抛出后,如果不做任何的处理,程序就会被终止
在主方法中实现将不是数字形式的字符串转换为int类型,程序运行时会报错误异常提示
例子:
以上代码都会报错
捕捉异常
语法:
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
上面错误的修改 都是运用上面的语法
第一个例子:
public class Baulk {
public static void main(String[] args) {
try{int result =3/0;
System.out.println(result);}
catch(Exception e) {
e.printStackTrace();
}
System.out.println("program over");
}
}
第二个例子:
public class Baulk {//创建类Baulk
public static void main(String[] args) {//主方法
try {
String str ="lili";//定义字符串
System.out.println(str+"年龄是:");//输出提示信息
int age = Integer.parseInt("20L");//数据类型转换
System.out.println(age);//输出信息
}catch(NumberFormatException e) {
System.out.println("数字格式异常");
}catch(ArithmeticException e) {
System.out.println("算法异常");
}finally {
System.out.println("程序结束");
}
}}
try-catch语句块
public class Baulk {
public static void main(String[] args) {
try{String str ="lili";//定义字符串
System.out.println(str+"年龄是:");//输出提示信息
int age = Integer.parseInt("20L");//数据类型转换
System.out.println(age);//输出信息
System.out.println(result);}
catch(Exception e) {
e.printStackTrace();
}
System.out.println("program over");
}
}
应用try-catch语句块对可能出现的异常语句进行异常处理
出现异常的代码用try-catch进行理try语句块中的语句发生异常时,程序就会跳转到ca语句块中执行,执行完catch程代后,将继续执行catch语句块后的其他代码,而不执行try语句常语后面代码。此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
误区警示
有时为了编程简单会忽略 catch 语句后的代码,这样 try-catch 语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良好的编程习惯,最好在 catch 语句块中写入处理异常的代码。
finally语句块
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。但是,在以下4种特殊情况下,finally块不会被执行:
1:在finally语句块中发生了异常。
2:在前面的代码中使用了System.exit退出程序。
3:M程序所在的线程死亡。
4:关闭CPU。
java常见的异常类
在java中,提供了一些异常用来描述基础发生的异常
自定义异常
在程序中使用自定义异常类:
1、在创建自定义异常类
2、在方法中通过throw关键字抛出异常对象
3、如果在当前抛出异常的方法中处理异常,可以使用try—catch语句块捕捉并处理,否则在方法中声明处通过throws关键字指明要抛出给方法调用者异常,继续进行下一个操作
4、在出现异常的方法的调用者中捕获并处理异常
例子:如何创建自定义异常
例子:自定义异常的抛出与捕捉
public class Tran {//创建类
static int avg(int number1,int number2)throws MYException{//定义方法,抛出异常
if(number1<0||number2<0) {//判断方法参数是否满足指定条件
throw new MYException("不可以使用负数");//错误信息
}
if(number1>100||number2>100) {//判断方法中参数是否满足指定条件
throw new MYException("数值太大了");//错误信息
}
return(number1+number2)/2;//将参数的平均值返回
}
public static void main(String[] args) {//主方法
try {//try语句块处理可能出现异常的代码
int result=avg(52,156);//调用avg()方法
System.out.println(result);//将avg()方法的返回值输出
}catch(MYException e) {
System.out.println(e);//输出异常信息
}
}
}
在方法中抛出异常
使用throws关键字抛出异常
throws 关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可以使用逗号分隔
例子:指明异常起源于何处
使用throw关键字抛出异常
throw关键字通常用于方法体中,通常抛出用户自定义异常,并且抛出一个异常对象
通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指出要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句块
例子:创建自定义异常
例子:使用throw关键字捕捉自定义异常
运行时异常
java中提供了常见的RuntimeException异常,这些异常可通过try—catch语句捕获
种类 | 说明 | 种类 | 说明 |
NullPointerException | 空指针异常 | IllegaIArgumentException | 非参数异常 |
ArrayIndexOutOfBoundsException | 数组下标异常 | SecurityException | 安全性异常 |
ArithmeticException | 算术异常 | NegativeArraySizeException | 数组长度为负数异常 |
ArrayStoreException | 数组中包含不兼容的值抛出异常 |
异常的使用原则
Java 异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时。可遵循以下几条原则:
1· 在当前方法声明中使用try-catch语句捕获异常。
2·一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
3·如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。