JAVA--异常基础介绍 try-catch-finally和throws基础讲解

异常

定义:是指程序在运行中的出现的错误,例如:在进行除法运算时,若除数为0,则运行JAVA是会自动抛出算数异常。

JAVA 异常 :也是通过一个对象来表示的,程序运行时抛出的异常,实际上就是一个异常对象,该对象中不仅封装了错误的信息,还提供了一些处理方法。

异常的分类(Throwable)

                   1: 异常(Exception) :合理的应用程序可能需要捕获的问题     举例:NullPointerException  (空指针异常类)    是可预料的

                   2:错误(Error) :合理的应用程序不应该试图捕获的问题     举例:StackOverFlowError  ( 栈内存溢出)   是不可预料的

               分类解析:  我们作为程序员只需要认识关于我们程序上的东西,也就是可预料的,也就是异常 ,是在我们解决范围之内的问题。

                                  错误是不可期的是具有不确定性发生的 ,也是在代码程序范围之外的,只需了解即可。

常见的异常类列表:

异常类名称

异常类含义

ArithmeticException算术异常类
ArraylndexOutOfBoundsException数组下标越界异常类

ArrayStoreException

将与数组类型不兼容的值赋值给数组元素时抛出的异常
ClassCastException类型强制转换异常
IndexOutOfBounchsException当某对象的索引超出范围时抛出异常
NegativeArraySizeException建立元素个数为负的数组异常类
NullPointException空指针异常
NumberFormatException字符串转换为数字异常类
SecurityExceptionApplet试图执行浏览器的安全设置不允许的动作
StringIndexOutBounchsException程序试图访问字符串中字符不存在的字符位置
OutOfMemoryException分配给新对象的内存太小
SockedException不能正常完成Socked操作
ProtocolException网络协议有错误
ClassNotFoundException未找到相应的异常类
EOFException文件结束异常
FileNotFoundException文件未找到异常
illegalAccessException访问某类被拒绝时抛出的异常
InstantiationException

试图通过new Instance()方法创建一个抽象

类或抽象接口的实例时出现的异常

IOException输入、输出异常
NoSuchFileException字段未找到异常
NoSuchMethodException方法未找到异常
SQLException操作数据库异常
ClassNotFoundException文件未找到异常类

注意:若不知道代码抛出是那种异常,可以指定它们的父类 Throwable 和 Exception。

异常的处理方式:

JVM默认的异常处理方式:在控制台打印错误信息,并终止程序

开发中异常的处理方式:

           1:try....catch(finally):捕获,自己处理

           2:throws:抛出,交给调用者处理   

     1:try....catch(finally):捕获,自己处理

finlly子句:与try catch语句连用,不管try catch 语句是否执行顺利,finlly语句都会被执行。

代码格式: 

try {
     //尝试执行的代码
} catch (Exception e) {
    //出现可能的异常之后的处理代码
} finally{
    //一定会执行的代码,如关闭资源
}
-------------
//try catch 可以同时存在多个catch 语句
try{
}
catch{
}
catch{
}
catch{
}

对于处理方式进行例题讲解

题:当定义一个数,让这个数除以0出现的代码问题如何解决。

public class trycatch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a =10 / 0;
		System.out.println("a:"+a);
	}

}
------------------------------------
结果在控制台出现异常代码:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at 异常.trycatch.main(trycatch.java:9)

通过解决异常处理方式一 try....catch 进行解决

public class trycatch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {  //写尝试要执行的代码
		int a =10 / 0;
		System.out.println("a:"+a);
		}catch (Exception e) { //写出现问题后的解决方案
			System.out.println("出现异常错误");
	}finally {
		System.out.println("这yi行出现吗?");
	}
		System.out.println("这二行出现吗?");
}
}
--------------------------------------
输出结果:
出现异常错误
这yi行出现吗?
这er行出现吗?

方式一的特点:

1:“这二行出现吗?” 这一行的输出 说明:当异常问题被解决后 会继续执行下面代码

2:finally {} 代码可以有,同样也可以没有区别在于:即使  try  catch 中有没有 return  finally中的语句依然被执行通过代码进行解释:

代码一:
public class trycatch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {  //写尝试要执行的代码
		int a =10 / 0;
		System.out.println("a:"+a);
		}catch (Exception e) { //写出现问题后的解决方案
			System.out.println("出现异常错误");
                return;
	}finally {
		System.out.println("这yi行出现吗?");
	}
		System.out.println("这二行出现吗?");
}
}
-------------------------------------------------
输出结果:
出现异常错误
这yi行出现吗?
代码二:

public class trycatch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {  //写尝试要执行的代码
		int a =10 /10;
		System.out.println("a:"+a);
		return;
		}catch (Exception e) { //写出现问题后的解决方案
			System.out.println("出现异常错误");
			
	}finally {
		System.out.println("这yi行出现吗?");
	}
		System.out.println("这er行出现吗?");
}
}
--------------------------
输出结果:
a:1
这yi行出现吗?

以上代码说明return 可以决定着语句结束后是否向下执行,当有finally语句后会执行finally语句内容但不会执行方式一语句之外的代码。

解释:return 是结束语句的用语,当出现异常时会执行异常语句,如果判定没有异常就是执行try中的输出语句后,之后return ,说明代码结束,之后再执行finally语句内容。

方法一执行流程:

先执行try{}语句的内容,看是否会出现问题(异常)

         没有:直接执行finally语句的内容

         有:直接跳转到catch{}语句中开始执行,完成之后再执行finally{}语句中的内容。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

方法二:throws:抛出,交给调用者处理。

               public  void 方法名() throws Exception{  }

拓展延伸:使用throw也可以抛出异常,与throws不同的是throw在方法体内,throws在方法体外。

 

错误例题代码:

public class throws1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		show();

	}
	public static void show() {
		int n= 10/0;
		System.out.println("n"+n);
	}

}
错误示例:两处错误
1:int n =10 /0
2:show():main函数错误

让方法抛出异常,只需修改public static void show()

改为:

public static void show () throws Exception{}
public class throws1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//需求:通过main 函数调用show()方法
		show();  //这样出现时会显示错误:Unhandled exception type Exception
				//因为show()已经抛出异常,作为调用者(main函数)必须处理这个异常
				//这就是说抛出异常交给调用者处理。

	}
	public static void show () throws 	Exception {
		int n= 10/0;
		System.out.println("n"+n);
	}

}
----------------------
//解决方案一:
//你把异常抛给我,我也抛,给别人。 有main函数抛给JVM
//代码:

public class throws1 {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		//需求:再main 函数调用show()方法
		show();  
		System.out.println("看看我执行了吗");

	}
	public static void show () throws 	Exception {
		int n= 10/0;
		System.out.println("n"+n);
	}

}
运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at 异常.throws1.show(throws1.java:15)
	at 异常.throws1.main(throws1.java:8)
代码只显示异常的问题,并没有输出打印“看看我执行了吗”这行
-----------------------
方案二:
public class throws1 {

	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		//需求:再main 函数调用show()方法
        try{
		show(); 
         }
        catch { 
            system.out.println("代码出问题了吗");
          }
		System.out.println("看看我执行了吗");

	}
	public static void show () throws 	Exception {
		int n= 10/0;
		System.out.println("n"+n);
	}

}
----------------------
执行结果:
代码出问题了吗
看看我执行了吗

方法二特点总结:

通过throws 解决时,执行结束后代码不会再继续执行

通过try.....catch 解决时,执行结束后代码会再继续执行。

使用异常代码(try catch finally 和 throws 和 throw)的注意事项:

1:

不能单独使用try catch 或 finally 语句块,否则编译出错。

File file = new File("d:\cat.txt");
try{
FileOutputStream out = new FileOutputStream(file);
out.write("start".getBytes);
}
打出这样的代码就会报错
Syntax error, insert "Finally" to complete TryStatement

2:

Try语句块既可以只使用catch语句,也可以只使用finally语句。当与catch语句块一起时,可以存在多个catch语句,而只能存在一个finally语句,当catch和finally语句一起使用时,finally语句必须放在catch语句后面。

3:

try至于catch语句使用时,可以使程序在发生异常时抛出异常,并继续执行方法中的其他代码。

package 异常;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class zhuyi {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		File file = new File("D:\\cat.txt");
		try{
		FileOutputStream out = new FileOutputStream(file);
		out.write("start".getBytes());
		out.close();
		out.write("end".getBytes());
		}
		finally {
			System.out.println("看看这行执行了吗");
		}
	}

}
-------------------------
看看这行执行了吗
Exception in thread "main" java.io.IOException: Stream Closed
	at java.base/java.io.FileOutputStream.writeBytes(Native Method)
	at java.base/java.io.FileOutputStream.write(FileOutputStream.java:334)
	at 异常.zhuyi.main(zhuyi.java:16)
//通过结果得知抛出异常后继续执行其他代码
//而且还抛出异常

4:

try只与catch语句块使用时,可以使用多个eatch语句块来捕获try语句块中可能发生的多种异常。异常发生后,Java虚拟机会由上而下来检测当前catch语句块所捕获的异常是否与try语向块中发生的异常匹配,若匹配,则不再执行其他的catch语句块。如果多个catch语句块捕获的是同种类型的异常,则捕获子类异常的catch语句块要放在捕获父类异常的catch语句块前面。

File file = new File("D:\\cat.txt");
		try{
		FileOutputStream out = new FileOutputStream(file);
		out.write("start".getBytes());
		out.close();
		out.write("end".getBytes());
		}
		catch (Exception e) {
			System.out.print("父类异常");
		}
		catch (IOException e) {
			System.out.print("子类异常");
		}
	}
代码报错:Unreachable catch block for IOException. It is already handled by the catch block for Exception

5:

在try 语句块中声明的是局部变量,只在当前try语句块中有效,在其后的catch finally语句块或其他位置都不能访问变量。但在try catch和finally语句块之外的声明的变量,可在try catch 和finally语句块中使用。

6:

在使用throw语句抛出一个异常对象,该语句后面的代码将不会被执行。

try {
}
catch (){
throw e;
system.out.println("会不会被执行"); //这行代码将不会被执行
}

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想睡醒的梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值