异常

Posted 看海吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常相关的知识,希望对你有一定的参考价值。

1、异常概述:

异常(不正常)的体系: 

Throwable

    Error:通常出现重大问题,如运行的类不存在或者内存溢出等;不编写针对代码进行处理;

    Exception:在运行时出现的一起情况,可以通过try,catch,finally处理。

Exception和Error的子类名几乎都是以父类名作为后缀(除了Error类的ThreadDeath)。

详述

先来看一个异常的例子:除法运算4除以0(正常情况下除数不可为0)

package exceptionDemo;
class Demo{
	int div(int a,int b){
		return a/b;
	}
}
public class ExceptionDemo1 {
	public static void main(String[] args){
		Demo d=new Demo();
		int x=d.div(4,0);
		System.out.println("x="+x);
		System.out.println("over");
	}
}

结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at exceptionDemo.Demo.div(ExceptionDemo1.java:4)
	at exceptionDemo.ExceptionDemo1.main(ExceptionDemo1.java:10)

可以看到出现了ArithmeticException(运算异常),没有出现运算结果,也没有打印over,说明程序出现异常时就结束了。

异常是程序在运行时(注意是运行而不是编译,div(4,0)编译没有问题)出现不正常情况。要知道,问题也是现实生活中一个具体的事物,可以通过java类的方式对其进行描述,并将其封装成对象。异常其实就是java对不正常情况进行描述后的对象体现

对于问题又划分为两类:

一种是严重的问题,java通过Error类进行描述,如运行的类不存(运行java haha,出现java.lang.NoClassDefFoundError)或者内存溢出(byte[] arr=new byte[1024*1024*600],需要占用1024*1024*600的内存,很容易超出虚拟机所管理的内存范围,从而出现java.lang.OutOfMemoryError),一般不编写针对性代码对其进行处理(已超出虚拟机的能力范围);

一种是非严重的问题,java通过Exception类进行描述,可以使用针对性的处理方式进行处理。

(想想一下疾病的可治愈:癌症;不可治愈:感冒发烧)

无论是Error还是Exception又有一些共性内容,如不正常情况的信息、引发原因等,可以向上抽取为Throwable.(可抛的)

 

详情查看JAVA API文档,(sun公司被甲骨文收购)文档地址https://docs.oracle.com/javase/8/docs/api/

Throwable(JAVA语言中所有错误或异常的父类,有自身的构造函数和getCause(),getMessage(),toString()等方法)

-----Error     

-----Exception

2、异常的处理

 java提供了下面特有的语句进行处理

try{

需要被检测的容易出现问题的代码;

}

catch(异常类 变量){

处理异常的代码;(处理方式)

}

finally{

一定会执行的语句;

}

a、

先介绍前两部分try、catch ,以上面的代码为例

	try{
		int x=d.div(4,0);
		System.out.println("x="+x);
		}
		catch(Exception e){
			System.out.print("over");
		}

在进行div(4,0)运算时,会抛出一个new ArithmeticException()对象,try可以检测到这个对象(若没有try语句,检测不到异常对象,主函数也无法处理该异常,虚拟机会进行默认处理,调用了默认异常处理机制,导致程序停止),并将之交给catch(捕获),此时

Exception e=new ArithmeticException(),然后是执行catch里的语句,即System.out.print("over")。

注意:System.out.println("x="+x)并没有执行,因为在div(4,0)处发生异常,进行了程序的跳转。

注意:已知Exception e=new ArithmeticException()(父类的引用接收子类对象),对捕获到的异常对象存在一些常见的操作方法:

        String getMessage()    作用:获取异常信息,应用:System.out.print(e.getMessage()),输出:/zero;

        String toString()    作用:打印异常对象的字符串表示形式 ,应用:System.out.print(e.toString)或System.out.print(e),输           出:java.lang.ArithmeticException: /zero(比getMessage()更全面,异常名字:异常信息);

        printStackTrace()    作用:打印堆栈中的跟踪信息,应用:因其无返回值,所以不要放在输出语句中输      出System.out.print(e.printStackTrace())

        

以上是关于异常的主要内容,如果未能解决你的问题,请参考以下文章

片段中的Android致命异常

mvn命令异常:An error has occurred in Javadoc report generation: Unable to find javadoc command异常已解决(代码片段

mvn命令异常:An error has occurred in Javadoc report generation: Unable to find javadoc command异常已解决(代码片段

springcloud报错-------关于 hystrix 的异常 FallbackDefinitionException:fallback method wasn't found(代码片段

片段中的getView()导致抛出异常,不确定原因

片段中的 EditText 上的空指针异常 [重复]