예외에 관한 Java 면접 질문
면접 질문은 다음과 같습니다.
1. Java에서 예외란 무엇인가요?
예외는 프로그램 실행 중에 발생할 수 있는 오류 이벤트이며 정상적인 흐름을 방해합니다. 사용자가 입력한 잘못된 데이터, 하드웨어 오류, 네트워크 연결 오류 등 다양한 상황에서 예외가 발생할 수 있습니다.
(학습 영상 공유: java 교육 영상)
Java 문을 실행하는 동안 오류가 발생할 때마다 예외 객체가 생성되고 JRE는 예외를 처리할 예외 핸들러를 찾으려고 시도합니다. 적합한 예외 핸들러가 발견되면 예외 객체가 핸들러 코드에 전달되어 예외를 처리하는 것을 예외 포착이라고 합니다. 핸들러를 찾을 수 없으면 애플리케이션은 런타임 환경에 예외를 발생시키고 JRE는 프로그램을 종료합니다.
Java 예외 처리 프레임워크는 런타임 오류를 처리하는 데만 사용되며, 컴파일 시간 오류는 예외 처리 프레임워크에서 처리되지 않습니다.
2. Java의 예외 처리 키워드는 무엇인가요?
Java 예외 처리에는 네 가지 키워드가 사용됩니다.
throw: 때때로 명시적으로 예외 개체를 생성한 다음 이를 던져 프로그램의 정상적인 처리를 중지하고 싶을 때가 있습니다. throw 키워드는 이를 처리하기 위해 런타임에 예외를 발생시키는 데 사용됩니다.
throws: 메소드에서 확인된 예외를 처리하지 않고 던질 때 메소드 시그니처에 throws 키워드를 사용하여 메소드가 던질 수 있는 예외에 대해 호출자 프로그램에 알려야 합니다. 호출 메서드는 이러한 예외를 처리하거나 throws 키워드를 사용하여 호출 메서드에 전파할 수 있습니다. throws 절과 main() 메소드를 통해 여러 예외를 제공할 수 있습니다.
try-catch: 예외 처리를 위해 코드에서 try-catch 블록을 사용합니다. try는 블록의 시작이고, catch는 try 블록의 끝에서 예외를 처리합니다. try를 사용하여 여러 개의 catch 블록을 가질 수 있으며 try-catch 블록을 중첩할 수도 있습니다. catch 블록에는 Exception 유형이어야 하는 매개변수가 필요합니다.
finally: finally 블록은 선택 사항이며 try-catch 블록에서만 사용할 수 있습니다. 예외는 실행 프로세스를 일시 중지하므로 닫히지 않는 일부 리소스를 열 수 있으므로 finally 블록을 사용할 수 있습니다. finally 블록은 예외 발생 여부에 관계없이 항상 실행됩니다.
3. Java 예외 계층을 설명하세요.
Java 예외는 계층적이며 상속은 다양한 유형의 예외를 분류하는 데 사용됩니다. Throwable은 Java Exceptions Hierarchy의 상위 클래스이며 두 개의 하위 객체(Error 및 Exception)를 갖습니다. 예외는 다시 확인된 예외와 런타임 예외로 구분됩니다.
오류는 하드웨어 오류, JVM 충돌, 메모리 부족 오류 등 애플리케이션 범위를 벗어나 예측 및 복구가 불가능한 특수한 상황입니다.
Checked Exception은 FileNotFoundException과 같이 프로그램에서 예상하고 복구를 시도할 수 있는 특별한 상황입니다. 우리는 이 예외를 잡아서 사용자에게 유용한 메시지를 제공하고 디버깅을 위해 적절하게 기록해야 합니다. Exception은 모든 Checked Exception의 상위 클래스입니다.
런타임 예외는 배열에서 요소를 검색하는 등 잘못된 프로그래밍으로 인해 발생합니다. 요소를 검색하기 전에 배열의 길이를 확인해야 합니다. 그렇지 않으면 런타임에 ArrayIndexOutOfBoundException이 발생할 수 있습니다. RuntimeException은 모든 런타임 예외의 상위 클래스입니다.
4. Java 예외 클래스의 중요한 메소드는 무엇입니까?
Exception 및 모든 하위 클래스는 특정 메서드를 제공하지 않으며 모든 메서드는 기본 클래스 Throwable에 정의됩니다.
String getMessage() - 此方法返回消息String of Throwable,并且可以在通过构造函数创建异常时提供消息。 String getLocalizedMessage() - 提供此方法,以便子类可以覆盖它以向调用程序提供特定于语言环境的消息。此方法getMessage()的可抛出类实现只是使用方法来返回异常消息。 synchronized Throwable getCause() - 此方法返回异常的原因或null id,原因未知。 String toString() - 此方法以String格式返回有关Throwable的信息,返回的String包含Throwable类和本地化消息的名称。 void printStackTrace() - 此方法将堆栈跟踪信息打印到标准错误流,此方法已重载,我们可以将PrintStream或PrintWriter作为参数传递,以将堆栈跟踪信息写入文件或流。
5. Java 7 ARM 기능과 멀티캐치 블록을 설명하세요.
try 블록에서 많은 예외를 포착하면 catch 블록 코드가 매우 보기 흉하고 주로 오류를 기록하기 위한 중복 코드로 구성되어 있다는 것을 알게 될 것입니다. Java 7의 기능 중 하나가 다중 catch 블록이라는 것을 기억하세요. 하나의 catch 블록에서 여러 예외를 잡을 수 있습니다. 이 기능이 포함된 catch 블록은 다음과 같습니다.
catch(IOException | SQLException | Exception ex){ logger.error(ex); throw new MyException(ex.getMessage()); }
대부분의 경우 finally 블록을 사용하여 리소스를 닫지만 때로는 리소스가 고갈되면 닫는 것을 잊어버리고 런타임 예외가 발생합니다. 이러한 예외는 디버그하기 어렵기 때문에 이러한 유형의 리소스를 사용하는 모든 위치를 확인하여 해당 예외를 닫아야 할 수도 있습니다. 따라서 Java 7의 개선 사항 중 하나는 try-with-resources입니다. try 문에서 리소스를 생성하고 이를 try-catch 블록에서 사용할 수 있습니다. try-catch 블록에서 실행이 수행되면 런타임 환경은 이러한 리소스를 자동으로 닫습니다. 이 개선 사항이 포함된 샘플 try-catch 블록은 다음과 같습니다.
try (MyResource mr = new MyResource()) { System.out.println("MyResource created in try-with-resources"); } catch (Exception e) { e.printStackTrace(); }
(더 많은 관련 인터뷰 질문 공유: java 인터뷰 질문 및 답변)
6 Java에서 Checked 예외와 Unchecked 예외의 차이점은 무엇입니까?
Checked Exception은 try-catch 블록을 사용하여 코드에서 처리해야 합니다. 그렇지 않으면 메서드는 throws 키워드를 사용하여 메서드에서 발생할 수 있는 확인된 예외에 대해 호출자에게 알려야 합니다. 확인되지 않은 예외는 프로그램에서 처리하거나 메서드의 throws 절에서 언급할 필요가 없습니다.
Exception은 확인된 모든 예외 RuntimeException의 슈퍼클래스이지만 확인되지 않은 모든 예외의 슈퍼클래스입니다. RuntimeException은 Exception의 하위 클래스입니다.
已检查的异常是需要在代码中处理的错误方案,否则您将收到编译时错误。例如,如果您使用FileReader读取文件,它会抛出FileNotFoundException,我们必须在try-catch块中捕获它或将其再次抛给调用方法。
未经检查的异常主要是由编程不良引起的,例如在对象引用上调用方法时的NullPointerException,而不确保它不为null。例如,我可以编写一个方法来从字符串中删除所有元音。确保不传递空字符串是调用者的责任。我可能会改变方法来处理这些场景,但理想情况下,调用者应该处理这个问题。
7、Java中throw和throws关键字有什么区别?
throws关键字与方法签名一起用于声明方法可能抛出的异常,而throw关键字用于破坏程序流并将异常对象移交给运行时来处理它。
8、如何在Java中编写自定义异常?
我们可以扩展Exception类或其任何子类来创建我们的自定义异常类。自定义异常类可以拥有自己的变量和方法,我们可以使用它们将错误代码或其他与异常相关的信息传递给异常处理程序。
自定义异常的一个简单示例如下所示。
package com.journaldev.exceptions; import java.io.IOException; public class MyException extends IOException { private static final long serialVersionUID = 4664456874499611218L; private String errorCode="Unknown_Exception"; public MyException(String message, String errorCode){ super(message); this.errorCode=errorCode; } public String getErrorCode(){ return this.errorCode; } }
9、Java中的OutOfMemoryError是什么?
Java中的OutOfMemoryError是java.lang.VirtualMachineError的子类,当JVM用完堆内存时,它会抛出它。我们可以通过提供更多内存来通过java选项运行java应用程序来修复此错误。
$>java MyProgram -Xms1024m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=256m
10、“主线程中的异常”有哪些不同的情况?
一些常见的主线程异常情况是:
主线程java.lang.UnsupportedClassVersionError中的异常:
当您的java类是从另一个JDK版本编译并且您尝试从另一个Java版本运行它时,会出现此异常。
主线程java.lang.NoClassDefFoundError中的异常:
此异常有两种变体。第一个是您提供类全名和.class扩展名的地方。第二种情况是找不到Class。
主线程java.lang.NoSuchMethodError中的异常:
main:当您尝试运行没有main方法的类时会出现此异常。
线程“main”中的异常java.lang.ArithmeticException:
每当从main方法抛出任何异常时,它都会打印异常是控制台。第一部分解释了从main方法抛出异常,第二部分打印异常类名,然后在冒号后打印异常消息。
11、Java中的final,finally和finalize有什么区别?
final和finally是java中的关键字,而finalize是一种方法。
final关键字可以与类变量一起使用,以便它们不能被重新分配,类可以避免按类扩展,并且使用方法来避免子类覆盖。
finally关键字与try-catch块一起使用,以提供始终执行的语句即使出现一些异常,通常最终也会用来关闭资源。
finalize()方法由垃圾收集器在销毁对象之前执行,这是确保关闭所有全局资源的好方法。
在三者之中,最后只涉及到java异常处理。
12、当main方法抛出异常时会发生什么?
当main()方法抛出异常时,Java Runtime终止程序并在系统控制台中打印异常消息和堆栈跟踪。
13、我们可以有一个空的catch块吗?
我们可以有一个空的catch块,但它是最差编程的例子。我们永远不应该有空的catch块,因为如果异常被该块捕获,我们将没有关于异常的信息,并且它将成为调试它的噩梦。应该至少有一个日志记录语句来记录控制台或日志文件中的异常详细信息。
14、提供一些Java异常处理最佳实践?
与Java异常处理相关的一些最佳实践是:
使用特定异常以便于调试。
在程序中尽早抛出异常(Fail-Fast)。
在程序后期捕获异常,让调用者处理异常。
使用Java 7 ARM功能确保资源已关闭或使用finally块正确关闭它们。
始终记录异常消息以进行调试。
使用multi-catch块清洁关闭。
使用自定义异常从应用程序API中抛出单一类型的异常。
遵循命名约定,始终以Exception结束。
记录在javadoc中使用@throws的方法抛出的异常。
异常是昂贵的,所以只有在有意义的时候抛出它。否则,您可以捕获它们并提供空或空响应。
相关推荐:java入门教程
위 내용은 Java 면접 질문 - 예외의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!