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("清理退出完成!");
}
}
}
运行结果显示:
感谢阅读!欢迎点评!