package cn.jbit.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * 测试类
 * 
 * @author kyaccp
 * 
 */
public class Test {
	/**
	 * 程序入口
	 * 
	 * @param args
	 *            输入参数
	 */
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		try { // 捕获 异常
			System.out.print("请输入课程代号(1~3之间的数字):");
			int num = input.nextInt(); // 课程编号
			switch (num) {
			case 1:
				System.out.println("C#编程");
				break;
			case 2:
				System.out.println("Java编程");
				break;
			case 3:
				System.out.println("SQL基础");
				break;
			default:
				System.out.println("请输入(1~3之间的数字!)");
			}
			// 异常处理
		} catch (InputMismatchException e) {
			System.err.println("输入的数字必须是整数。");
			e.printStackTrace();
		} catch (Exception e) {
			System.err.println("程序正在缓冲,请稍等!");
		} finally {
			System.out.println("谢谢查询!");
		}
	}

}

 

效果图:


 

 

package cn.jbit.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

import org.apache.log4j.Logger;

/**
 * 测试类
 * 
 * @author chaoyi
 * @2013-10-25
 */
public class ArithmeticTest {
	/**
	 * 实例化控件类
	 */
	static Logger logger = Logger.getLogger(ArithmeticTest.class.getName());

	/**
	 * 程序入口
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		try { // 捕获异常
			System.out.print("请输入被除数:");
			int num1 = input.nextInt();
			logger.debug("请输入被除数:" + num1);
			System.out.print("请输入除数:");
			int num2 = input.nextInt();
			logger.debug("请输入除数:" + num2);
			System.out.println(String.format("%d/%d=%d", num1, num2, num1
					/ num2));
			logger.debug(String.format("输出运算结果是:%d/%d=%d", num1, num2, num1
					/ num2));

			// return; //finnally语句仍旧会执行

			// 处理异常
		} catch (InputMismatchException e) {
			logger.error("出现错误:被除数和除数必须是整数。", e);

		} catch (ArithmeticException e) {
			logger.error("出现错误:除数不能为零。", e);

		} catch (Exception e) {
			logger.error(e.getMessage());
			// return; //finnally语句仍旧会执行

		} finally {
			System.out.println("感谢使用本程序!");
		}
	}
}

 

效果图:

 

 



Java的异常处理是通过五个关键字来实现的:try、catch、finally、throw和throws,下面将依次学习。



 



try-catch块



try-catch-finally块



多重catch块



声明异常——throws



抛出异常——throw



 



常用的异常类型



异常

说明

Exception

异常层次结构的根类

ArithmeticException

算术错误情形,如以零作除数

ArrayIndexOutOfBoundsException

数组下标越界

NullPointerException

尝试访问null对象成员

ClassNotFoundException

不能加载所需的类

InputMismatchException

欲得到的数据类型与实际输入的类型不匹配

IllegalArgumentException

方法接收到非法参数 

ClassCastException

对象强制类型转换出错

NumberFormatException

数字格式转换异常,如把“abc”转换成数字



throw和throws的区别表现在以下三个方面。


作用不同:throw用于程序员自行产生并抛出异常,throws用于声明在该方法内抛出了异常。

使用的位置不同:throw位于方法体内部,可以作为单独语句使用。throws必须跟在方法参数列表的后面,不能单独使用。

内容不同:throw抛出一个异常对象,而且只能是一个。throws后面跟异常类,而且可以跟多个异常类。  

Throwable类:所有异常类型都是Trowable类的子类,它派生两个子类:Error和Exception。

Error类:表示仅靠程序本身无法恢复的严重错误,比如说内存溢出动态链接失败,虚拟机错误。应用程序不应该抛出这种 类型的对象(一般是由虚拟机抛出)。假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以在进行 程序设计,应该更关注Exception类。

Exception类:由Java应用程序抛出和处理的非严重错误,比如所需文件找不到、网络连接不通或中断、算术运算错误(如 被零除)、数组下标越界、装载了一个不存在的类、对null对象操作、类型转换异常等。它的各种不同的子类分别对应不同类型 的异常。

运行时异常:包括RuntimeException及其所有子类。不要求程序必须对它们做出处理。

Checked异常(非运行时异常):除了运行时异常外的其他由Exception继承来的异常类。程序类必须捕获或者声明抛出这 种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:通过try-catch在当前位置捕获并处理异常,通过throws声 明抛出异常交给上一级调用方法处理。 

异常是由Java应用程序抛出和处理的非严重错误,它可以分为Checked异常和运行时异常两大类。 

Checked异常必须捕获或者声明抛出,否则无法通过编译。运行时异常不要求必须捕获或者声明抛出。

Java的异常处理是通过五个关键词来实现的:try、catch、finally、throw和throws。

即使在try块、catch块存在return语句,finally块中语句也会执行。finally块中语句不执行的唯一情况是:在异常处理 代码中执行System.exit(1)。

可以在一个try语句块后面跟多个catch语句块,分别处理不同的异常。但排列顺序必须是从特殊到一般,最后一个一般都 是Exception类。

log4j是一个优秀的日志记录工具。常用使用方式是配置log4j.properties文件,从而控制日志的输出级别,控制日志的目 的地和控制日志输出格式。