更新时间:2022-11-15 10:24:04 来源:极悦 浏览1985次
相信大家对Java的关键字已经有所了解,在学习Java中了解如何在 Java 中抛出异常非常重要。这将允许您创建更高质量的代码,在编译时而不是运行时检查错误,并创建使调试和恢复更容易的自定义异常。
抛出异常就像使用“throw”语句一样简单。然后指定Exception要抛出的对象。每个 Exception 都包含一条消息,该消息是人类可读的错误描述。它通常与用户输入、服务器、后端等问题有关。下面是一个显示如何抛出异常的示例:
throw new Exception("Exception message");
使用通用异常是有局限性的,因为它使调用代码难以捕获它。最好抛出自定义异常,稍后我们会回过头来讨论。
Throws是一个关键字,用于指示此方法可以抛出此类异常。调用者必须使用try-catch块处理异常或传播异常。我们可以抛出已检查或未检查的异常。
throws关键字可以让编译器帮你写出处理这类错误的代码,但它并不能阻止程序的异常终止。在throws关键字的帮助下,我们可以向方法的调用者提供有关该方法可能抛出的异常类型的信息。
type method_name(parameters) throws exception_list
在上面的语法中,exception_list 是一个方法可能抛出的所有异常的逗号分隔列表。例如:
void testMethod() throws ArithmeticException, ArrayIndexOutOfBoundsException {
// rest of code
}
在下面的示例中,我们创建了一个测试方法来演示抛出异常。该toString()方法返回对象的文本表示,但在本例中变量为空。在空引用上调用方法或尝试访问空引用的字段将触发NullPointerException.
static void testMethod() throws Exception {
String test = null;
test.toString();
}
这必须用 try/catch 块处理:
public class Example {
public static void main(String[] arg) {
try {
testMethod();
} catch (Exception e) {
e.printStackTrace();
}
}
}
要在您的应用程序中更有效地使用异常,了解如何创建和抛出您自己的异常非常重要。但在我们开始抛出异常之前,让我们先深入了解一下:我们将描述异常是什么以及如何定义您自己的异常,从所有 Java 异常都源自的全局异常类开始:
package java.lang;
public class Exception extends Throwable {
static final long serialVersionUID = -3387516993124229948L;
public Exception() {
super();
}
public Exception(String message) {
super(message);
}
public Exception(String message, Throwable cause) {
super(message, cause);
}
public Exception(Throwable cause) {
super(cause);
}
protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
该类Exception是表示可恢复异常的所有类的超类。当抛出异常时,它们可能会被应用程序代码捕获。异常类扩展Throwable。构造函数包含两个参数:消息和原因。detailMessage 参数给出了这个异常的消息的详细信息,throwable 参数给出了这个异常的原因。
Java 中有两种类型的异常:已检查(编译时)异常和未检查(运行时)异常。为清楚起见,我们还将讨论错误与 Java 中的异常有何不同。
必须在编译时捕获和处理已检查的异常。如果编译器没有看到tryorcatch块或throws关键字来处理已检查的异常,它会抛出一个编译错误。检查异常通常是由代码外部的错误引起的,例如丢失文件、无效类名和网络错误。
FileInputStream fis = null;
try {
fis = new FileInputStream("B:/myfile.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
rollbar.error(e, "Hello, Rollbar");
}
未经检查的异常不需要显式处理;它们发生在执行时,也称为运行时。这些异常通常可以通过良好的编码实践来避免。它们通常是由编程错误引起的,例如逻辑错误或 API 使用不当。这些异常在编译时被忽略。例如:
public class Main {
public static void main(String[] args) {
int a = 10, b = 0;
System.out.println(a/b);
}
}
上面的示例将ArithmeticException在程序运行时引发 an,因为数字不能被 0 除。它会抛出未处理的异常,程序将结束。
人们通常将“错误”和“异常”通俗地称为同一事物。但是,在 Java 中,这些是不同的概念。错误由 Java 虚拟机抛出,无法捕获或处理。它们派生自 java.lang.Error,它们是由于应用程序运行环境中的某些错误而发生的。例如,堆栈溢出和内存不足异常是导致应用程序退出的环境错误。
Java 的内置异常并不总能提供我们需要的信息。因此,我们有时需要用自己的异常来补充这些异常。在一些特定的操作过程中,如果你的应用程序发生了异常,你需要恢复并让用户知道。自定义异常为您提供更多控制权,以提供有关问题的额外数据并处理代码中的异常。
最佳实践是使用新类扩展java.lang.Exception类,遵循 JDK(Java 开发工具包)提供的一般命名约定。新类需要一个将字符串作为错误消息的构造函数——它被称为父类构造函数。
public class HandledException extends Exception {
private String code;
public HandledException(String code, String message) {
super(message);
this.setCode(code);
}
public HandledException(String code, String message, Throwable cause) {
super(message, cause);
this.setCode(code);
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
例如,假设一个程序无法连接到数据库。您可以使用自定义异常来收集数据库 URL、用户名、密码等信息。在该catch块中,您可以将此信息写入日志并向用户显示一条基本消息,例如“无法连接到数据库”。
public class MainClass {
private static String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
private static final Logger logger = Logger.getLogger(MainClass.class);
public static void main(String[] args) {
try {
makeDatabaseConnection();
} catch (HandledException e) {
rollbar.error(e, "Hello, Rollbar");
// Display custom message to the user
System.out.println("Code: "+e.getCode()+” Exception Message : ”+e.getMessage());
// Log the exception detail
logger.error("Exception: ", e);
}
}
static void makeDatabaseConnection() throws HandledException {
String dbURL = "jdbc:sqlserver://localhost\sqlexpress";
String userName = "sa";
String password = "secret";
Connection conn = null;
try {
conn = DriverManager.getConnection(dbURL, userName, password);
} catch (SQLException e) {
rollbar.error(e, "Hello, Rollbar");
throw new HandledException(DATABASE_EXCEPTION,"Failed to connect to database", e);
}
}
}
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习