当前位置: 首页 > 后端技术 > Java

学习java,先了解异常

时间:2023-04-01 20:48:58 Java

Java异常分为两大类:Checkedexceptions和Runtimeexceptions(运行时异常)。RuntimeException类及其子类的所有实例都称为运行时异常;不是RuntimeException类及其子类的异常实例称为Checked异常。Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,程序编译的时候就会出错,无法编译。运行时异常更灵活。不需要显式声明运行时异常就会被抛出。如果程序需要捕获运行时异常,也可以使用try...catch块来实现。使用throws语句抛出异常时有一个限制,这是重写方法时“两小”中的一条规则。子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或者相同,子类方法声明抛出的异常不允许多于超类方法声明。大多数时候建议使用Runtime异常而不是Checked异常。尤其是当程序需要自己抛出异常时,使用Runtime异常会更加简洁。使用Runtime异常时,程序不需要在方法中声明抛出Checked异常。一旦发生自定义错误,程序只会抛出运行时异常。如果程序需要在适当的地方捕获和处理异常,也可以使用try...catch块来捕获Runtime异常。在java的异常类系统中,Error和RuntimeException是unchecked异常,其他都是checked异常。所有方法都可以在不声明抛出的情况下抛出RuntimeException及其子类。Non-RuntimeException不能在没有声明的情况下抛出。简单的说,非RuntimeException应该自己写一个catch块来处理。1.RuntimeException先看一段代码,主要内容是将一个字符串类型的数字转换成整数,然后将两个数字相乘,代码如下:publicclassRuntimeException{publicstaticvoidmain(String[]args){//TODO自动生成的方法存根Stringstr="123";inttemp=Integer.parseInt(str);System.out.println(温度*温度);}}查看parseInt方法源码如下:publicstaticintparseInt(Strings)throwsNumberFormatException{returnparseInt(s,10);}我们发现在这个方法中抛出了一个NumberFormatException,但是在上面的代码中我们并没有找到一个try...catch来处理它,这是为什么呢。根据我们对异常处理的认识,如果一个方法通过throws抛出异常,那么在抛出异常的方法中就不能使用try...catch,但是在this所在的地方一定要有try...catch方法被调用。.我们观察一下NumberFormatException类的继承关系:从上图中我们可以发现NumberFormatException是RuntimeException的子类,所以这就需要我们明确Exception和RuntimeException的概念:Exception:Youmustusetry...catch在程序中进行处理。RuntimeException:不用try...catch也可以处理,但是如果发生异常,异常会交由JVM处理。最好使用RuntimeException的子类的异常处理机制。RuntimeException的异常虽然不用try...catch也可以处理,但是一旦出现异常,肯定会导致程序的执行中断。因此,为了保证程序在出错后仍能执行,开发代码时最好使用try。..catch异常处理机制进行处理。2.用户自定义异常下面给出一个自定义异常的例子:classMyExceptionextendsException{publicMyException(Stringmsg){super(msg);}}publicclassDefaultException{/***@paramargs*/publicstaticvoidmain(String[]args){//TODO自动生成的方法存根try{thrownewMyException("Customexception");}catch(Exceptione){System.out.println(e);//edu.sjtu.ist.comutil.MyException:自定义异常//System.err.println(e);//e.printStackTrace();//StackTraceElement[]sts=e.getStackTrace();//for(StackTraceElementst:sts){//System.err.println(st);//}//System.err.println(e.getStackTrace());}}}输出结果为:MyException:Customexceptions常见的RuntimeExceptionRuntimeException是开发中最容易遇到的,这里介绍常见的RuntimeException:1.NullPointerException:我看的最多,其实很简单的。通常,对空对象调用方法。字符串s=null;布尔eq=s.equals("");//NullPointerException这里可以看的很清楚,为什么一进入程序就头晕呢?publicintgetNumber(Stringstr){  if(str.equals("A"))返回1;  elseif(str.equals("B"))返回2;}这个方法可能会抛出NullPointerException,建议大家主动抛出异常,因为如果代码太多,可能又会头晕。publicintgetNumber(Stringstr){  if(str==null)thrownewNullPointerException("参数不能为空");//你是不是觉得你更懂了  if(str.equals("A"))return1;  elseif(str.equals("B"))return2;}2、NumberFormatException:继承IllegalArgumentException,发生在字符串转换为数字时。例如,inti=Integer.parseInt("ab3");3.ArrayIndexOutOfBoundsException:数组越界。例如int[]a=newint[3];intb=a[3];4.StringIndexOutOfBoundsException:字符串越界。例如,Strings="你好";charc=s.chatAt(6);5.ClassCastException:类型转换错误。例如Objectobj=newObject();字符串s=(字符串)obj;6.UnsupportedOperationException:不支持该操作。如果我们不希望支持此方法,则可以抛出此异常。既然不支持,为什么要这个?有可能是子类不想支持父类中的一些方法,所以可以直接抛出这个异常。7.ArithmeticException:算术错误,通常是0作为除数时。8.IllegalArgumentException:非法参数,字符串转数字时经常出现的异常,我们可以在自己的程序中好好利用这个异常。