(一)异常
异常分类
(1)运行时异常:在运行期间可能会出现异常,也就是代码不爆红,可以不捕获。程序员可通过特定的手段进行规避。
(2)检查时异常:在编译期,需要强制进行检查的异常。代码运行前爆红。
常见异常
Java 中的异常在 Java 程序中是以类的形式体现的,在 java 中每个包下都有专门的异常类;
(1)java.lang.NullPointerException:空指针异常
(2)java.lang.ArrayIndexOutOfBoundsException:数组下标越界
(3)java.util.InputMismatchException:接收非法输入异常
(4)java.lang.ClassCastException:类型转换异常
(5)java.lang.ArithmeticException:算术异常
(6)java.lang.NumberFormatException:数字格式化异常
(7)java.io.IOException:IO 异常(输入输出异常)
(8)java.sql.SQLException:SQL 异常(数据库异常)
(9)java.lang.ClassNotFoundException:类找不到异常
(10)java.io.FileNotFoundException:文件找不到异常
(11)IllegalAccessException
(12)ClassNotFoundException
(13)NoSuchMethodException, InvocationTargetException, InstantiationException
(14)java.lang.StackOverflowError:栈溢出异常:至少有两个类的情况下,一个类创建另一个类的对象,另一个类也创建这个类的对象,就导致两个类不断的创建对方的对象,直到堆栈溢出
(15)EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常
(16)报错信息:ava.lang.NumberFormatException: For input string: "" ava.lang.NumberFormatException: For input string: "" 意思是 Java 程序在尝试将空字符串转换为数字时抛出异常。这通常是因为程序试图将字符串转换为整数或浮点数时,字符串中不包含有效数字。例如,如果你有一个字符串 "abc" 并尝试将其转换为整数,就会抛出该异常,因为字符串 "abc" 中不包含有效数字。你可以通过使用 try-catch 语句来处理这个异常,或者在调用转换函数之前检查字符串是否为空或者是否包含有效数字,以避免出现该异常。
解决办法
在出现异常的时候,捕获异常,并对异常进行处理,以对程序进行补救或挽回措施。让程序继续执行
try\catch\finally
try:建议只放可能出现异常的代码,放太多影响性能。
catch::捕获某种异常,匹配某种类型的异常,每个catch分支可以捕获一个(或多个)异常
输出异常信息:e.printStackTrace();//打印异常堆栈
finally:表示最终要执行的操作,无论是否出现异常都要执行的操作。
catch和finally可以没有,但不同时没有
throw\throws
throws:抛出异常,表示告知方法的调用者,此方法可能会出现某种类型的异常,自己处理不了将异常往上抛,上级处理不了再由此该上级抛给它的上级,直到抛给main函数,main函数再处理不了,只能抛给虚拟机,虚拟机直接打印异常并中断程序。
throw:手动创建异常对象,并触发异常
throws和throw的功能有什么不同
①throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先得处理方式。throw抛出具体的问题对象,执行到throw。功能就已经结束了跳转到调用者,并将具体的问题对象抛给调用者,也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。
②throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
finally和return
public static void main(String[] args){
System.*out*.println(*test*());//返回2
}
public static int test(){
int ret = 0;
try{
return ret;
}finally{
return 2;
}
}
public static int test(){//返回0
int ret = 0;
try{
return ret;
}finally{
ret = 2;
}
}
public static int test(){//返回2
int ret = 0;
try{
int a = 5/0;
return ret;
}finally{
return 2;
}
}
//finally中不仅return语句会掩盖异常,如果finally中抛出了异常,则原异常就会被掩盖,看下面代码:
public static void test(){
try{
int a = 5/0;
}finally{
throw new RuntimeException("hello");
}
}
//finally中抛出了RuntimeException,则原异常ArithmeticException就丢失了。
所以,一般而言,为避免混淆,应该避免在finally中使用return语句或者抛出异常,如果调用的其他代码可能抛出异常,则应该捕获异常并进行处理。
关于try、catch、finally中的return:
情况1: try{} catch(){}finally{} return; 显然程序按顺序执行。
情况2: try{ return; }catch(){} finally{} return;
先执行try块中return 语句(包括return语句中的表达式运算),但不返回; 执行finally语句中全部代码 最后执行try中return 返回 finally块之后的语句return不执行,因为程序在try中已经return。 情况3: try{ } catch(){return;} finally{} return; 1、程序先执行try,如果遇到异常执行catch块,
有异常: 执行catch中return语句,但不返回 执行finally语句中全部代码, 最后执行catch块中return返回。 finally块后的return语句不再执行。 无异常:执行完try再finally再return… 情况4: try{ return; }catch(){} finally{return;}
执行try块return语句(包括return语句中的表达式运算),但不返回; 再执行finally块, 执行finally块,有return,从这里返回。 此时finally块的return值,就是代码执行完后的值
情况5: try{} catch(){return;}finally{return;}
程序执行catch块中return语句(包括return语句中的表达式运算),但不返回; 再执行finally块, 执行finally块,有return,从这里返回。 情况6: try{ return;}catch(){return;} finally{return;} 1、程序执行try块中return语句(包括return语句中的表达式运算),但不返回;
有异常:
执行catch块中return语句(包括return语句中的表达式运算),但不返回; 再执行finally块 执行finally块,有return,从这里返回。 无异常:
再执行finally块
执行finally块,有return,从这里返回。。