【java基础】异常处理是啥?有啥用?

本文主要介绍Java中的异常处理。Java将非正常情况分为Error和Exception,重点讲解了Exception的处理。介绍了Runtime和Checked两种异常,以及try、catch、finally的作用,还阐述了throws和throw的使用及区别,帮助开发者更好地处理程序异常。
异常的引入

说起异常,我们来看看异常结构树。java把所有的非正常情况分为两种,Error(错误)和Exception(异常)。其中的Exception就是咱们今天要讲的异常,对其进行处理就是异常处理。
在这里插入图片描述

(1)Error错误

Error是一般和虚拟机相关的问题,将导致应用程序中断。包括系统崩溃,虚拟机错误,动态链接失败等。这种错误无法恢复也无法捕获,无法在代码中对其进行“处理”。比如如果出现内存溢出的错误,可能是因为堆内存设置的过小 ,那我们可以通过增大堆内存来解决这个问题。这个和代码无关,属于JVM调优方面的问题。

(2)Exception异常

异常分为Checked异常和Runtime异常。

  • Runtime异常

所有的RuntimeException类及其子类的实例被称为Runtime异常,即上图中的粉色部分。此异常无需显式声明抛出,如果需要捕获,可以使用try…catch块。大部分时候推荐使用此异常。

  • Checked异常

其余的异常实例被称为Checked异常。Checked异常是java独有的,要求必须显示处理
此异常。如果没有对其进行处理,则在编译时会发生错误。处理方式有两种:try…catch和throws。

try…catch…finally
关于什么是异常处理,我们可以看如下代码:
try
   {
    //业务实现代码,这些代码可能引发异常
   } 
catch (IndexOutOfBoundsException ie)
   {
     //如果发生了数组越界异常,应该这样处理
   } 
catch (Exception e)
   {
     //如果发生了异常,应该这样处理
   }
finally
   {
     //用于回收在try块中打开的物理资源
   }

异常处理就是对业务实现代码进行处理,其一旦抛出异常,catch块就将此异常捕获。避免因为程序遇到问题而停止。其中,只有try是必选的,其余两个可选。下面分别说说各部分的作用。

(1)try

try后面放置的是实现业务逻辑的代码,我们的异常处理就是对这段代码进行了“保护处理”。

(2)catch

catch后面放置的是捕获的各种异常。常见的错误如下:

错误解释
IndexOutOfBoundsException数组越界异常
NumberFormatException数字格式异常
ArithmeticException除0异常
NullPointerException空指针异常

在catch块的使用中,有几个原则需要我们注意一下:

  • a、应先处理小异常,再处理大异常
    像文章开头的实例,只有不符合数组越界异常,才会到达其父类“其它异常”处。如果两个catch块对调,则代码永远都不会到IndexOutOfBoundsException处。可以和“河北人”、“中国人”类比。
    在这里插入图片描述

  • b、可以使用多异常捕获
    在Java7以后,我们可以将多个异常放在一个catch块里。示例如下,只是其中的异常变量ie有隐式的final修饰,不能对其进行重新赋值。

try {}  
catch (IndexOutOfBoundsException | NumberFormatException  | ArithmeticException ie)
 {
    System.out.println("程序发生了数组越界、数字格式异常、算术异常之一");   
 } 
 catch (Exception e)
 {
     System.out.println("未知异常");   
}

(3)finally

finally用于将数据库连接、网络连接、磁盘文件等物理资源进行关闭。不管是走try块还是catch块,最后都会走finally块。给我印象最深刻的一个应用场景是,在多线程的同步锁中,需要在finally块里释放锁。

FileInputStream fis=null;
try{
   fis=new FileInputStream("a.txt");
}
finally{
    if(fis!=null)
    {
    //关闭磁盘文件
      fis.close();
    }
}

为了避免代码的臃肿,try块有了自动关闭资源的功能,从此可以不用finally了。但对try块有规定,其资源实现类必须实现AutoCloseable或Closeable接口。

 //声明和初始化都要在括号里
try( FileInputStream fis=new FileInputStream("a.txt") )
 {
  //其它代码
 }
throws和throw

(1)throws

throws和try…catch块的作用是一样的,都是用于处理异常,使用时二者选一即可。两者的区别在于,如果在定义方法时,使用throws声明抛出异常,则出现问题后会将该异常抛给上一级,自己不进行处理。
throws的使用规则如下:

  • 如果一个方法调用了另一个带throws声明的方法,那此方法要么放在try块里,要么也声明throws。因为throws是将异常抛给上一级,那上一级肯定得进行处理。
  • 儿子抛出的异常不能比老子大。子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同。

throws的使用举例如下:

public class ThrowsTest{
   public static void main(String[] args) throws IOException{
       FileInputStream fis=new FileInputStream("a.txt");
   }
}

(2)throw

try…catch…finally和throws用于当程序出现问题时,系统自动抛出异常。throw用于出现与业务需要不符时,程序自行抛出异常。一个是被动,一个是主动。
使用举例如下:

if(age<0)
{
  Exception e = new Exception();//创建异常对象
  throw e;//抛出异常
}
  System.out.println(age);

(3)两者区别

通常在一个方法(类)的声明处通过throws声明可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。

<think>好的,我需要回答用户关于.NET和C#的区别的问题。首先,我要确保自己正确理解这两个概念。 .NET是一个开发平台,包括运行时环境、框架库和工具,支持多种语言,比如C#、VB.NET、F#等。而C#是专门为.NET设计的一种编程语言,语法类似于C++和Java。用户可能混淆了平台和语言的关系,需要明确区分。 接下来,我应该从几个方面来比较它们的区别:定义、组成部分、跨语言支持、运行机制、应用场景等。需要举例说明,比如C#代码如何在.NET上运行,或者.NET如何支持其他语言。 还要注意技术细节的准确性,比如.NET Core和.NET Framework的区别,.NET 5+的统一情况,以及CLR的作用。同时,避免使用专业术语过多,用简单易懂的中文解释。 可能用户想知道为什么有时候需要同时提到.NET和C#,或者在选择学习时应该怎么考虑。因此,在回答中可以加入学习建议,帮助用户理解两者在实际开发中的角色。 最后,检查是否有遗漏的重要点,确保结构清晰,分点明确,让用户能够逐步理解两者的区别和联系。</think>**答案分为四个层次帮您理解两者的本质区别:** --- ### **一、核心定位差异(最关键区别)** 1. **C#** - **编程语言**(语法规则+编译器) - 类似:Java语言、Python语言 - 特征:强类型、面向对象、支持函数式编程 2. **.NET** - **跨平台运行时框架** - 包含: $$ \text{.NET} = \text{CLR(运行时)} + \text{BCL(基础库)} + \text{工具链} $$ - 类似:JVM(Java虚拟机)、Node.js运行时 --- ### **二、技术实现关系** - **C#代码执行路径** ```mermaid graph LR A[C#源码] --> B[编译器(csc.exe/roslyn)] B --> C[IL中间语言] C --> D[.NET CLR即时编译] D --> E[机器码执行] ``` - **.NET的核心组件** | 组件 | 作用 | 类比参考 | |---|---|--| | CLR | 内存管理/即时编译/异常处理 | Java的JVM | | FCL | 类库(如System.IO) | Java的JDK | | CLI | 跨语言规范(CTS/CLS) | 多语言互通基础 | --- ### **三、跨语言特性对比** || C# | .NET | |---|---|---| | 语言绑定 | 专属语法 | **支持多语言** | | 示例 | 只能写C#代码 | 可运行VB.NET/F#/IronPython等 | | 交互方式 | 需符合C#规范 | 通过CLI标准互通 | **代码示例(.NET多语言协作)** ```csharp // C# 类 public class Calculator { public int Add(int a, int b) => a + b; } ``` ```vbnet ' VB.NET 调用C#类 Dim calc = New Calculator() Console.WriteLine(calc.Add(3,5)) ``` --- ### **四、版本演进与发展** 1. **.NET Framework时代** - 仅限Windows - C# 1.0~7.0 逐步增强语言特性 2. **.NET Core革新** - 跨平台(Linux/macOS) - 性能优化(Kestrel/ASP.NET Core) 3. **.NET 5+统一** - 合并Framework/Core/Xamarin - C# 8.0~11 新增模式匹配/记录类型等 --- ### **学习建议** 1. **先学C#语法**(变量/面向对象/LINQ) 2. **再深入.NET机制**(依赖注入/中间件原理) 3. **实战推荐路径** ```text C#基础 → ASP.NET Core Web开发 → 微服务架构 → 跨平台部署 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卡夫卡的熊kfk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值