0
点赞
收藏
分享

微信扫一扫

Java4Android自学记录(21):java中的异常

爱上流星雨 2022-02-04 阅读 52



文章目录


  • ​​1 目录及资源索引​​
  • ​​2 基本概念​​

  • ​​2.1 什么是异常?​​
  • ​​2.2 简要举例​​

  • ​​3 异常处理​​

  • ​​3.1 关键字说明​​
  • ​​3.2 语法结构​​
  • ​​3.3 代码举例​​

  • ​​4 抛出异常​​

  • ​​4.1 使用throws抛出异常​​
  • ​​4.2 使用throw抛出异常​​

  • ​​5 简单总结​​


1 目录及资源索引

  ​​Java4Android自学过程目录及资源索引​​

2 基本概念

2.1 什么是异常?

  异常:中断了正常指令流的事件;异常有如下特点:


  • 异常可以认为是一种对象,是虚拟机自发产生的;
  • 异常是在程序运行过程中产生的,不是在程序编译时产生的;
  • 异常和语法错误是完全不同的两种东西。此种情况可以举例如下:

class Test
{
public static void main(String args[])
{
int i = 1 / 0;
}
}

  上述代码,编译是没有错的(语法没有错误),但是程序运行时,就会出错(抛出异常)

Java4Android自学记录(21):java中的异常_throw

  查看编译后,抛出的异常提示(算术异常),可以看到是在 Test 这个文件的第5行,产生的错误。

2.2 简要举例

  举一个实际的例子,如果我们跟朋友在用微信聊天时,此时突然网络状况不佳/断网了,这个时候,微信就会向我们提示“请检查网络连接”之类的,此时这个就叫系统抛出了异常,并且对异常进行了处理。

  你能说这个是语法错误吗?很显然不是,这是在程序运行过程中,由于当前特定的环境,产生的异常,那么我们在程序中,就需要对这些异常提前进行处理。

3 异常处理

3.1 关键字说明

  在Java当中,异常处理通过 try、catch、throw、throws、finally 这5个关键字进行管理,具体说明如下:


  • try:它里面防止可能引发异常的代码;
  • catch:后面对应异常类型和一个代码块。它表明该 catch 块是用于处理这种类型的代码块,可以有多个 catch 块。
  • finally:主要用于回收在 try 块里打开的物理资源(如数据库连接,网络连接,磁盘文件等),异常机制保证 finally 块总是被执行。只有 finally 块执行完成之后,才会执行 try 或者 catch 块中的 return 或者 throw 语句,如果 finally 中使用了 return 或者 throw 等终止方法的语句,则就不会跳回,直接停止。
  • throw:用于抛出一个实际的异常。它可以单独作为语句来抛出一个具体的异常对象。
  • throws:用在方法签名中,用于声明该方法可能抛出的异常。

3.2 语法结构

  Java 处理异常的语法结构通常如下图所示:

try
{
// 程序代码
}
catch(异常类型1 异常的变量名1)
{
// 程序代码
}
catch(异常类型2 异常的变量名2)
{
// 程序代码
}
finally
{
// 程序代码
}

  finally 是一个很好的关键字,如果我们在开头打开了某个文件,如果在这中间,程序出现异常,此时我们关闭文件的操作,如果放在 try 中,可能就运行不到这一步;如果我们放在 catch 中,如果程序不出异常怎么办?那我们的文件就不关闭了?实际的情况应该放在 finally 中,不管程序有没有异常,最终都要来执行关闭文件操作。

3.3 代码举例

  我们把文章开头的代码示例,扩展一下,增加打印,增加try…catch…机制,具体如下:

class Test
{
public static void main(String args[])
{
System.out.println("1");
try{
System.out.println("2");
int i = 1 / 0;
System.out.println("3");
}
catch(Exception e){
System.out.println("4");
e.printStackTrace(); // e:虚拟机产生的异常对象
System.out.println("5");
}
finally{
System.out.println("finally");
}

System.out.println("6");
}
}

  由上述代码可以猜一下,try 中的 3 肯定是不会打印出来的,因为到这里就有异常,跳转到 catch 中执行,具体编译运行结果如下:

Java4Android自学记录(21):java中的异常_try_02

4 抛出异常

  很多时候,程序对异常都是不处理的,他自己没有处理的能力,都需要交给父类,然后让调用的类处理此异常,这个时候,产生这个异常的类,就需要抛出异常。

  抛出异常有两种方法,之前也有简述概念,下边再简单说一下:


  • throw 是用来抛出异常的;
  • throws 是用来声明异常的;

4.1 使用throws抛出异常

  使用 throws 抛出异常,基本格式如下:

void methodName (int a) throws Exception
{
// 代码块
}

  这样如果“代码块”中的代码,在运行时,有任何异常,就会被抛出。

4.2 使用throw抛出异常

  使用关键字 throw 抛出异常,既可以是异常引用,也可以是异常对象。如果需要在程序中自行抛出异常,则应该使用 throw 语句。

  我们可以单独使用 throw 语句,throw 语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。

  使用 throw 语句的语法格式如下:

throw ExceptionInstance;

  使用 throw 语句抛出异常的情况:


  • 当 throw 语句抛出的异常是 Checked 异常时,该 throw 语句要么处于 try 块里显式捕获该异常,要么放在一个有 throws 声明抛出的方法中,即把异常交给方法的调用者处理。
  • 当 throw 语句抛出的异常是 Runtime 异常时,该语句无须放在 try 块内,也无须放在 throws 声明抛出的方法中,程序既可以显式使用 try…catch… 来捕获并处理该异常,也可以不处理,将此异常交给方法的调用者来处理。

  举例如下:

public void run() throws methodName
{
if(判断条件1)
throw new methodName("提示1");
if(判断条件2)
throw new methodName("提示2");
}

  需要注意的是:由 throw 语句抛出的对象必须是 java.lang.Throwable 类或者其子类的实例。如下的代码是不合法的:

throw new String("字符串");    // 编译错误,String类不是异常类型

5 简单总结


  1. throw 的作用:如果这个异常,Java虚拟机根本判断不了,可以在出现这种情况的时候,生成一个异常对象,然后用 throw 加上这个异常对象,然后抛出这个异常。Java虚拟机就会知道这里出异常了。
  2. throws 的作用:可以用 throws 这个关键字来声明一个函数可能会产生异常,可以选择在函数内部处理这个异常,也可以选择在调用这个函数的地方处理异常。
  3. 后续程序中可以适时的,合理的使用抛出异常。


举报

相关推荐

0 条评论