Java2EE练习及面试题_chapter07异常处理

简介: Java2EE练习及面试题_chapter07异常处理

面试01

运行时异常与一般异常有何异同
答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

面试02

Java中的异常处理机制的简单原理和应用
答:当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。
违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

面试03

垃圾回收的优点和原理。并考虑2种回收机制
答:Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。


面试04

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。

面试05

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:会执行,在return前执行

面试06

给我一个你最常见到的runtime exception
答:常见的运行时异常有如下这些ArithmeticException, ArrayStoreException, 
BufferOverflowException, BufferUnderflowException, CannotRedoException, 
CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException,
DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

面试07

error和exception有什么区别
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况

面试08

写出程序结果
class Demo {
  public static void func() {
    try {
      throw new Exception();
    } finally {
      System.out.println("B");
    }
  }
  public static void main(String[] args) {
    try {
      func();
      System.out.println("A");
    } catch (Exception e) {
      System.out.println("C");
    }
    System.out.println("D");
  }
}
【答案】
//编译不通过
编译失败:
如果func放上声明了该异常。结果是?B C D

面试09

写出程序结果  
class Demo {
  public static void main(String[] args) {
    try {
      showExce();
      System.out.println("A");
    } catch (Exception e) {
      System.out.println("B");
    } finally {
      System.out.println("C");
    }
    System.out.println("D");
  }
  public static void showExce() throws Exception {
    throw new Exception();
  }
}
【答案】
//BCD

面试10

写出程序结果
class Demo {
  public static void func() {
    try {
      throw new Exception();
      System.out.println("A");
    } catch (Exception e) {
      System.out.println("B");
    }
  }
  public static void main(String[] args) {
    try {
      func();
    } catch (Exception e) {
      System.out.println("C");
    }
    System.out.println("D");
  }
}
【答案】
//编译失败。 因为打印“A”的输出语句执行不到。
throw单独存在,下面不要定义语句,因为执行不到。

面试11

写出程序结果
class Exc0 extends Exception {
}
class Exc1 extends Exc0 {
}
class Demo {
  public static void main(String[] args) {
    try {
      throw new Exc1();
    } catch (Exception e) {
      System.out.println("Exception");
    } catch (Exc0 e) {
      System.out.println("Exc0");
    }
  }
}
【答案】
编译不通过!
多个catch时,父类的catch要放在下面。


面试12

写出程序结果  
class Test {
  public static String output = "";
  public static void foo(int i) {
    try {
      if (i == 1)
        throw new Exception();
      output += "1";
    } catch (Exception e) {
      output += "2";
      // return;
    } finally {
      output += "3";
    }
    output += "4";
  }
  public static void main(String args[]) {
    foo(0);
    System.out.println(output);//
    foo(1);
    System.out.println(output);//
  }
}
【答案】
  //134
  //134234


面试13

写出程序结果
public class ReturnExceptionDemo {
  static void methodA() {
    try {
      System.out.println("进入方法A");
      throw new RuntimeException("制造异常");
    } finally {
      System.out.println("用A方法的finally");
    }
  }
  static int methodB() {
    try {
      System.out.println("进入方法B");
      // throw new Exception();
      return 1;
    } catch (Exception e) {
      return 3;
    } finally {
      System.out.println("调用B方法的finally");
      // return 2;
    }
  }
  public static void main(String[] args) {
    try {
      methodA();
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
    int i = methodB();
    System.out.println(i);
  }
}
【答案】
进入方法A
用A方法的finally
制造异常
进入方法B
调用B方法的finally

面试14

以下代码的执行过程?
  public static void main(String[] args) {
    int test = test(3,5);
    System.out.println(test);
  }
  public static int test(int x, int y){
    int result = x;
    try{
      if(x<0 || y<0){
        return 0;
      }
      result = x + y;
      return result;
    }finally{
      result = x - y;
    }
  }
答案:8

面试15

请仔细阅读下列测试代码,请问如何处理才能使程序正常输出“这是个异常,不是错误”,并且不会报告任何错误或者异常信息?
  public class Test{
  public static void main(String[] args) {
    int[] arr ={1,1,1,1};
    for(int i = 0 ; i < 5;i++){
      System.out.println(arr[i]);
    }
    System.out.println("这是个异常,不是错误");
   }
  }

面试16

    // 请编写程序举例抛出一个类型转换异常
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-10-01 16:38
 */
public class Exer3 {
    public static void main(String[] args) {
        // 请编写程序举例抛出一个类型转换异常
//        Exception in thread "main" java.lang.NumberFormatException: null
//        at java.lang.Integer.parseInt(Integer.java:542)
//        at java.lang.Integer.parseInt(Integer.java:615)
//        at com.jerry.exer.Exer3.main(Exer3.java:11)
        int i =1;
        i= Integer.parseInt(null);
        System.out.println(i);
    }
}

面试17

//请编写程序举例抛出一个空指针异常
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-10-01 16:40
 */
public class Exer4 {
    //请编写程序举例抛出一个空指针异常
//    Exception in thread "main" java.lang.NullPointerException
//    at com.jerry.exer.Exer4.main(Exer4.java:12)
    public static void main(String[] args) {
        P p = new P();
        p=null;
        System.out.println(p.info());
    }
}
class P {
    boolean info() {
        return false;
    }
}

面试18

//请编写程序举例抛出一个数组索引越界异常
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-10-01 16:43
 */
public class Exer5 {
    //请编写程序举例抛出一个数组索引越界异常
//    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
//    at com.jerry.exer.Exer5.main(Exer5.java:12)
    public static void main(String[] args) {
        int[] arr={0,1,2,3,4};
        for (int i = 0; i < 6; i++) {
            System.out.println(arr[i]);
        }
    }
}

面试19

//    请编写程序举例抛出一个字符串索引越界异常
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-10-01 16:46
 */
public class Exer6 {
    //    请编写程序举例抛出一个字符串索引越界异常
//Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
//    at java.lang.String.charAt(String.java:658)
//    at com.jerry.exer.Exer6.main(Exer6.java:11)
    public static void main(String[] args) {
        String str = "12345";
        System.out.println(str.charAt(6));
    }
}

面试20

//请编写程序举例说明,在数组索引越界异常中,如果只适用try finally,捕获到的异常不会被处理,程序仍然中断。
package com.jerry.exer;
/**
 * @author jerry_jy
 * @create 2022-10-01 16:59
 */
public class Exer7 {
    /*
    //请编写程序举例说明,在数组索引越界异常中,如果只适用try finally,捕获到的异常不会被处理,程序仍然中断。
1
2
3
4
5
程序结束!
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
  at com.jerry.exer.Exer7.main(Exer7.java:15)
     */
    public static void main(String[] args) {
        try {
            int[] arr = {1, 2, 3, 4, 5};
            for (int i = 0; i < 6; i++) {
                System.out.println(arr[i]);
            }
        }
//        catch (ArrayIndexOutOfBoundsException exception){
//            System.out.println("数组下标越界!");
//        }
        finally {
            System.out.println("程序结束!");
        }
    }
}

END

相关文章
|
7天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
24 2
|
12天前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
12天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
17天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
11天前
|
Java 开发者
Java中的异常处理:从基础到高级
【10月更文挑战第35天】在Java的世界里,异常处理是维护程序健壮性的关键。本文将深入浅出地探讨Java的异常处理机制,从基本的try-catch语句到自定义异常类的实现,带领读者理解并掌握如何在Java中优雅地处理错误和异常。我们将通过实际代码示例,展示如何捕获、处理以及预防潜在的运行时错误,确保程序即使在面临意外情况时也能保持稳定运行。
30 7
|
14天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
39 4
|
11天前
|
Java 数据库连接 开发者
Java中的异常处理机制及其最佳实践####
在本文中,我们将探讨Java编程语言中的异常处理机制。通过深入分析try-catch语句、throws关键字以及自定义异常的创建与使用,我们旨在揭示如何有效地管理和响应程序运行中的错误和异常情况。此外,本文还将讨论一些最佳实践,以帮助开发者编写更加健壮和易于维护的代码。 ####
|
14天前
|
Java
Java 异常处理下篇:11 个异常处理最佳实践
本文深入探讨了 Java 异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理的异常、不要忽略捕获的异常、抛出具体检查性异常、正确包装自定义异常、记录或抛出异常但不同时执行、避免在 `finally` 块中抛出异常、避免使用异常进行流程控制、使用模板方法处理重复的 `try-catch`、尽量只抛出与方法相关的异常以及异常处理后清理资源。通过遵循这些实践,可以提高代码的健壮性和可维护性。
|
14天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
15天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
33 2

热门文章

最新文章

下一篇
无影云桌面