10.14上课问题的讨论与思考
一、课堂小测
import java.util.Scanner; public class wrong { public static void main(String []args) { Scanner sc = new Scanner(System.in); int p=1; while(p>0) { System.out.println("请输入一个整数:"); int score = sc.nextInt(); if (score < 60&&score>0) { System.out.println("不合格"); } else if (score >= 60&&score<70) { System.out.println("合格"); } else if (score >= 70&&score<80) { System.out.println("中"); } else if (score < 90&&score>=80) { System.out.println("良"); } else if(score<=100) { System.out.println("优"); } else{ System.out.println("你输入的整数有误"); } System.out.println("是否继续输入(1/0)"); p=sc.nextInt(); } } }
我经过10多分钟写完程序之后,王建民老师又提出了让我们同桌互换电脑,想办法把对方的程序玩坏,结果我的程序被玩坏的运行结果如下:
通过运行可以看出,我用输入语句接受一个整数类型,程序可以完美运行,但当我输入一个字符类型时,程序开始报错。王建民老师指出这就是一个典型的异常,他今天要讲的如何进行异常处理。
二、JAVA异常处理基础
异常:发生于程序运行期间,表现出非法的运行状况。
异常处理的目的是根据实际情况提供不同错误应对的策略与手段,使程序运行更安全。
异常处理的主要用途就是精准提供错误信息。
三、动手动脑
运行以下代码:
import javax.swing.*; class AboutException { public static void main(String[] a) { int i=1, j=0, k; k=i/j; try { k = i/j; // Causes division-by-zero exception //throw new Exception("Hello.Exception!"); } catch ( ArithmeticException e) { System.out.println("被0除. "+ e.getMessage()); } catch (Exception e) { if (e instanceof ArithmeticException) System.out.println("被0除"); else { System.out.println(e.getMessage()); } } finally { JOptionPane.showConfirmDialog(null,"OK"); } } }
运行结果如下:
在这个程序里面0被整除了,这显然是不符合逻辑的,因此报错了
四、Java中的异常捕获语句
try{
//可能发生运行的错误;
}
catch (异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于“善后”的代码
}
使用java异常处理机制
- 把可能发生错误的代码放进try语句
- catch语句块中的代码用于处理错误
- 不管是否有异常发生,finally语句块中的语句始终保证被执行。
五、java中的异常分类
Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。
可捕获的异常又可以分为两类:
(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:
throw new ArithmeticException(…);
六、assert语句
assert语句又被称为断言,可以帮助我们在条件不满足程序运行的情况下直接返回错误, 而不必等待程序运行出现崩溃后再退出程序
在使用assert语句时,系统会先判断assert后面紧跟的语句是True还是False,如果是True,则继续往下执行语句,如果是False,则程序中断,调用默认的异常处理器,同时系统还会将assertFalse语句逗号后面的提示信息输出。
在默认情况下,assert功能是关闭的,可以在使用java启动jvm添加参数-ea打开它
七、Error——OOM Error
在Android应用中会经常出现OOM Error错误,这表示系统内存不足,这就涉及到了 catch OOM并手动释放内存
八、一个奇怪的现象
对于这种现象的产生,原因是浮点数规定除以0会出现Infinity,而整型没有此类型规定,所以jvm在执行两个代码时,会采取不同的处理策略,导致代码的运行结果不同
九、动手动脑
通过两个代码可以发现,先抛哪个,哪个就先执行
十 多个嵌套的try....catch...finallly
public class EmbededFinally { public static void main(String args[]) { int result; try { System.out.println("in Level 1"); try { System.out.println("in Level 2"); // result=100/0; //Level 2 try { System.out.println("in Level 3"); result=100/0; //Level 3 } catch (Exception e) { System.out.println("Level 3:" + e.getClass().toString()); } finally { System.out.println("In Level 3 finally"); } // result=100/0; //Level 2 } catch (Exception e) { System.out.println("Level 2:" + e.getClass().toString()); } finally { System.out.println("In Level 2 finally"); } // result = 100 / 0; //level 1 } catch (Exception e) { System.out.println("Level 1:" + e.getClass().toString()); } finally { System.out.println("In Level 1 finally"); } } }
通过运行可以发现,try代码块里面的代码都是按顺序执行的,当捕获完一个异常之后,catch语句里面的不再被执行,finally代码块语句会一直执行
十一、finally一定会被执行吗?
通过上面的运行可以看出,finally代码块里面的语句不一定输出,当try代码块里有了抛出语句,catch代码块和finally代码块里面的语句不会再输出