Java异常和异常处理(主要是try-catch的掌握)

异常

1、异常介绍

(1)基本概念

Java语言中,将程序执行中发生的不正常情况称为“异常”.(开发过程中的语法错误和逻辑错误不是异常)

快捷键: ctrl+alt+t,选中try-catch

执行过程中的异常可以分为两大类:

  1. Error(错误):Java虚拟机无法解决的严重问题。比如:JVM系统内部错误,资源耗尽等严重情况。比如:StackOverFlowErrorOOM(out of memory),Error是严重错误,程序会崩溃。
  2. Exception:其他因为编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等。Exception分为两类:运行时异常和编译时异常
(2)异常体系图

这里画了一些常见经典的异常。

在这里插入图片描述

总结:

  1. 异常分为两大类,运行时异常和编译时异常
  2. 运行时异常,编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类以及它的子类都是运行时异常。
  3. 对于运行时异常,可以不做处理,因为这类异常很普遍,如果全部处理会对程序的可读性和运行效率产生影响。
  4. 编译时异常,是编译器要求必须处置的异常,不然编译不能通过,直接报错。

2、运行时异常

常见的运行时异常(RuntimeError)

  1. NullPointerException 空指针异常
  2. ArithmeticException 数字运算异常
  3. ArrayIndexOutOfBoundsException 数组下标越界异常
  4. ClassCastException 类型转换异常
  5. NumberFormatException 数字格式不正确异常

3、编译时异常

编译异常实在编译期间,就必须处理的异常,否则代码不能通过编译。

常见的编译异常有:

  1. SQLException 操作数据库,查询表可能发生异常
  2. IOException 操作文件时,发生的异常
  3. FileNotFoundException 当操作一个不存在的文件时,发生的异常
  4. EOFException 操作文件,到文件末尾,发生异常
  5. IllegalArguementException参数异常

4、异常处理

异常处理就是当异常发生事,对异常处理的方式

异常处理的方式:

  1. try-catch-finally 程序元在代码中捕获发生的异常,自行处理

    处理机制:

    try{
        代码/可能有异常
    }catch(Exception e){
        //捕获异常
        //1、当异常发生时
        //2、系统将异常封装成Exception对象e,传递给catch
        //3、得到异常对象后,程序员,自己处理
        //4、注意,如果没有发生异常,catch代码块不执行
    }finally{
        //1、不管try代码块是否有异常发生,始终要执行finally
        //2、所以,通常将释放资源的代码,放在finally
    }
    
  2. throws 将发生的异常抛出,交给调用者(方法)来处理,最顶级的就是JVM

    处理机制:

    在这里插入图片描述

(1)try-catch方式处理异常注意事项
  1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch

  2. 如果异常没有发生,则会顺序执行try里面的代码块,不会进入到catch

  3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally

  4. 可以有多个catch,捕获不能的异常(进行不同的业务处理),要求父类异常在后面,子类异常前面(比如:Exception在后,NullPointerException在前,如果发生异常,只会匹配一个catch

    举例:

    public class TryCatchDetail01 {
        public static void main(String[] args) {
            //多个异常,可以多个catch,但是要求子类写在前面,父类写在后面
            try {
                Person person = new Person();
                System.out.println(person.getName());   //空指针异常
                int n1 = 10;
                int n2 = 0;
                int res = n1/n2;                    //算术异常
            } catch (NullPointerException e){
                System.out.println("空指针异常"+e.getMessage());
            }catch (ArithmeticException e){
                System.out.println("算术异常"+e.getMessage());
            }
            catch (Exception e) {
                System.out.println(e.getMessage());
            } finally {
            }
        }
    }
    
    class Person{
        private String name;
    
        public Person() {
        }
        public String getName() {
            return name;
        }
    }
    
  5. 可以进行try-finally配合使用,这种相当于没有捕获异常,程序会直接崩溃。应用场景,执行一段代码,不管是否发生异常,都会执行某个业务逻辑。

    try{
        //可能发生的语句
    }finally{
        //必须执行的
    }
    

5、throws处理异常

(1)基本介绍
  1. 如果一个方法(中的执行语句时)可能呢生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,表明该方法不对这些异常进行处理,而是由该方法的调用者进行处理。
  2. 在方法声明中用throws语句可以什么抛出异常的列表,throw后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

举例:

//    public void f2() throws FileNotFoundException{
//    public void f2() throws FileNotFoundException, NullPointerException, ArithmeticException{
    public void f2() throws Exception{
        //抛出异常,让调用f2的调用者进行处理
        //throws后面可以是当前异常的父类,也可以抛出多个异常
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}
(2)注意事项和使用细节
  1. 对于编译异常,必须进行处理
  2. 对于运行异常,程序没有运行,默认是throws处理
  3. 子类重写父类的方法是,对于抛出异常的规定:子类重写的方法,所抛出的异常要么和父类抛出的异常一致,要么是父类抛出异常的子类。
  4. throws的过程中,如果有方法try-catch,就相当于处理异常,可以不用throws

举例:

public class ThrowsDetails {
    public static void main(String[] args) {
        
    }
    public static void f1(){
        //运行时异常,会默认throws
        f2();
    }
    public static void f2() throws NullPointerException{  
    }
    
    public static void f3() throws Exception{
        //而编译类型的异常必须进行处理,否则会报错,调用者抛出的异常可以是之前的异常,或者之前的异常的父类
        f4();
    }
    public static void f4() throws FileNotFoundException {
    }
}

class A{
    public void f1() throws Exception{
    }
}

class B extends A{
    @Override
    //子类抛出的异常必须是父类的子类或者父类的异常
    public void f1() throws NullPointerException {
    }
}

6、自定义异常

(1)基本概念

当程序中出现了某些错误,但是该错误信息并没有在Throwable的子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

(2)基本步骤
  1. 定义类,自定义异常类名,继承Exception或者RuntimeException
  2. 如果继承的是Exception,属于编译异常
  3. 如果继承的是RuntimeException,属于运行异常,一般来说都是继承RuntimeException

举例:

//自定义一个异常
//一般情况下,都是自定义为运行时异常,RuntimeException,这样可以使用默认的处理机制
class AgeException extends RuntimeException{
    public AgeException(String message) {//构造器
        super(message);
    }
}
(3) throws对比throw
意义位置后面跟的东西
throws异常处理的方式方法声明处异常类型
throw手动生产异常对象的关键字方法体中异常对象

举例:

public class CustomException {
    //throws
    public static void main(String[] args) throws Exception{
        int age = 180;
        if(!(age >= 18 && age <= 120)){
            //这里可以根据构造器,设置信息
            //throw
            throw new AgeException("年龄需要在18和120之间");
        }
        System.out.println("年龄范围正确");
    }
}
  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "throws"是Java中用于抛出异常的关键字,可以在方法声明中使用。当方法可能抛出异常时,可以使用"throws"在方法声明中列出异常类型。 例如,假设我们有一个方法用于读取文件内容: ```java public void readFile(String filename) throws IOException { // 读取文件内容的代码 } ``` 在方法声明中使用"throws IOException"表示该方法可能会抛出IOException异常。这意味着在调用该方法时,我们需要使用try-catch语句捕获这个异常: ```java try { readFile("example.txt"); } catch (IOException e) { System.out.println("发生了IO异常:" + e.getMessage()); } ``` 如果不捕获这个异常,程序将会终止并输出一个错误信息。因此,在使用"throws"时,我们需要确保在调用方法时捕获所有可能抛出的异常,以确保程序的稳定性。 ### 回答2: Java中的异常处理是开发者必须掌握的一项技能,处理异常可以提高程序的健壮性和稳定性。其中,throws是Java中一个可以在方法签名中抛出异常的关键字,可以用于将异常抛出给调用当前方法的代码进行处理。 当一个方法可能出现异常,但难以针对其立即捕获和处理时,可以使用throws将异常传递到调用它的方法中,由后者接收并处理。使用throws时需要在方法签名中声明需要抛出哪些异常,如: ```java public void readFile() throws IOException { // 读文件操作 } ``` 以上方法签名表示readFile()可能会抛出IOException异常,需要使用者来处理异常。 对于throws抛出的异常,调用方可以选择使用try-catch块进行捕获处理,或者也可以继续使用throws将异常抛给更上层的调用者处理。如: ```java public void read() throws IOException { try { readFile(); } catch (IOException e) { e.printStackTrace(); // 其他处理逻辑 } } ``` 以上代码中,read()方法调用了readFile()方法,发现readFile()抛出了IOException异常,于是使用try-catch块进行捕获处理。 总的来说,throws关键字可以帮助开发者更好地处理异常,使程序运行更加健壮和可靠。但是,使用throws时应该谨慎,只抛出必要的异常,并附上必要的注释。避免过度使用throws,防止异常处理过于冗长和繁琐,降低代码的可读性和可维护性。 ### 回答3: Java异常处理Java编程中非常重要的一个部分,因为在编写代码时,难免会出现各种错误和异常情况,这时候要能够快速有效地捕获和处理这些异常,以保证程序的稳定运行。其中,使用throws关键字来抛出异常,是Java异常处理的一个重要方面。 当我们在编写Java方法中,预见到了可能会发生异常的情况,可以使用throws关键字来抛出这些异常。这样,调用该方法时,就必须使用try-catch语句来捕获这些异常,并进行相应的处理。其中,throws关键字后面可以跟多个异常类型,表示可能会抛出多种异常。如果不抛出任何异常,则可以使用throws Exception。 使用throws关键字时,需要注意以下几点: 1. 对于已经定义的checked异常,必须使用throws语句在方法签名中声明抛出该异常。例如,FileInputStream的read()方法可能会抛出IOException异常。 2. 并不是所有的异常都需要抛出来,只有在需要程序调用者处理异常时才需要抛出。如果一个方法只是在程序内部处理异常,那么就不需要抛出异常。 3. 方法调用者负责处理被抛出的异常,要么使用try-catch语句来捕获异常处理,要么再向上传递异常。 以下是一个简单的示例代码: public void readFile() throws IOException{ FileInputStream fis = null; try{ fis = new FileInputStream("input.txt"); }catch(IOException io){ System.out.println("文件不存在!"); } } 在上述代码中,readFile()方法使用了throws关键字,表示可能会发生IOException异常。在方法中,我们使用FileInputStream读取文件,如果文件不存在,就会抛出IOException异常,我们使用try-catch语句捕获并处理异常。 总之,在Java异常处理中,throws关键字是一个非常重要的概念,可以让我们有效地在程序中处理各种异常情况。要根据实际情况使用throws,把握好抛出异常处理异常的平衡点,可以让我们编写出更加稳定可靠的Java程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值