Java异常处理

  Java与C++异常对比说明    

        Java与C++相比都有异常处理机制,不过C++的异常处理只是表面上的,因为C++中允许对指针的操作,使得我们在使用指针时要格外的小心,指针的错误将给程序带来的是崩溃性的错误,并且在不出现语法错误的时候,(对空指针操作  int* p=NULL; *p=123;只是定义了一下,但在之后又调用这个指针p)c++并不能检查到这种错误,但是程序却崩溃了,这就显得很荒唐,此时的异常处理机制毫无卵用,所以说C++中的异常处理机制是一种伪处理行为。但是Java中就不同了,因为Java中并没有指针的概念,使得程序的错误都是可控的,最关键的是Java自生对指针的处理良好(Java自身定义了好多基础异常,如:空指针、数组越界、计算异常等等),这样就显得Java中的异常处理十分重要且可靠,因为Java中的异常处理可以找到所有的错误。


java异常处理用法

(1)先在方法中抛出异常

public void checkText() throws Exception  //throws允许异常向上层抛出
	{
		if(strTest.length()<=9&&strTest.length()>0)
		{
			for (int i = 0; i < strTest.length(); i++)
			{
				char ch = strTest.charAt(i);
				if(ch<='0'||ch>='9')
                 {
                     Exception ex=new Exception("非法字符");   //方法1:抛出异常
                     throw ex;
                    
                  }
					
			}
			System.out.println("合法字符,perfect!");
		}
		else
			throw new Exception("字符超长");   //方法2:抛出异常
	}

(2)在调用时捕捉异常

            try来捕捉异常,如果发现异常则立即退出try进入catch找到对应的异常处理;如果没有异常则正常执行,而不会进入catch中;最后,无论是存在还是不存在异常都会进入finally中执行。(存在异常时,try进入catch进入finally,finally执行完后立即结束程序,此时finally相当于return)

	public static void main(String[] args)
	{
		System.out.print("请输入String:");
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		ControlInput myInput=new ControlInput(str);
		try
		{
			myInput.checkText();
		}
		catch (Exception e)
		{
			System.out.println(e.getMessage());
		}
		
		finally
		{
			System.out.println("清理退出完成!");
		}
    }

自定义异常机制

  Java中在自定以异常处理时:先创建一个异常类extands Exception

                                                 然后在自定义的异常类中重写public String getMessage()方法

public class ToLargeException extends Exception
{
	int length;
	public ToLargeException(int length)
	{
		this.length=length;
	}
	@Override
	public String getMessage()            //重写getMessage方法
	{
		return "字符超长,超出:"+length+"个字符!";
	}
	
}

//在throw异常时,就要改成: throw new ToLargeException(length);
//在catch异常时,就要改成: catch(ToLargerException e){ }

注:在Java的异常处理中常常是try—catch—finally来处理,其中finally总是会在方法最后执行,即使在之前存在return,但是如果return在finally之前执行,则finally中的操作将不会影响return的结果。finally常用来做内存的释放,I/O流的释放,连接的断开等,切记不要在finally中写return,因为无论之前是否有renturn执行,在finally中还会重复执行依次return。 下图为测试清单:


实战演练

实现对输入字符的检测,只允许输入0—9的数字且输入字符数为9个,如果输入字符异常,就抛出响应异常显示提示。

代码整合如下:

//ToLargerException.java
public class ToLargeException extends Exception
{
	int length;
	public ToLargeException(int length)
	{
		this.length=length;
	}
	@Override
	public String getMessage()
	{
		return "字符超长,超出:"+length+"个字符!";
	}
	
}

//ErrorInputException.java
public class ErrorInputException extends Exception
{
	int length;
	char ch;
	public ErrorInputException(int length,char ch)
	{
		this.length=length;
		this.ch=ch;
	}
	@Override
	public String getMessage()
	{
		return "首个非法字符"+ch+"出现在第"+length+"个位置";
	}
	
}

//ControlInput.java (throw异常)
public class ControlInput
{
	private String strTest=new String();
	public ControlInput(String str)
	{
		this.strTest=str;
	}
	public void checkText() throws Exception
	{
		if(strTest.length()<=9&&strTest.length()>0)
		{
			for (int i = 0; i < strTest.length(); i++)
			{
				char ch = strTest.charAt(i);
				if(ch<='0'||ch>='9')
					throw new ErrorInputException(i+1,ch);
			}
			System.out.println("合法字符,perfect!");
		}
		else
			throw new ToLargeException(strTest.length()-9);
	}
	
}

//Hello.java(测试)
import java.util.Scanner;

public class Hello
{
	public static void main(String[] args)
	{
		System.out.print("请输入String:");
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		ControlInput myInput=new ControlInput(str);
		try
		{
			myInput.checkText();
		}
		catch(ErrorInputException e1)
		{
			System.out.println(e1.getMessage());
		}
		
		catch(ToLargeException e2)
		{
			System.out.println(e2.getMessage());
		}
		
		catch (Exception e)
		{
			System.out.println(e.getMessage());
		}
		
		finally
		{
			System.out.println("清理退出完成!");
		}
		
	}
	
}

运行结果显示:

感谢阅读!欢迎点评! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值