异常的概念:在Java当中 它是把所有异常信息封装起来 放在一个类里 当遇到异常时 会创建异常类对象 并且抛出
Exception和Error的区别:
Exception:异常信息 - 发生异常的原因和位置
是可以处理的 处理完之后 程序是可以继续执行的
在编译 运行时期都可能发生
Error:必须修改源程序才能解决(有些问题修改了源程序也未必能解决)
只有在运行的时候发生 无法解决
什么能扔(抛出)?
任何继承了Throwable类的对象
Exception类默认继承了Throwable
因此可直接抛出:
throw new Exception();
throw new Exception("help");
异常处理方式
方式1、throws 关键字 :只是在方法声明中标识一下
方式2、try…catch()…finally
1、throws手动抛出异常方式
什么时候用手动抛出异常:当我们写的方法给别人用时 并且方法声明中需要传参
为了进行合法性判断 保证是我规范的参数类型
若出现不合乎规范的参数 需要进行友好提示 这个时候需要手动抛出异常
在java中提供了关键字throw 它用来抛出指定异常对象 封装一些提示信息(这些信息可以自己写)
throw使用格式:
throw new 异常类名(参数列表);
注意:throw必须写在方法体内部,目的是抛出(请注意,是抛出)异常类对象
关键字throws用来声明(请注意,是声明)异常 写在方法声明上 用来告诉调用者这个方法可能会跳出异常
一个类后面加上throws(抛出) Exception(异常)表示声明异常的一个类
throw和throws这两个关键字配合使用
例:
public class Wrong {
public static void main(String[] args) throws Exception{
// int[] arr={};
int[] arr=null;
int value=getArray(arr);
}
private static int getArray(int[] arr) throws Exception {
//若传进来空的对象
if (arr==null)
{
throw new Exception("传递的数组不存在");
}
if (arr.length==0)
{
throw new Exception("传递的数组中没有元素");
}
int value=arr[arr.length-1];
return value;
}
}
程序一旦抛出异常 后面的语句将不会继续执行
2、try catch方式
格式:
try
{
被检测的内容(可能会发生异常的代码)
}
catch(异常类名/*Exception或它的子类*/ 变量名/*最好为e或ex*/)
{
异常处理方式(循环、判断...)
}
finally//到此意味着异常处理结束
{
必须执行的代码
}
try代码块中存放可能出现异常的代码
catch捕捉异常
catch(){}代码块结束之后 意味着异常处理结束 后面的代码继续执行
正是因为有了这个异常处理机制 程序免去了强制结束的烦恼
那么 当我们捕捉到异常之后 我们能做什么?
1、System.out.println(e.getMessage());
返回发生异常时放在发生异常对象里的值
例:
(例子里假设这个值是10)
2、System.out.println(e);
或System.out.println(e.toString());
返回异常类的类名和异常的数值
【 输出e也就是相当于输出e.toString】
例:
3、e.printStackTrace();
返回异常类的类名和异常的数值和发生异常时在哪行被调用了
使用此函数 可以知道异常函数的调用轨迹
例:
例子里的意思是:刚开始发生异常是在第9行的f函数中,f函数又被第14行的g函数调用了,f函数又被…调用…最后被34行的main函数调用了
当catch的是Exception时 将能捕捉到任何异常
因为所有异常都是继承自Exception类的
catch(Exception e)
{
System.err.println("Caught an exception")
}
当异常声明遇到继承关系:
1、当覆盖一个函数的时候 子类不能声明抛出比父类的版本更多的异常
2、在子类的构造函数中 必须声明父类可能抛出的全部异常
捕捉异常后:
无法返回
具体的处理逻辑取决于业务逻辑需要