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){ }

实战演练

实现对输入字符的检测,只允许输入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("清理退出完成!");
		}
		
	}
	
}

运行结果显示:

Java异常处理Java异常处理

感谢阅读!欢迎点评!