首页 > 编程语言 >Java异常

Java异常

时间:2023-05-05 12:44:05浏览次数:33  
标签:Java try finally catch 异常 throw

Java的异常是指在程序运行过程中出现的错误或异常情况,例如除数为零、数组越界、空指针等。Java中的异常分为两种:受检异常和非受检异常。

受检异常是指在编译时就能够检测到的可能发生的问题,必须要进行处理才能通过编译。这些问题通常与外部环境有关,并且可以被预见并避免。比如文件不存在(FileNotFoundException)、网络连接失败(IOException)等。

非受检/未捕获 异常则不需要强制性地对其进行处理,在代码执行期间如果抛出了该类型 的异 常,则会导致程序崩溃退出 。RuntimeException及其子类都属于 非 可查 异 常 ,包括NullPointerException, ArrayIndexOutOfBoundsException 等 一系列 运 行 时 错误

当一个方法内部产生了某个特定类型(checked exception) 的 checked Exception ,那么它应该将此Exception 抛给调用者去解决;而unchecked Exception 则无需显式声明throws语法来告知其他人自己所throw 出去哪些exception.

try-catch-finally 是 Java 中最基本也最重要得控制结构之一。

  • try: 包含待监视代码块
  • catch: 捕获由try引起得任何exceptions.
    • 多catch block : 如果你想要捕获多个不同类型的异常,可以使用多个catch块。
    • catch block 参数: 每一个catch 块都包含了要处理特定exception 的参数。这些参数是 exception 类型或者其子类得实例
  • finally : 无论是否发生异常, 都会执行finally代码块中的语句。
    好的,下面是一个简单的Java代码示例:
import java.io.*;

public class ExceptionDemo {
    public static void main(String[] args) {
        try{
            BufferedReader br = new BufferedReader(new FileReader("file.txt"));
            String line;
            while((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch(FileNotFoundException e){
           // 处理文件不存在异常 
           System.err.println("File not found: " + e.getMessage());
        } catch(IOException e){
          //处理IO 异常  
          System.err.println("IOException: " +e.getMessage());   
       } finally{
         // 关闭资源, 无论是否发生了异常都会执行这里.
         if(br != null){ 
             try{    
                 br.close();     
              }catch (IOException ex){      
                  ex.printStackTrace();
               }
         }
      }

   }

}

在上述代码中,我们使用try-catch-finally语句块来读取指定路径下的文本文件。如果该 文件存在,则程序将逐行输出其内容;否则就抛出FileNotFoundException并打印错误信息。

此外,在finally子句中关闭BufferedReader对象以释放相关资源,并确保不管有没有产 生 异 常 ,所需得清除工作总能够正确地完成 。
Java 还提供了 throw 和 throws 关键字来抛出和声明 异常 。throw关键字用于在方法内部显式地抛出某种类型的 Exception ,而throws则用于告知调用该方法时可能产生哪些 checked exceptions.
在Java中,异常处理的基本流程如下:

  1. 在可能会出现异常情况的代码块前加上try关键字,并将这些代码放在一个花括号内。

  2. 如果发生了某种类型的异常,则程序跳转到与之匹配的catch语句块。如果没有找到合适 的 catch 块来捕获该exception, 则此时JVM 会终止当前线程并抛出未被捕获得 exception.

  3. 每个catch语句都包含要执行以解决特定问题所需得一组指令(即“处理器”)。当 try 中产 生 异常 并且其 类型 匹 配于其中任何一个 catch block 后 ,控制权就传给相应地 handler 。handler 处理完后可以选择重新throw 或者不做任何事情而让方法正常结束

  4. finally 关键字用于定义必须执行但是不能通过return、break或continue等方式退出try/catch/finally结构体从而保证资源释放和清除工作能够正确进行。

5 . throw 和 throws 是 Java 提供两种机制来实现自己编写可重复使用性高,易读性好同时也更安全稳定 可靠 微服务:

  • 使用throws声明函数可能引起哪些checked exceptions
  • 对那些无法恢复错误(例如NullPointerException) ,则需要显式地调用throw 来告知其他人你已经遇到了一个无法处理的错误。

总之,Java异常机制是一种非常重要且强大的特性。它可以帮助我们更好地管理程序中可能出现 的各种问题,并提供相应解决方案以保证代码运行稳定和可靠。
除了try-catch-finally语句块外,Java还提供了一些其他的异常处理机制:

  1. try-with-resources:用于自动关闭资源(如文件、网络连接等),避免因忘记手动关闭而导致内存泄漏或程序崩溃。

  2. assert关键字:可以在代码中添加断言来检查某个条件是否成立。如果不成立,则会抛出AssertionError异常,并终止程序运行。

  3. 自定义异常类:除了使用Java标准库中已有的Exception子类之外,我们也可以根据需要创建自己 的 异常 类 。这样做能够更好地满足特定应用场景下对错误信息和处理方式的需求
    好的,下面是一个使用自定义异常类和try-with-resources语句块的Java代码示例:

class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

public class ResourceDemo {

   public static void main(String[] args){
      try (MyResource resource = new MyResource()) { // 使用try-with-resource来打开资源 
         resource.doSomething();
      } catch(MyException e){  // 处理自定义异常  
          System.err.println("Error: " +e.getMessage());   
       }

   }

}


// 自己编写得resource 类, 实现了AutoCloseable 接口.
class MyResource implements AutoCloseable{
    
     @Override
     public void close() throws Exception{     
           System.out.println("Closing my resources");
     }
      
     public void doSomething() throws IOException,MyException{
            if(true)
                throw new IOException();       
             else if(false)
                 throw new RuntimeException();        
              else         
                  throw new MyException("This is a custom exception");          
       } 

}

在上述代码中,我们创建了一个名为“myexception”的自定义异常类,并将其用于处理doS omething方法可能抛出 的 异 常 。同时,在main函数中利用 Java7 中新增加得 try with resources 来确保程序能够正确地关闭相关资源。

此外,在实现close() 方法时 , 我们可以添加一些必要清除工作以释放所占据内存等系统 资源。

4 . Java 8 中新增加得 Optional 可以帮助开发者优雅地解决NullPointerException问题.

总体上说, 在编写高质量可靠性强且易读性好得java 应用时 ,合理利用各种exception handling 技术是非常重要并必须掌握其中精髓

标签:Java,try,finally,catch,异常,throw
From: https://www.cnblogs.com/SwapEnd/p/17373007.html

相关文章

  • Java Web超大文件上传和断点续传的实现
    ​前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比......
  • java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/
    Java使用AES/CBC/PKCS7Padding加解密时会报错,因为原生JDK不支持。1.在jdk中的jre\lib\security修改java.security文件,替换security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider2./jdk/jre/lib/ext下添加jar包bcprov-jdk15on-1.58.jar ......
  • Java 新的生态型应用开发框架,Solon v2.2.14 发布
    Java新的生态型应用开发框架,Solon:更快、更小、更简单。从零开始构建,有自己的标准规范与开放生态:150多个生态插件,可以满足各种场景开发大量的国产框架适配,可以为应用软件国产化提供更好支持相对于SpringBoot和SpringCloud的项目:启动快5~10倍。(更快)qps高2~3......
  • 高级Java程序员必问,Redis事务终极篇
    1.简介1.1什么是Redis事务Redis事务(Transaction)通过将多个Redis操作封装为一个原子性的操作序列,确保在事务执行过程中,不会受到其他客户端的干扰。从而在保证数据一致性的同时,协调并发,提高数据操作的效率和性能。1.2Redis事务的应用场景在分布式系统和高并发场景下,事务处理......
  • [转]Java 获取操作系统的信息
    链接: https://blog.csdn.net/csdntoast/article/details/506398191获取本机的IP地址:privatestaticStringgetIpAddress()throwsUnknownHostException{InetAddressaddress=InetAddress.getLocalHost();returnaddress.getHostAddress();}......
  • java 实现简单的http客户端
    1、废话不多说,代码如下packagecom.linhuaming.test;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.MalformedURLException;importjava.net.Socket;importjava.net.URL;/***http客户端测试*/publicclassHttpClientTest{pub......
  • 【javascript】typeof 和 instance of的差异
    typeof与instanceof都是判断数据类型的方法,区别如下:1.typeof会返回一个运算数的基本类型,instanceof返回的是布尔值2.instanceof可以准确判断引用数据类型,但是不能正确判断原始数据类型3.typeof虽然可以判断原始数据类型(null除外),但是无法判断引用数据类型(function除外)所以如......
  • 【Java学习笔记】Maven项目+Junit5单元测试
    1.Maven简介;Maven概念:仓库、坐标Maven坐标:描述仓库中资源的位置Maven坐标查找:https://mvnrepository.com/Maven坐标组成:-groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.Google)-artifactId:定义当前Maven项目名称(通常是模块名称)-version:定义当前Maven项目......
  • 力扣141(Java)-环形链表(简单)
    题目:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递 。仅仅是为了标识......
  • Java正则提取中间段文本
    核心正则开始字符串(.*)结束字符串示例Stringa="【权益到账提醒】尊敬的客户,您好!您已获得权益礼包,【兑换码】:11223344。请妥善保管好您的兑换码,一经兑换,立即失效。";Matchermatcher=Pattern.compile("【兑换码】:(.*)。请妥善保管好您的兑换码").matcher(a);if(ma......