一,概述
我们在编程时,往往会出现各种错误与异常,在Java的中,当某一方法出现错误时,器compile-会创建³³一个异常对象,并把它传递给正在运行的系统。例如,我们在如下的例子中有一处错误。
public class Dem
{
public static void main(String[] args){
int s1=Integer.parseInt("20L");
System.out.println(s1);
}
}
示例一
在本例中我们将字符串转化为整型数,由于 “20L” 中含有字母,所以无法转换为整型,因此系统会提示如下错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "20L"
at java.base/java.lang.NumberFormatException.forInputString(Unknown Source)
at java.base/java.lang.Integer.parseInt(Unknown Source)
at java.base/java.lang.Integer.parseInt(Unknown Source)
at tast.java.Dem.main(Dem.java:99)
NumberFormatException:用于输入字符串表示字符串转换为数字抛出的异常
二,捕捉异常
因而我们在实际操作中可以使用的try-catch语句来捕捉异常。尝试语句块中存放的是可能会发生异常的java的语句,而抓语句则用来激发被捕获的异常,在该结构中最后还有一个最后语句块,无论尝试语句块是否退出,都会执行最后语句
在此我们对示例一的代码进行改进,如下:
public class Dem
{
public static void main(String[] args){
try{
int s1=Integer.parseInt("20L");
System.out.println(s1);}
catch(Exception e){
e.printStackTrace();
}
finally {
System.out.println("无论try是否异常,对我没有影响");
}
}
}
示例2
java.lang.NumberFormatException: For input string: "20L"
at java.base/java.lang.NumberFormatException.forInputString(Unknown Source)
at java.base/java.lang.Integer.parseInt(Unknown Source)
at java.base/java.lang.Integer.parseInt(Unknown Source)
at tast.java.Dem.main(Dem.java:99)
无论try是否异常,对我没有影响
异常是尝试代码块传递给赶上代码块的变量类型,E是变量名
的getMessage():输出错误性质
的toString():给出异常的类型与性质
的printStackTrace():指出异常的性质,类型,栈层次及出现在程序中的位置
三.throws /抛抛出异常
由于异常类是所有异常类的父类,因此我们可以通过继承异常类来自定义异常类
class MyException extends Exception
{
public MyException(String ErrorMessage)
{
super(ErrorMessage);
}
}
class Student
{
public int speak(int m,int n)throws MyException
{
if(m>1000)
{
throw new MyException("抛出了自定义异常类对象");
}
return m/n;
}
}
public class Dem
{
public static void main(String[] args)
{
int m=1001;
int n=1;
Student stu=new Student();
for(int i=0;i<2;i++)
{
try {
stu.speak(m--,n--);
} catch (MyException e) {
System.out.println("成功捕捉到自定义异常类的错误");
}catch(Exception e) {
//捕捉到自定义异常类之外的错误
System.out.println("程序发生了其他异常");
}finally {
System.out.println("运行完毕\n");
}
}
}
}
示例三
运行结果:
成功捕捉到自定义异常类的错误
运行完毕
程序发生了其他异常
运行完毕
在本例中当M = 1001,N = 1时,满足M>千条件,因此直接将MyException异常类对象抛给说话方法调用者,而第二次M = 1000,n = 0的时程序直接返回米/ N,此时0为被除数,显而是算术错误,因而此时生成ArithmeticException算术异常类对象,所以第一个捕获语句并未捕捉到,而第二个捕获语句中的异常异常类便可以捕捉到。如果将异常放在第一个捕获语句中,则MyException类将永远得不到执行,因为异常是所有异常类的父类。
注:本文中知识点难免会有遗漏,还请多多指教^^