欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【8】进大厂必须掌握的面试题-Java面试-异常和线程

程序员文章站 2022-04-13 12:08:23
...

Q1。错误和异常有什么区别?

错误是在运行时发生的不可恢复的情况。如OutOfMemory错误。这些JVM错误无法在运行时修复。尽管可以在catch块中捕获错误,但是应用程序的执行将停止并且无法恢复。

而异常是由于输入错误或人为错误等原因而发生的情况。例如,如果指定的文件不存在,则将抛出FileNotFoundException。否则,如果尝试使用null引用,则会发生NullPointerException。在大多数情况下,有可能从异常中恢复(可能是通过向用户提供输入正确值的反馈等)。

Q2。您如何处理Java异常?

Java中有五个关键字用于处理异常:

  1. try
  2. catch
  3. finally
  4. throw
  5. throws

Q3。Checked Exception和Unchecked Exception有什么区别?

检查异常

  • 扩展Throwable类的类(RuntimeException和Error除外)被称为检查异常。
  • 被检查的异常在编译时被检查。
  • 示例:IOException,SQLException等。

未经检查的异常

  • 扩展RuntimeException的类称为未检查的异常。
  • 未检查的异常不会在编译时检查。
  • 例如:ArithmeticException,NullPointerException等。

Q4。关键字final,finally和finalize有什么目的?

final:**

Final用于对类,方法和变量施加限制。不能继承final类,不能覆盖final方法,并且不能更改final变量值。让我们看下面的示例,以更好地理解它。

class FinalVarExample {
    public static void main( String args[]){
        final int a=10;   // Final variable
        a=50;             //Error as value can't be changed
    }
}

finally

最后用于放置重要代码,无论是否处理异常,都将执行该代码。让我们看下面的示例,以更好地理解它。

class FinallyExample {
    public static void main(String args[]){
        try {
            int x=100;
        }catch(Exception e) {
            System.out.println(e);
        }finally {
            System.out.println("finally block is executing");
        }
    }
}

finalize

Finalize用于在垃圾回收之前就执行清理处理。让我们看下面的示例,以更好地理解它。

class FinalizeExample {
    public void finalize() {
        System.out.println("Finalize is called");
    }
    public static void main(String args[]){
        FinalizeExample f1=new FinalizeExample();
        FinalizeExample f2=new FinalizeExample();
        f1= NULL;
        f2=NULL;
        System.gc();
    }
}

Q5。throw和throws有什么区别?

throw throws
引发用于显式引发异常。 引发用于声明异常。
已检查的异常不能仅通过throw传播。 可以使用throws传播检查的异常。
引发后跟一个实例。 投掷之后是上课。
在方法中使用了throw。 抛出与方法签名一起使用。
您不能抛出多个异常 您可以声明多个异常,例如public void method()引发IOException,SQLException。

Q6。什么是Java中的异常层次结构?

层次结构如下:

Throwable是所有Exception类的父类。异常有两种类型:检查的异常和UncheckedExceptions或RunTimeExceptions。两种类型的异常都扩展了Exception类,而错误又进一步分为虚拟机错误和断言错误。

Q7。如何创建自定义异常?

要创建您自己的异常,请扩展Exception类或其任何子类。

  • class New1Exception extends Exception {} //这将创建Checked Exception
  • 类NewException扩展了IOException {} //这将创建Checked异常
  • 类NewException扩展了NullPonterExcpetion {} //这将创建UnChecked异常

Q8。Java异常类的重要方法有哪些?

异常及其所有子类均未提供任何特定方法,并且所有方法均在基类Throwable中定义。

  1. String getMessage() –此方法返回Throwable消息字符串,并且可以在通过其构造函数创建异常时提供该消息。
  2. String getLocalizedMessage()–提供此方法,以便子类可以重写它以向调用程序提供特定于语言环境的消息。此方法的可抛出类实现仅使用getMessage()方法即可返回异常消息。
  3. Synchronized Throwable getCause() –此方法返回异常原因,或者返回null id,原因未知。
  4. String toString() –此方法以String格式返回有关Throwable的信息,返回的String包含Throwable类的名称和本地化消息。
  5. void printStackTrace() –此方法将堆栈跟踪信息打印到标准错误流,此方法已重载,我们可以传递PrintStream或PrintWriter作为参数,以将堆栈跟踪信息写入文件或流。

Q9。进程和线程之间有什么区别?

Process Thread
定义 程序的执行实例称为进程。 线程是进程的子集。
通讯 进程必须使用进程间通信与同级进程进行通信。 线程可以直接与其进程中的其他线程通信。
控制 进程只能控制子进程。 线程可以对同一进程的线程行使相当大的控制权。
变化 父进程中的任何更改都不会影响子进程。 主线程中的任何更改都可能影响该进程其他线程的行为。
记忆 在单独的内存空间中运行。 在共享内存空间中运行。
受控制于 进程由操作系统控制。 线程由程序中的程序员控制。
依存关系 流程是独立的。 线程是依赖的。

Q10。什么是finally块?有没有什么情况下最终将不会执行?

最终块是始终执行一组语句的块。它始终与try块相关联,无论是否发生任何异常。 是的,如果程序通过调用System.exit()或导致致命错误(导致进程中止)退出,则最终将不会执行。

Q11。什么是同步?

同步是指多线程。同步的代码块一次只能由一个线程执行。由于Java支持执行多个线程,因此两个或多个线程可以访问相同的字段或对象。同步是使所有并发线程在执行中保持同步的过程。同步避免了由于共享内存视图不一致而导致的内存一致性错误。当一个方法被声明为已同步时,线程将保持该方法对象的监视器。如果另一个线程正在执行同步方法,则该线程将被阻塞,直到该线程释放监视器。

【8】进大厂必须掌握的面试题-Java面试-异常和线程

Q12。我们可以在单个try块下写入多个catch块吗?

是的,我们可以在单个try块下包含多个catch块,但是方法应从特定到一般。让我们通过一个编程示例来理解这一点。

public class Example {
    public static void main(String args[]) {
        try {
            int a[] = new int[10];
            a[10] = 10 / 0;
        } catch (ArithmeticException e) {
            System.out.println("Arithmetic exception in first catch block");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Array index out of bounds in second catch block");
        } catch (Exception e) {
            System.out.println("Any exception in third catch block");
        }
    }
}

Q13。Java异常类的重要方法有哪些?

方法在基类Throwable中定义。Java异常类的一些重要方法如下所述。

  1. String getMessage() –此方法返回有关异常的消息String。可以通过其构造函数提供消息。
  2. public StackTraceElement [] getStackTrace()–此方法返回一个数组,其中包含堆栈跟踪中的每个元素。索引0处的元素表示调用堆栈的顶部,而数组中的最后一个元素表示调用堆栈底部的方法。
  3. 同步的Throwable getCause() –此方法返回Throwable对象表示的异常原因或null ID。
  4. String toString() –此方法以String格式返回信息。返回的字符串包含Throwable类的名称和本地化消息。
  5. void printStackTrace() –此方法将堆栈跟踪信息打印到标准错误流。

Q14。什么是Java中的OutOfMemoryError?

OutOfMemoryError是java.lang.Error的子类,通常在我们的JVM内存不足时发生。

Q15。什么是线程?

线程是可以由调度程序独立执行的最小编程指令。在Java中,所有程序都将至少具有一个线程,该线程称为主线程。当程序开始执行时,此主线程由JVM创建。主线程用于调用程序的main()。

Q16。创建线程的两种方法是什么?

在Java中,可以通过以下两种方式创建线程:

  • 通过实现Runnable接口。
  • 通过扩展线程

Q17。Java中有哪些不同类型的垃圾收集器?

Java中的垃圾收集程序,可以帮助进行隐式内存管理。由于在Java中,可以使用new关键字动态创建对象,一旦创建对象,该对象将消耗一些内存。一旦工作完成,并且不再有对象的引用,使用垃圾回收的Java将破坏该对象并释放其占用的内存。Java提供了四种类型的垃圾收集器:

相关标签: 大厂面试