Exception
Exception与Error的区别
Throwable类是Java语言中所有错误和异常的Throwable类。
Exeption:编译期异常,进行编译(写代码)java程序出现的问题
runtimeexception:运行期间异常,java此程序运行期间的问题error:
错误必须修改代码,才能继续运行
异常是怎么产生的,如何处理异常
jvm接收到这个异常对象,做了两件事
1.把异常对象(内容,原因,位置)以红色的字体打印在控制台
2.jvm会终止当前正在执行的java程序–>中断处理
图片来源于网络!!!
两种方式处理异常
1.throws ParseException
throws关键字:异常处理的第一种方式,交给别人处理
作用:
-
当方法内部抛出异常处理对象的时候,那么我们就必须处理这个异常
-
可以使用throws关键字处理异常对象,会把这个异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给jvm处理–>中断处理
使用格式:在方法声明时使用 -
修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException…{
-
throw new AAAException(“产生原因”
-
throw new BBBException(“产生原因”);
*… }
注意: -
1.throws关键字必须在方法声明出
-
2.throws关键字后边的声明的异常必须是Exception后者是其子类
-
3.方法内部如果抛出多个异常对象,那么throws后边必须也声明多个异常
-
如果抛出的多个异常对象有子父关系,那么直接声明父类异常即可
-
4.调用了一个声明抛出异常的方法,我们就必须的处理声明的异常
-
要么继续使用throws声明怕抛出要么交给方法的调用者处理,最终交给JVM
-
要么trycatch自己处理异常
举例代码public class Demo05Throws { public static void main(String[] args) throws IOException { readFile("c:\\a.tx"); } /*//对传递的文件路径进行合法判断 如果路径不是"C:\\a.txt",那么我们就抛出文件找不到异常,告知方法的调用者*/ //FileNotFoundException是编译异常!可以使用throws继续声明抛出FileNotFoundException这个异常对象,让方法的调用者处理 public static void readFile(String fileName) throws IOException { if(!fileName.equals("c:\\a.txt")) { throw new FileNotFoundException("传递的文件路径不是C:\\a.txt"); } if(!fileName.endsWith(".txt")) { throw new IOException("文件名的后缀名txt"); } System.out.println("路径没有问题,读取文件"); } }
1.2throw关键字讲解(处理运行时的异常)
throw关键字
-
作用:可以使用throw关键字在指定的方法中抛出指定异常
-
使用格式:
-
throw new ****Exception(“异常产生的原因”)
-
throw关键字抛出指定的异常对象,我们就必须 处理这个异常对象
-
throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认就交给JVM处理(打印异常对象,中断程序)
-
throw关键字后边创建的是编译异常(写代码时候报错),我们就必须处理这个异常,要么Throws,要么Try{}catch(){}
举例代码public class Demo03Throw { public static void main(String[] args) { //int arr[]=null; int arr[]=new int[3]; getElement(arr,3); } public static int getElement(int arr[],int index) { if(arr == null)throw new NullPointerException("空指针异常");//NullPointerException是一个运行期异常,我们不用处理,默认交给JVM //对传递过来的数进行合法化校验! if (index<0||index>arr.length-1)throw new ArrayIndexOutOfBoundsException("数组越界异常,传递的索引超出了数组的使用范围!"); return arr[index];//1发现数组越界,此方法没有异常处理逻辑,返回到Main中 } }
当传递至为空这一特殊情况时,我们可以使用Object类下面的requireNonNull方法:
static T requireNonNull(T obj, String message)
检查指定的对象引用不是null并抛出自定义的NullPointerException(如果是)。
代码:
public class Demo04Objectrequiire {
public static void main(String[] args) {
method(null);
}
public static void method(Object obj)
{
//if(obj==null)throw new NullPointerException("传递的对象是空!");
Objects.requireNonNull(obj,"传递的对象是空!");
}
}
2.trycatch
try{可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出异常对象)
{异常处理逻辑,异常处理对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}…
catch(异常类名 变量名)
{}
注意:
1.try中可能会抛出多个异常,那么就可以用多个catch来处理这些异常对象
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
如果try中没有异常那么就不会执行catch中异常处理逻辑,执行完try中的代码,继续执行try…catch之后的代码
举例代码:
public class Demo06TryCatch {
public static void main(String[] args) {
try {
readFile("c:\\a.tx");//有可能有问题的代码
System.out.println("资源释放");//执行不到!此语句
}
catch (IOException e)
{
//System.out.println("catch-传递的文件名后缀不是.txt");
// System.out.println(e.toString());//重写Object类中的tostring类方法 java.io.IOException: 文件名的后缀名txt
// System.out.println(e);//重写Object类中的tostring类方法 java.io.IOException: 文件名的后缀名txt
System.out.println(e.getMessage());//文件名的后缀名txt
e.printStackTrace();/*java.io.IOException: 文件名的后缀名txt
at cn.itcast.API.Exception.Demo06TryCatch.readFile(Demo06TryCatch.java:38)
at cn.itcast.API.Exception.Demo06TryCatch.main(Demo06TryCatch.java:19)*/
}
System.out.println("使用trycatch方法,执行完之后继续执行代码!");
}
/*//对传递的文件路径进行合法判断
如果路径不是"C:\\a.txt",那么我们就抛出文件找不到异常,告知方法的调用者*/
//FileNotFoundException是编译异常!可以使用throws继续声明抛出FileNotFoundException这个异常对象,让方法的调用者处理
public static void readFile(String fileName) throws IOException{
if(!fileName.endsWith(".txt")) {
throw new IOException("文件名的后缀名txt");
}
System.out.println("路径正确!");
}
}
关于catch中的三种方法:
/*throwable中的三个方法
* 1.void printStackTrace(PrintWriter s)
将此throwable和其追溯打印到指定的打印作者打印信息是最全面的
* 2.String getMessage()
返回此可抛出的简短描述。
* 3.String toString()
返回此throwable的详细消息字符串。 */
2.2try catch finally
try catch上面已经介绍过了
fianlly
{}//无论出现异常都会执行
注意:
1.try中可能会抛出多个异常,那么就可以用多个catch来处理这些异常对象
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
如果try中没有异常那么就不会执行catch中异常处理逻辑,执行完try中的代码,继续执行try…catch之后的代码
3finally不能单独使用,必须和try一起使用
finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要释放资源(IO)
如果finally中有return语句,永远返回finally中的结果,避免该情况!
代码举例:
public class Demo07TryCatchFinally {
public static void main(String[] args) {
try {
readFile("c:\\a.tx");//有可能有问题的代码
System.out.println("资源释放");//执行不到!此语句f
}
catch (IOException e)
{//异常处理的逻辑
e.printStackTrace();
}finally {
//无论是否出现异常,都会执行
System.out.println("资源释放");//执行不到!此语句
}
System.out.println(getelement());
}
public static void readFile(String fileName) throws IOException{
if(!fileName.endsWith(".txt")) {
throw new IOException("文件名的后缀名txt");
}
System.out.println("路径正确!");
}
public static int getelement()
{
int a=10;
try {
return a;
}
catch (Exception e)
{
e.printStackTrace();
}
finally {
a=100;
return a;//避免出现该情况!
}
}
}