1、Java中实现异常处理的基础知识。
1)Java 中所有可捕获的异常都派生自 Exception 类。
2)把可能会发生错误的代码放进try语句块中。
3)当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。
4)catch语句块中的代码用于处理错误。
5)当异常发生时,程序控制流程由try语句块跳转到catch语句块。
6)不管是否有异常发生,finally语句块中的语句始终保证被执行。
7)如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。
Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。
可捕获的异常又可以分为两类:
(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:
throw new ArithmeticException(…);
2、阅读以下代码(CatchWho.java),写出程序运行结果:
程序代码:
public class CatchWho {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
}
throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("发生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
}
}
}
程序截图:
3、写出CatchWho2.java程序运行的结果
程序代码:
public class CatchWho2 {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArithmeticException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
}
throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("发生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
}
}
}
程序截图:
4、请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
程序代码:
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");
}
}
}
程序截图:
总结:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。
5、辨析:finally语句块一定会执行吗?
1)只有与 finally 相对应的 try 语句块得到执行的情况下finally 语句块才会执行。以上两种情况�都是在 try 语句块之前返回return或者抛出异常�所以 try 对应的 finally 语句块没有执行。
2)当一个线程在执行 try 语句块或者 catch 语句块时被打段interrupted或者被终killed与其相对应的 finally 语句块可能不会执行。还有更极端的情况就是在线程运行 try 语句块或者catch语句块时突然死机或者断电finally语句块肯定不会执行了。可能有人认为死机、断电这些理由有些强词夺理没有关系我们只是为了说明这个问题。
6、编写一个程序,此程序在运行时要求用户输入一个整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。
要求:程序必须具备足够的健壮性,不管用户输入什么样的内容,都不会崩溃。
程序代码:
package demo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class chengji {
public static void main(String[] args) {
BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入学生的成绩:");
while(true) {
try {
String str = b.readLine();
char ch;
for(int i = 0;i < str.length();i++){
ch = str.charAt(i);
if(!(ch >= '0' && ch <= '9'))
throw new MyException("输入的必须是数字,请重新输入");
}
int score = Integer.parseInt(str);
if(score > 100 || score < 0)
throw new MyException("输入超过规定范围,请输入0-100之间的整数");
if(score >= 90)
System.out.println("该成绩为优");
else if(score >= 80)
System.out.println("该成绩为良");
else if(score >= 70)
System.out.println("该成绩为中");
else if(score >= 60)
System.out.println("该成绩为及格");
else
System.out.println("该成绩为不及格");
break;
}catch(MyException e){
System.out.println(e);
}catch(IOException e){
System.out.println(e);
}
}
}
}
class MyException extends Exception {
public MyException(String s) {
super(s);
}
}
程序截图: