java——简介异常处理的基本内容

人无完人,金无足赤。在这个世界上没有用完美的人,当然,也没有完美的的程序,但我们的追求都是做一个完美不被别人诟病的人,程序也是如此,尽力做到完美,这样才会有人用,被别人夸赞。
我们所谓的异常,并不是编写代码中出现的语法错误导致程序不能正常运行的情况,异常是软件在编译或者运行过程中,因为一些原因如:BUG、用户使用不当、代码处理不当,所引起的程序奔溃的现象。这些现象会影响代码的健壮性,处理异常后,提升代码的健壮性和稳定性,提升代码的容错能力。
在我们编写的程序当中,不免会有各种各样的异常。比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足。为了解决这些异常,我们需要知道异常发生的原因。对于一些常见的异常,我们还可以提供一定的应对预案。C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决定的。程序员需要查询大量的资料,才可能找到原因。
异常
Java的异常处理机制很大一部分来自C++。它允许程序员跳过暂时无法处理的问题,以继续后续的开发,或者让程序根据异常做出更加聪明的处理。
在遇到异常时,java会用一些特殊的对象来代表异常的状况,这些对象被称为异常对象。
比如:

package com.gaga;

import java.util.Scanner;

public class YiChang {

		public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
			System.out.print("请输入第一个数:");
			int num = sc.nextInt();
			System.out.print("请输入第二个数:");
			int num1 = sc.nextInt();
			divide(num,num1);
		}

		private static void divide(int num, int num1) {
			int result = 0;
			result = num / num1;
			System.out.println(num + " ÷ " + num1 + " = " + result);
		}
}

运行结果:
在这里插入图片描述

当异常状况发生时,Java会根据预先的设定,抛出代表当前状况的对象。如上图所示跑出的异常为:ArithmeticException
处理异常
目的是可以让后面的代码继续正常运行,提高代码的健壮性和稳定性。
方法1::抓捕异常
尝试着将有可能存在异常的代码或者代码段进行抓捕,如果触发异常,则处理掉这些异常。
在抓捕异常时,一般使用异常处理器进行捕捉,异常处理器可以捕捉(catch)的异常对象,并根据对象来决定下一步的行动。
异常处理器是由try, catch, finally以及随后的程序块组成。finally不是必须的。

try语句块
		try {
			// 可能存在了异常的代码
		} catch() { 
			// 在这儿处理这个异常!!!
		} catch() {
			// 在这儿处理这个异常!!!
		}
		finally{
		...
		 }

这个异常处理器监视try后面的程序块。catch的括号有一个参数,代表所要捕捉的异常的类型。catch会捕捉相应的类型及其衍生类。try后面的程序块包含了针对该异常类型所要进行的操作。try所监视的程序块可能抛出不止一种类型的异常,所以一个异常处理器可以有多个catch模块。finally后面的程序块是无论是否发生异常,都要执行的程序。
我们在try中放入可能出错,需要监视的程序,在catch中设计应对异常的方案。
异常对象的两个方法:

e.printStackTrace();	// 打印异常信息的执行栈
			e.getMessage();		// 得到异常信息

如上图,演示了出现异常的情况,现在就以上面的为例子,进行异常处理:

package com.openlab.genren;

import java.util.Scanner;
public class TestException {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("请输入第一个数:");
		
			
		int num = sc.nextInt();
		System.out.print("请输入第二个数:");
		int num1 = sc.nextInt();
		divide(num,num1);
	}

	private static void divide(int num, int num1) {
		int result = 0;
		try {
		result = num / num1;
		}catch(ArithmeticException e){ 
			//帮助查询异常
//			e.printStackTrace();
			//得到异常信息
			//提示简单信息
			System.out.println(e.getMessage());
			System.out.println("异常!我需要处理!");
		}catch(Exception e){ 
			//使用异常将其他异常一网打尽
			System.out.println("其他异常!");
		}
		System.out.println(num + " ÷ " + num1 + " = " + result);
	}
	}

运行结果:
在这里插入图片描述

异常类型
Java中的异常类都继承自Trowable类。一个Throwable类的对象都可以抛出(throw)。

Throwable对象可以分为两组。一组是unchecked异常,异常处理机制往往不用于这组异常,包括:
Error类通常是指Java的内部错误以及如资源耗尽的错误。当Error(及其衍生类)发生时,我们不能在编程层面上解决Error,所以应该直接退出程序。
Exception类有特殊的一个衍生类RuntimeException。RuntimeException(及其衍生类)是Java程序自身造成的,也就是说,由于程序员在编程时犯错。RuntimeException完全可以通过修正Java程序避免。比如将一个类型的对象转换成没有继承关系的另一个类型,即ClassCastException。这类异常应该并且可以避免。
剩下的是checked异常。这些类是由编程与环境互动造成程序在运行时出错。比如读取文件时,由于文件本身有错误,发生IOException。再比如网络服务器临时更改URL指向,造成MalformedURLException。文件系统和网络服务器是在Java环境之外的,并不是程序员所能控制的。如果程序员可以预期异常,可以利用异常处理机制来制定应对预案。比如文件出问题时,提醒系统管理员。再比如在网络服务器出现问题时,提醒用户,并等待网络服务器恢复。异常处理机制主要是用于处理这样的异常。
抛出异常

throw
throw是语句抛出一个异常,一般是在代码的内部,当程序出现某种逻辑错误时同程序主动抛出某种特定类型的异常。

public static void main(String[] args) {
	String str = "NBA";
	if (str.equals("NBA")) {
		throw new NumberFormatException();
	} else {
		System.out.println(str);
	}
}

运行结果:系统会抛出NumberFormatException异常:

Exception in thread "main" java.lang.NumberFormatException
	at io.renren.modules.sys.controller.SysUserController.main(SysUserController.java:154)

throws
throws是方法可能会抛出一个异常(用在声明方法时,表示该方法可能要抛出异常)
public void function() throws Exception{…}
当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。

public static void testThrows() throws NumberFormatException {
	String str = "NBA";
	System.out.println(Integer.parseInt(str));
}

public static void main(String[] args) {
	try {
		testThrows();
	} catch (NumberFormatException e) {
		e.printStackTrace();
		System.out.println("非数直类型不能强制类型转换");
	}
}

运行结果:

java.lang.NumberFormatException: For input string: "NBA"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at io.renren.modules.sys.controller.SysUserController.testThrows(SysUserController.java:153)
	at io.renren.modules.sys.controller.SysUserController.main(SysUserController.java:158)
非数直类型不能强制类型转换

throw与throws之间的比较
1、throws出现在方法函数头,而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值