Java异常
1.Java异常类
超类Throwable被Error(错误)类和Exception(异常)类继承。
Throwable:
常用方法:
//1.返回异常发生时的详细信息(简略描述信息)
public string getMessage();
//空指针异常
//2.返回异常发生时的简要描述(异常类和简略描述信息)
public string toString();
//java.lang.NullPointerException: 空指针异常
//3.在控制台上打印Throwable对象封装的异常信息(详细信息)
public void printStackTrace();
//java.lang.NullPointerException: 空指针异常
//at com.cwstd.exception.ExceptionTest.getnum(ExceptionTest.java:10)
//at com.cwstd.exception.ExceptionTest.main(ExceptionTest.java:17)
Error:无法通过程序进行纠正,必须通过修改源码解决错误。
Exception:异常后可以通过代码进行纠正,使程序能够继续运行。
注意:Exception有一个子类 RuntimeException或者RuntimeException的子类,指的是程序运行期的异常,可以不进行处理,默认可以交给JVM处理,其他编译期的异常类,需要进行处理(抛出异常交给方法调用者处理或者自己捕获异常)
2.Throw关键字
Throw关键字:在指定方法中抛出指定异常(根据实际情况选择异常类,如果Java没有自带该异常类可以自定义)
写法: throw new xxxException("异常产生的原因");
getNum方法
创建一个返回数组指定位置元素的类,如果传入数组为null,抛出空指针异常
public static int getNum(int[]arr,int index)
{
if(arr==null)
{
throw new NullPointerException("空指针异常");
}
return arr[index];
}
public static void main(String[] args) {
int [] arr=null;
getNum(arr,0);
}
因为 NullPointerException是运行期异常,所以不需要继续抛出异常或者捕获异常,默认交给JVM处理。
3.处理异常的两种方法
3.1抛出异常
不处理异常,把异常抛给调用方法者
public static void openFile(String path) throws FileNotFoundException {//抛出异常调用该方法的main方法
if(!path.equals("C://123.txt"))
{
throw new FileNotFoundException();
}
}
public static void main(String[] args) throws Exception {//抛出异常给JVM
int [] arr=null;
openFile("D://123.txt");
}
FileNotFoundException()是编译期异常,所以必须要抛出异常或者捕获。
注意:
- throws必须写在声明处
- throws必须是Exception或者Exception的子类
- 如果抛出的多个异常,他们是子类和父类的关系,可以只用抛出父类
3.2捕获异常
写法:
try{
可能产生异常的代码
}catch (定义异常类变量,接收抛出的异常类){
处理异常代码,通常把异常写入到日志
}
finally{
不管是否有异常都会执行的代码,通常做资源的释放
}
注意:
- try中可以抛出多个异常,可以使用多个catch进行捕获
- try中如果抛出父类和子类异常,子类异常要先catch,不然都会被父类捕获报错,或者只写一个父类捕获
4.子父类的异常
父类异常是什么样,子类异常就是什么样
- 子类重写父类的方法时候,抛出异常可以是父类异常的子类,或者不抛出异常
- 父类没有异常,子类也不能有,如果方法内有,只能用try...catch捕获
5.自定义异常
自定义 SumException
判断两数的和是否正确,不正确抛出异常
package com.cwstd.exception;
public class SumException extends Exception{
/**
* 空参构造方法
*/
public SumException()
{
}
/**
* 带异常信息,交给父类处理
* @param s
*/
public SumException(String s)
{
super(s);
}
}
mian方法
public static void sumTest(int a,int b,int sum) throws SumException {
if(a+b!=sum)
{
throw new SumException("和错误");
}
}
public static void main(String[] args) throws Exception {
sumTest(1,2,1);
}
输出:Exception in thread "main" com.cwstd.exception.SumException: 和错误
at com.cwstd.exception.ExceptionTest.sumTest(ExceptionTest.java:25)
at com.cwstd.exception.ExceptionTest.main(ExceptionTest.java:30)