1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。
Java中的异常捕获语句
Try{
//可能发生运行错误的代码;
}
catch(异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于“善后” 的代码
}
Java 中所有可捕获的异常都派生自 Exception 类,把可能会发生错误的代码放进try语句块中,当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误,catch语句块中的代码用于处理错误。当异常发生时,程序控制流程由try语句块跳转到catch语句块。不管是否有异常发生,finally语句块中的语句始终保证被执行。如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。
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");
}
运行结果:ArrayIndexOutOfBoundsException/内层try-catch
发生ArithmeticException
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");
}
}
}
运行结果:ArrayIndexOutOfBoundsException/外层try-catch
4.当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。
请先阅读 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")
}
}
}

无论是否抛出异常,也无论从什么地方return返回,finally语句块总是会执行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败,关闭操作永远是可以执行的),以便于释放已经产生的连接,释放资源。
5.辨析:finally语句块一定会执行吗?
请通过 SystemExitAndFinally.java示例程序回答上述问题
public class SystemExitAndFinally {
    
	public static void main(String[] args)
    {
        
		try{
            
			System.out.println("in main");
            
			throw new Exception("Exception is thrown in main");
            		//System.exit(0);
        
		}
        
		catch(Exception e)
	        {
            
			System.out.println(e.getMessage());
            
			System.exit(0);
        
		}
        
		finally
        
		{
            
			System.out.println("in finally");
        
		}
    
	}
}
  
finally语句不一定要执行。
6.如何跟踪异常的传播路径?请通过 PrintExpressionStack.java示例掌握上述内容。
public class PrintExceptionStack {
public static void main( String args[] )
{
   try {
      method1();
   }
   catch ( Exception e ) {
      System.err.println( e.getMessage() + "\n" );
      e.printStackTrace();
   }
}
public static void method1() throws Exception
{
   method2();
}
public static void method2() throws Exception
{
   method3();
}
public static void method3() throws Exception
{
   throw new Exception( "Exception thrown in method3" );
}
}
运行结果截图:
当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。
可使用printStackTrace 和 getMessage方法了解异常发生的情况:
printStackTrace:打印方法调用堆栈。
每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。
7.依据对本讲多个示例程序的分析,请自行归纳总结出Java多层嵌套异常处理的基本流程。
Java中异常分类:
Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。
可捕获的异常又可以分为两类:
(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:
throw new ArithmeticException(…);
try-catch-finally相互嵌套时,先处理最内层的try-catch-finally。当try抛出了与catch匹配的异常,则代码到相应的catch()中执行。如果catch也出现了异常,程序会检测finally中是否有异常,若有,则覆盖。如果只有try-finally,那么先执行finally,如果finally没有异常,则返回处理try中的异常,如果finally有异常,则覆盖try中的异常
8.编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。
要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。
代码
import java.util.Scanner;
class judgeException extends Exception
{
	public judgeException(String s){
	super(s);
	}
}
class judgeException2 extends Exception
{
	public judgeException2(String s){
	super(s);
	}
}
public class Student {
	public static void main(String[] args) {
		boolean p=true;
		while(p)  {
		System.out.println("请输入一个整数:");
		Scanner in=new Scanner(System.in);
		  String s=in.next();
		  try
			{
				for(int i=0;i<s.length();i++)
				{
				if((s.charAt(i)<48||s.charAt(i)>57))
				{
					throw new judgeException("输入的不是数字,请重新输入!");
				}
				}
				try{
					int m=Integer.parseInt(s);
					if(m<0||m>100)
					{
					throw new judgeException2("输入的分数错误,请重新输入!");
					 }
					if(m<60)
				   {
					System.out.println("不及格");
				    }
					else if(m>=60&&m<=69)
					{
						System.out.println("及格");
					}
					else if(m>=70&&m<=79)
					{
						System.out.println("中");
					}
					else if(m>=80&&m<=89)
					{
						System.out.println("良");
					}
					else if (m>=90&&m<=100)
					{
						System.out.println("优");
					}
				   }
					catch(judgeException2 e)
					{
						System.out.println(e.getMessage());
					}
				
			}
		catch (judgeException e)
		{
			System.out.println(e.getMessage());
		}	
		}
	}
}
	
截图:

 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号