异常处理机制(三)——常见异常(解析)

1.NullPointerException

 String s = null;
    s.indexOf("a");
   System.out.println("end");
  • 变量s没有初始化就调用其实例方法indexOf,运行,屏幕输出为:

Exception in thread “main” java.lang.NullPointerException

at ExceptionTest.main(ExceptionTest.java:5)输出是告诉我们:在ExceptionTest类的main函数中,代码第5行,出现了空指针异常(java.lang.NullPointerException)。

当执行s.indexOf(“a”)的时候,Java虚拟机发现s的值为null,没有办法继续执行了,这时就启用异常处理机制,首先创建一个异常对象,这里是类NullPointerException的对象,然后查找看谁能处理这个异常,在示例代码中,没有代码能处理这个异常,因此Java启用默认处理机制,即打印异常栈信息到屏幕,并退出程序。

2.ArithmeticException

  • 在进行数学运算时,尤其是涉及到除法运算时,
    需要对可能出现的异常情况进行处理,以避免程序崩溃或者出现错误结果。
    int a = 10;
   int b = 0;
    int c = a/b;
  • 当程序发生ArithmeticException异常时,可以使用try-catch语句块捕获异常,
    通过处理异常代码,保证程序正常运行
  try {
       int a = 10;
       int b = 0;
       int c = a/b;
    } catch (ArithmeticException e) {
       //处理ArithmeticException异常
       System.out.println("除数不能为0");
    }

3.IllegalArgumentException

  1. java.lang.IllegalArgumentException的原因
    当参数超出范围时。例如,百分比应该在1到100之间。如果用户输入101,则将抛出IllegalArugmentExcpetion 。
    当参数格式无效时。例如,如果我们的方法需要类似YYYY / MM / DD的日期格式,但是用户正在传递YYYY-MM-DD。
    然后我们的方法无法理解,然后将抛出IllegalArugmentExcpetion 。

  2. List item

       当方法需要非空字符串作为参数但传递了空字符串时。
    
   a s1 = new a();
           s1.setMarks(45);
            System.out.println(s1.m);
            a s2 = new a();
            s2.setMarks(101);
           System.out.println(s2.m);
  • 解决IllegalArgumentException的使用步骤

     - 当抛出:IllegalArgumentException 被抛出,我们必须检查在Java中的堆栈跟踪调用堆栈,并找到产生错误的参数的方法。
       该抛出:IllegalArgumentException 是非常有用的,可以用来避免在应用程序代码必须处理未经检查输入数据的情况。
    
  • 如果我们要捕获IllegalArgumentException, 则可以使用try-catch块。
    这样,我们可以处理一些情况。假设在catch块中,如果我们放置代码使用户有另一个机会再次输入而不是停止执行,
    尤其是在循环的情况下,则可以停止执行。

String cont = "y";
    Scanner scan = new Scanner(System.in);
   while (cont.equalsIgnoreCase("y")) {
       try {
           System.out.println("Enter an integer: ");
           int marks = scan.nextInt();
           if (marks < 0 || marks > 100)
               throw new IllegalArgumentException("value must be non-negative and below 100");
           System.out.println(marks);
       } catch (IllegalArgumentException i) {
            System.out.println("out of range encouneterd. Want to continue");
           cont = scan.next();
          if (cont.equalsIgnoreCase("Y")){
       }
   }
}

4.NumberFormatException

  • 在程序中,如果明确知道输入的字符串可能存在非数字字符,
    可以通过异常捕获来解决NumberFormatException异常。以下是一个例子:
   String input="asd123";
     int num;
     try{
         num=Integer.parseInt(input);
     }catch (NumberFormatException e){
        System.out.println("输入的不是数字");
         e.printStackTrace();
    }

5.ArrayStoreException

  • Java中的ArrayStoreException在试图将错误类型的对象存储到对象数组中时发生。
  1. 下面的例子说明了何时会发生ArrayStoreException。
    由于Number类是Double类的一个超类,在Java中,人们可以将子类的对象存储到超类的对象中。
    现在,如果试图将一个整数值存储在Double类型的数组中,在执行过程中会抛出一个运行时错误。
    如果数组的声明是这样的,同样的事情就不会发生。
   try {
       Object a[] = new Double[2];
        a[0] = 4;
   }
   catch (ArrayStoreException e) {
        // When caught, print the ArrayStoreException
        System.out.println("ArrayStoreException found: " + e);
    }

6.NoSuchMethodException

java.lang.NoSuchMethodException意思是没有找到该方法。
第一种情况:根据提示查看方法是否存在
第二种:是访问的方法是受保护的,我们用getDeclaredMethod()来获取方法,getDeclaredMethod的作用是忽略权限修饰符。
如果,想让方法被暴力反射,就修改需要用的方法的修饰符为public即。
第三种:检查此方法是否传了参数,类的方法有参数
第四种:检查类中的方法名字和struts.xml文件中配置的名字相不相符
第五种:清空浏览器缓存
第六种:jar包问题

  Method method = this.getClass().getDeclaredMethod(methedname, HttpServletRequest.class, HttpServletResponse.class);

        //暴力放射
        method.setAccessible(true);
        method.invoke(this,req,resp);

7.ClassCastException

  • 假设我们有一个名为“Person”的类,它有一个名为“name”的字符串属性。
    我们创建了一个Person对象,并将其强制转换为一个整数对象。这将引ClassCastException异常。
   Person person = new Person("John");
    Integer age = (Integer) person; // ClassCastException
  • 解决方案:
    我们应该将类型转换为正确的类型:
 Person person = new Person("John");
   String name = person.getName();

8.IOException

  1. IOException概述
    IOException是Java中的一个异常类。它表示在进行I/O操作的时候发生异常,IO操作包括文件读写,网络通信等。IOException是一个checked
    exception,必须在代码中进行捕捉处理,否则编译器会报错。

  2. IOException使用
    在Java中,如果我们进行I/O操作的时候出现了问题,就会抛出IOException异常。
    为了让代码健壮,我们需要在代码中进行捕获处理。

try {
    // 读取文件
    BufferedReader br = new BufferedReader(new FileReader("test.txt"));
    String sco;
    while ((sco = br.readLine()) != null) {
        // 处理文件内容
    }
    // 关闭文件
    br.close();
} catch (IOException e) {
    // 处理异常
}

9.FileNotFoundException

  1. 常见的FileNotFoundException处理方式
    使用try-catch语句处理异常:使用try-catch语句可以在出现异常时从程序中捕获异常并执行相应的处理过程。下面是一个处理FileNotFoundException异常的示例代码:
      try {
            FileReader fileReader = new FileReader( "test.txt");
            //正常操作文件
   }catch (FileNotFoundException e){
       e.printStackTrace();
       //处理FileNotFoundException异常
   }
  1. 检查文件路径或名称:在处理文件时,一种常见的错误是指定了错误的文件路径或名称。因此,检查文件路径或名称是避免FileNotFoundException异常的有效方法。

  2. 检查文件权限:检查文件是否具有足够的权限可以读取或写入。如果没有足够的权限,可以使用File.setReadable()或File.setWritable()方法分别设置读取和写入权限。

10.ArrayIndexOutOfBoundsException

  1. ArrayIndexOutOfBoundsException异常的原因

    • 我们知道,Java数组是一系列同类型数据的集合,可以用来存储和操作数据。Java数组的索引从0开始,即第一个元素的索引为0,
      第二个元素的索引为1,以此类推。如果试图访问一个索引超出数组范围(即小于0或大于等于数组长度)的元素,就会导致ArrayIndexOutOfBoundsException异常。
  • 当Java程序中出现ArrayIndexOutOfBoundsException异常时,需要在代码中进行相应的处理,以避免程序崩溃或出现其他错误。
    使用try-catch语句块捕捉异常
    可以使用try-catch语句来捕获这个异常,以此来处理这个异常情况。例如:
 int[] numbers=new int[5];
  try{
     System.out.println(numbers[5]);
 }catch (ArrayIndexOutOfBoundsException e){       
    System.out.println("数组索引越界,错误信息:"+e.getMessage());
}
  • 当访问数组索引越界时会抛出异常并被catch语句块捕获。在catch语句块中,我们输出了一个错误信息。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值