Java学习——异常
每日好句
所谓的法,公道,正义,如果不一视同仁,那正义和法律还有什么意义呢?年轻人没有一些略显狂妄的理想,又怎么算得上是年轻人呢?我相信事在人为。只要我努力,未必不能实现!”
异常
什么是异常(Exception)?
Java代码在运行时期发生的问题就是异常;
在Java中,把异常信息封装成了一个类(Exception);
异常分类:
-
Throwable
Throwable类是Java中所有错误或异常的超类,即祖宗类;- 常用方法
- String getMessage() 返回此 throwable 的详细消息字符串
- String toString() 返回此 throwable 的简短描述
- void printStackTrace() 打印异常的堆栈的跟踪信息
-
Exception
Exception类及其子类是Throwable的一种形式,用于表示Java程序中可能会产生的异常,并要求对产生的异常进行合理的异常处理;-
Exception异常又主要分为两种:
一种是派生于RuntimeException异常;- RuntimeException
RuntimeException类是Exception的子类(又称为非受检异常);
RuntimeException类及其子类只能在Java程序运行过程中出现(运行时异常);- 通常有以下几种情况:
- 错误的类型转换
- 访问的null指针
- 数组访问越界
- 算数异常
注意:RuntimeException异常,一般都是代码逻辑出现问题;
一种是除RuntimeException体系之外的其他异常;
- checkedException
checkedException类是Exception的子类(又称为受检异常);
checkedException类在Java程序还未开始运行时出现(非运行时异常);- 通常有以下几种情况:
- 打开一个不存在的文件
- 没有找到具有指定名称的类
- 操作文件异常
- RuntimeException
-
受检异常是编译器要求必须处理的异常,必须使用 try catch 处理,或者使用 throws 抛出,交给上层调用者处理;
- Error
Error类是Throwable的一种形式,与Exception平级,用于表示系统内部错误,这类错误由系统进行处理;
异常处理:
-
JVM默认处理方式
如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行并且还终止了程序,异常后面的代码将不在执行; -
try…catch处理方式
捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理捕获异常; -
语法格式:
try { //需要被检测的语句。 } catch(异常类 变量) { //参数。 //异常的处理语句。 } finally { //一定会被执行的语句。 } try:该代码块中编写可能产生异常的代码。 catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。 注意: try 语句块是必不可少的,catch 和 finally 语句块可以根据情况选择其一或者全选。 你可以把可能发生错误或出现问题的语句放到 try 语句块中,将异常发生后要执行的语句放到 catch 语句块中,而 finally 语句块里面放置的语句,不管异常是否发生,它们都会被执行。
-
throw处理方式
-
语法格式:
throw new 异常类();//产生异常,直接捕获处理
-
-
throws处理方式
当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁处理异常,使用关键字throws在方法的声明出抛出异常;-
语法格式:
权限修饰符 返回值类型 方法名(形参列表) throws 异常类型1,异常类型2….{ //代码体 }
-
-
多异常处理方式
对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。-
语法格式:
try{ throw new Exception();//产生异常,直接捕获处理 } catch(XxxException e){ //处理方式 }catch(YyyException e){ //处理方式 }catch(ZzzException e){ //处理方式 }
-
throws与throw的区别
- 作用不同:
throw用于在程序中抛出异常;
throws用于声明在该方法内抛出了异常; - 使用位置不同:
throw位于方法体内部,用于单独语句使用;
throws需要跟在方法参数列表后面,不能单独使用; - 内容不同:
throw抛出一个异常对象,且只能有一个throws后面跟异常类,且可以跟多个异常类;
异常练习
需求:写一个方法,接受考试成绩,如果考试成绩的范围在0-100之间则属于正常,否则属于异常,当成绩不在0~100范围内,抛出一个运行时异常或者编译时异常,阻止程序继续向下执行
代码:
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入5个考试成绩");
System.out.println();
for(int i=1;i<10;i++){
System.out.print("请输入第"+i+"个考试成绩:");
int a=scanner.nextInt();
ass(a);
if (i==5){
System.exit(0);
}
}
// try {
// ass(a.txt);
// } catch (Exception e) {
// e.printStackTrace();
// }
}
public static void ass(int b) throws Exception {
if (b>=0&&b<=100){
System.out.println("考试成绩符合要求:"+b);
}else {
throw new Exception();
}
// System.out.println("考试成绩不符合要求");
}
}
- 鄙人拙作/拙笔,有不当之处,还请指教。