:异常处理

Posted 二十的十七

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:异常处理相关的知识,希望对你有一定的参考价值。

第五章:异常处理知识梳理

本章内容分为:异常处理概述、try-catch处理异常、throw和throws、自定义异常。

5.1异常处理概述

问题:为什么要异常处理???
编程中我们常说没有完美的代码,几乎每个应用程序都有这样或那样的小问题,异常并不可怕,只要在编程中预先考虑到可能出现问题的代码,然后加以处理就可以避免异常。

那么程序中如果遇到了异常会怎么样呢?会直接终止程序的运行,下面我们就来看看程序中的异常:

package com.exception;

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
        String str=null;
        str.toString();
	




这里出现了一个空指针的异常(nullpointerexception)。

问题:如果中间出现了异常,后面是否还会正常执行?请看下面代码:

package com.exception;

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		System.out.println("第1步");
		System.out.println("第2步");
        String str=null;
        str.toString();
		System.out.println("第3步");
		System.out.println("第4步");
	




如上代码可知答案:如果中间出现了异常,后面将无法执行。

问题来了,那我们怎么样来处理让它不崩溃呢?所以要进行我们的异常处理,当然在程序运行过程中会出现很多种不同异常,比如说我们的nullpointerexception就是空指针异常,还有下标越界异常。

package com.exception;

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		String[]strs= "11","22";
		System.out.println(strs[2]);
	




注释:arrayindexoutofboundsexception是数组的下标越界异常。

还有一种算数异常:

package com.exception;

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		System.out.println(5/0);
	



注释:arithmeticexception是算数的异常。

对5.1进行一个小节:一旦出现了运行时异常,程序将终止运行,所以我们就必须要对这种可能出现异常代码进行一个异常捕获处理。

5.2try-catch异常处理
在Java中最顶级的异常处理叫THROWABLE,它下面又分为ERROR异常(一般指系统或硬件级别的异常,我们的Java程序不能处理)和EXCEPTION异常。

(1) 在Java中完成异常的处理一般有两种方式:一种是try catch finally三个关键字,另一种是throw和throws。

下面我们先来看看TRY CATCH FINALLY的使用:

第一个案例:

package com.exception;

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		System.out.println("第1步");
		System.out.println("第2步");
		try 
			System.out.println(5/0);
		 catch (Exception e) 
		e.printStackTrace();
		
        
		System.out.println("第3步");
		System.out.println("第4步");
	



第二个案例:

package com.exception;

import java.util.Scanner;

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		try 
			Scanner sc=new Scanner(System.in);
			System.out.println("请输入一个整数:");
			int num=sc.nextInt();
			System.out.println("您输入的数字是:"+num);
			
		 catch (Exception e) 
			//记录日志,进行提示等
			System.out.println("您输入的数据和接收的不一致");
			e.printStackTrace();
		
	




注释:inputmismatchexception是输入的不匹配异常。当然我们这里用的exception是所有异常的一个父类,它的范围是最大的,我们也可以把它改成对应的类型。

第三个案例:

package com.exception;

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

public class Mytest1 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
		try 
			Scanner sc=new Scanner(System.in);
			System.out.println("请输入第一个整数:");
			int num1=sc.nextInt();
			System.out.println("请输入第二个整数:");
			int num2=sc.nextInt();
			System.out.println("计算除法的结果是:"+(num1/num2));
			
		 catch (InputMismatchException e) 
			//记录日志,进行提示等
			System.out.println("您输入的数据不合法");
			e.printStackTrace();
		catch (ArithmeticException e) 
			System.out.println("输入的除数为0");
			e.printStackTrace();
		catch (Exception e) 
			System.out.println("出现了未知异常");
			e.printStackTrace();
		
	




总结:catch块可以有多个,但是范围小的一定要放在前面,范围大的一定要放在后面,并且在catch后我们还可以加入另外一个特殊的模块,我们叫它为finally,finally是什么意思呢?就是说不管你有没有出现异常,它总会执行finally的代码。

5.3 throw和throws及自定义异常

package com.exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Mytest2 
public static void readFile() throws ClassNotFoundException,FileNotFoundException
	Class.forName("com.exception.Mytest2");
	FileInputStream fis=new FileInputStream("C://file.txt");

	public static void main(String[] args) 
		// TODO Auto-generated method stub
        try 
			readFile();
		 catch (ClassNotFoundException e) 
			e.printStackTrace();
		 catch (FileNotFoundException e) 
			e.printStackTrace();
		
	



笔记:throws用在声明方法的时候,告诉别人该方法有可能出现的异常,我没有处理,你调用的时候来处理。

现在我们来看另外一个关键字throw,throw就是抛出一个具体的异常,下面我们来模拟一个场景:

package com.exception;

public class UserInfo 
private String name;
private int age;
public String getName() 
	return name;

public void setName(String name) 
	this.name = name;

public int getAge() 
	return age;

public void setAge(int age) throws Exception
	if (age<18||age>60) 
		//使用throw抛出异常
		throw new Exception("用户的年龄只能是18到60岁之间");
	
	this.age = age;


package com.exception;

public class Mytest3 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
        UserInfo user=new UserInfo();
        user.setName("张三");
        try 
			user.setAge(1);
		 catch (Exception e) 
			// TODO Auto-generated catch block
			e.printStackTrace();
		
	




下面来讲自定义异常,以下是自定义异常的一个案例:

package com.exception;
//自定义的年龄不合理异常类
public class AgeErrorException extends Exception
public AgeErrorException(String message) 
	super(message);


package com.exception;

public class UserInfo 
private String name;
private int age;

	public String getName() 
	return name;


public void setName(String name) 
	this.name = name;


public int getAge() 
	return age;


public void setAge(int age) throws AgeErrorException
	if (age<18||age>60) 
		throw new AgeErrorException("用户的年龄只能是18到60岁之间");
	
	this.age = age;


	public static void main(String[] args) 
		// TODO Auto-generated method stub
        UserInfo user=new UserInfo();
        user.setName("张三");
        try 
			user.setAge(12);
		 catch (AgeErrorException e) 
			// TODO Auto-generated catch block
			e.printStackTrace();
		
	





总结:自定义异常是EXCEPTION异常的子类,所以必须要继承exception异常才行。

本章内容小节:throw和throws是另一种异常处理的方式,主要是将异常抛出由调用者来完成异常的处理,抛出异常一般和自定义异常配合的较多,以上就是关于Java异常处理的内容。

以上是关于:异常处理的主要内容,如果未能解决你的问题,请参考以下文章

java异常处理详解!!

Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

异常处理,约束,MD5加密,日志处理

PHP异常处理

Java的异常处理语法