动手动脑-异常处理
课后作业01-动手动脑
1、请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识
结果截图:
异常处理:Try{ //可能发生运行错误的代码;}
catch(异常类型 异常对象引用){ //用于处理异常的代码;}
finally{ //用于“善后” 的代码;}
(1)把可能会发生错误的代码放进try语句块中。
(2)当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。
(3)catch语句块中的代码用于处理错误。
(4)当异常发生时,程序控制流程由try语句块跳转到catch语句块。
(5)不管是否有异常发生,finally语句块中的语句始终保证被执行。
如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。
2、阅读以下代码(CatchWho.java),写出程序运行结果:
运行结果截图:
3、写出CatchWho2.java程序运行的结果:
运行结果截图:
4、辨析:finally语句块一定会执行吗?请通过 SystemExitAndFinally.java示例程序回答上述问题。
答:不一定;finally不一定执行,当try从句或者catch()从句中有System.exit()语句时,finally()不会被执行。如果finally块中的代码过多会导致字节码条数”膨胀”,因为finally中的字节码会被”复制”到try块和所有的catch块中。
5、依据对本讲多个示例程序的分析,请自行归纳总结出Java多层嵌套异常处理的基本流程。
一、Throwable类有两个直接子类:
1、Exception:出现的问题是可以被捕获的;
2、Error:系统错误,通常由JVM处理。
可捕获的异常又可以分为两类:
(1)check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象
当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。当有多层嵌套的finally时,异常在不同的层次抛出,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。
二、try-catch-finally相互嵌套时,先处理最内层的try-catch-finally。当try抛出了与catch匹配的异常,则代码到相应的catch()中执行。如果catch也出现了异常,程序会检测finally中是否有异常,若有,则覆盖。如果只有try-finally,那么先执行finally,如果finally没有异常,则返回处理try中的异常,如果finally有异常,则覆盖try中的异常
6、请看以下代码,它们完全符合Java语法规范,但事实是它们不能通过编译:为什么?
public class TestThrows {
public static void main(String[] args) {
FileInputStream fis = new
FileInputStream("a.txt");
}
}
答:程序本身没什么问题,但是main方法里面什么都没有写,没有输出任何结果。
课后作业02-编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。
import java.util.*;
class AException extends Exception
{
String a;
AException()
{
a="输入有误";
}
public String toString()
{
return a;
}
}
class A
{
public static void main(String args[])
{
while(1>0)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入考试成绩(0~100):");
try
{
String s = sc.nextLine();
getnum(s);
}
catch (AException e)
{
System.out.println(e.toString());
}
}
}
private static void getnum(String s) throws AException
{
for (int i = s.length()-1; i >= 0;i--)
{
int chr = s.charAt(i);
if (chr < 48 || chr > 57)
{
throw new AException();
}
}
double num = Double.parseDouble(s);
if (num < 0 || num> 100)
{
throw new AException();
}
if (num>= 0 && num<= 60)
{
System.out.print("不及格\n");
}
else if (num >= 60 && num <= 70)
{
System.out.print("及格\n");
}
else if (num>= 70 && num<= 80)
{
System.out.print("中\n");
}
else if (num >= 80 && num <= 90)
{
System.out.print("良\n");
}
else
{
System.out.print("优\n");
}
}
}
运行结果截图: