java学习(二)--异常的处理方法

在编程过程中,经常会用到try catch,就我个人的感觉而言,try catch其实并不对程序的逻辑产生什么影响。主要是通过捕获异常,来快速找到错误出现的位置,确定错误类型,同时保证程序不会崩掉。比如画面跳转后出现的一堆红色的错误信息等等,会让用户产生强烈的不适感。并且由于客户没有编程经验,也不会理解这些信息代表的意思。而用try catch就可以避免这种现象的产生。

try catch最核心的作用的就是编写程序时,预知可能出现的错误,并且给出相应的提示信息。比如提醒用户输入错误之类的信息。这样就比显示一大堆错误信息更有价值。

所以,归结起来,try catch至少有两个好处

1.避免程序崩掉,给用户制造麻烦

2.可以跟踪到异常发生的位置,方便程序员排查原因。

下面是通过视频学习,整理的几个例子。

package knowledge;

public class ExceptionDemo {

	/**
	 * 两个整数相除
	 * 当被除数是0时,将出现异常
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static int diviFun1(int num1, int num2) {

		int result = 99;

		try {
			System.out.println("执行前");
			result = num1 / num2;
			System.out.println("执行后");
		} catch (Exception e) {
			System.err.println("打印异常信息前");
			e.printStackTrace();

			// 如果异常被捕获住,则后续的程序仍将继续执行
			// 如果没被捕获,则产生异常并且后续程序不再执行
			System.out.println("打印异常信息后");
		} finally {
			// finally不论在有无异常的情况下,都会执行的语句
			System.out.println("不论在有无异常,都会执行finally");
		}
		System.out.println("结果是" + result);
		return result;

	}

	/**
	 * 两个字符型整数相除
	 *
	 * @param strNum1
	 * @param StrNum2
	 * @return
	 */
	public static int divFun3(String strNum1, String StrNum2) throws Exception {
		int num1 = Integer.parseInt(strNum1);
		int num2 = Integer.parseInt(StrNum2);
		int result = num1 / num2;
		System.out.println("结果是" + result);
		return result;
	}

	/**
	 * 两个字符型整数相除
	 * ArithmeticException 除法异常
	 * NumberFormatException 数据类型转换异常
	 * @param strNum1
	 * @param StrNum2
	 * @return
	 */
	public static int divFun4(String strNum1, String StrNum2) throws ArithmeticException, NumberFormatException {
		int num1 = Integer.parseInt(strNum1);
		int num2 = Integer.parseInt(StrNum2);
		int result = num1 / num2;
		System.out.println("结果是" + result);
		return result;
	}

	public static void main(String[] args) {

		// 例子1 有异常产生
		System.out.println("======================例子1=======================");
		int result1 = diviFun1(5, 0);

		// 例子2 无异常产生
		System.out.println("======================例子2=======================");
		int result2 = diviFun1(15, 5);

		// 例子3 两个字符型整数相除
		// 谁调用谁处理异常
		System.out.println("======================例子3=======================");
		try {
			int result3 = divFun3("15", "");
		} catch (Exception e) {

			e.printStackTrace();
		}

		// 例子4 抛出两个具体异常
		// 谁调用谁处理异常
		System.out.println("======================例子4=======================");
		try {
			int result4 = divFun4("15", "abc");
		} catch (ArithmeticException | NumberFormatException e) {
			e.printStackTrace();
		}

	}

}

执行结果

======================例子1=======================
执行前
打印异常信息前
java.lang.ArithmeticException: / by zero
	at knowledge.ExceptionDemo.diviFun1(ExceptionDemo.java:18)
	at knowledge.ExceptionDemo.main(ExceptionDemo.java:71)
打印异常信息后
不论在有无异常,都会执行finally
结果是99
======================例子2=======================
执行前
执行后
不论在有无异常,都会执行finally
结果是3
======================例子3=======================
java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at knowledge.ExceptionDemo.divFun3(ExceptionDemo.java:45)
	at knowledge.ExceptionDemo.main(ExceptionDemo.java:81)
======================例子4=======================
java.lang.NumberFormatException: For input string: "abc"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at knowledge.ExceptionDemo.divFun4(ExceptionDemo.java:61)
	at knowledge.ExceptionDemo.main(ExceptionDemo.java:91)

最后总结几点

1.尽量不要在main方法后抛出异常

例 public static void main(String[] args) throws Exceptions

2.谁调用谁处理异常

尽量不要把try catch块写在子方法中,而应写在调用的地方。

3.catch块的内容

如果异常被捕获住,则后续的程序仍将继续执行
如果没被捕获,则产生异常并且后续程序不再执行

4.finally中的语句不论在有无异常的情况下,都会执行的语句

通常用来释放空间等,如关闭数据库连接等。

常见的几个异常类

1.ArithmeticExecption 数学异常。如果除数为0时,就会出现该异常。

2.IOException 操作输入流和输出流时出现的异常。

3.NullPointerException 空指针异常。引用变量为null时,就会出现该异常。

4.ClassCastException 类型转换异常。

5.ArrayIndexOutOfBoundsException 数组越界异常。

6.NegativeArrayException 数组负下标异常。

7.SecturityException 安全异常。

8.EOFException 文件已结束异常。

9.FileNotFoundException 文件未找到异常。

10.NumberFormatException 字符串转为数字异常。

11.SQLException 数据库操作异常。

12.NoSuchMethodException 方法未找到异常。

13.SystemException 系统异常。

14.UnsupportedOperationException 不支持操作异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值