JavaRush /Java 博客 /Random-ZH /Java 中的异常
Roman
第 33 级

Java 中的异常

已在 Random-ZH 群组中发布
当我遇到“例外”这个主题时,出现了许多问题,我必须在互联网的各个角落寻找答案,才能详细了解它是如何运作的。因此,我整理了自己的解释,对于刚刚遇到这种现象的初学者来说可能更容易理解。 Java 中的异常 - 1在计算机中,中断是向处理器发出的传入信号,表明正在发生需要立即响应的事件。中断信号要求处理器暂停正在运行的程序,以便稍后可以继续运行,也就是说,计算机必须记住与程序执行相关的所有信息。这种中断即使不是致命的,也是暂时的。此类中断可能是由程序代码或某些硬件功能引起的(例如,简单地按键盘上的按键;例如,自动关闭计算机的计时器)。中断的数量被限制在一定数量,内置于特定处理器的生产中,也就是说,为此分配了特殊的通信“通道”,允许您绕过所有其他进程来访问处理器。 当执行程序代码中发生错误时(例如,发生被零除的错误),也会自动生成中断。这种中断传统上称为陷阱或异常。在这种情况下,习惯上说:“异常被抛出”,即触发了异常或抛出了异常(抛出),即请求中断带着“做什么?”的问题 发送到处理器。此时,处理器停止工作,记住它停止的点,或者更确切地说是下一个单元的簇,必须执行该信息。已执行和未执行的指令的整个链都会被记住。之后,处理器从内存中读取指令,以便在发生此类错误时采取行动。根据这条指令,它可以将新的值输入到某些簇中,添加一些动作链或一个新的循环(例如,返回或循环循环)等,即根据错误,先前放置执行向下指令。计算机系统本身内置了许多自动中断,这些中断在一定时间后被触发,例如,控制计算机上运行的进程或运行设置的警报、收集传入的外部信号以及各种数据转换器。值得记住的是,由于多种原因,大量中断可能会导致系统完全“挂起”。程序代码中的错误将自动导致处理器中断,处理器将尝试根据规定的指令进行处理。但并不是所有的中断都是为了处理它们而设计的,否则它可能会产生一个不适合我们的过程,例如,它只会使应用程序崩溃。因此,在编程时,可以为程序员可能看到错误可能性的特定代码段组织自己的中断。在这种情况下,错误将在程序内进行处理,并且不会联系处理器来获取处理指令。此类块的定义是通过创建“异常”对象来组织的。该对象是在块中自动创建的try-catch。检查该块>try是否存在错误,如果存在错误,程序将转到 块catch,在此采取措施来防止或消除错误。例如,如果我们从键盘输入数字,随后必须进行加减法,那么从键盘输入字母将无法将它们与数字相加(我们用字母 S 表示这两个变量的和)。因此,作为一个团队,try我们必须检查包含数字的数字 A 是否可以与包含字母的数字 B 相加(即 S = A + B),如果这不可能,并且不可能,那么一定必须采取措施,确保错误不会发生,并且带有“做什么?”问题的新中断不会飞至处理器。如果程序中没有异常,则其执行将被处理器中断。如果出现异常,当它被命令“捕获”时try,控制权传递给命令catch,命令可以设置替代解决方案,例如,我们不会将这两个数字相加,而是设置S = A。
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* 字符串“int r = 1;” 由于发生错误而未执行,并且程序将工作直接重定向到异常处理程序(catch 块*/)因此,异常的存在是解决程序内问题的机会,而无需将其抛出到处理器级别。当检测到错误时,在块中自动创建的“Exception”对象try包含错误类型的值。我们将其称为“OurException”——针对我们的具体情况,并描述我们的具体错误。Java语言的创建者预先创建了一定的典型错误列表以及纠正这些错误的典型选项,也就是说,在java中存在一定的异常库,我们可以利用它来处理已经发生的错误,以便不要自己编写处理代码,因此 OurException 很可能已经有人被描述过,因此我们只需要知道将哪些异常的名称插入到我们的程序中以处理可能发生故障的代码。如果我们犯了错误并从库中选择了不正确的异常,那么处理程序将不会“捕获”它,该错误将不会在程序中找到解决方案,并且请求将被发送到处理器。但对于懒人来说,有一个方法。如果我们不知道库中需要的异常的名称,那么我们可以使用名称为“ Exception ”的通用异常,如上面的示例所示。此异常能够处理任何类型的错误,但它无法提供我们可以记录的有关事件的特定信息。先前编写的异常库由已检查和未检查的异常组成。可检查的是那些可以在不中断程序工作的情况下进行纠正的文件,也就是说,如果我们尝试打开不存在的文件夹中的文件,系统会让我们知道,我们可以删除该文件进入所需的文件夹并继续程序。也就是说,事实上,一个中断请求被发送到处理器,但没有问:“看看如何解决这个问题?!?!” 我们发送了一个中断,这是我们自己检测到的,带有一条现成的指令,处理器处理该指令并继续执行程序。未检查的是那些无法纠正的错误,程序将在完成之前关闭,即向处理器发送中断请求,无论如何都会中断程序的执行。在程序中编写此类异常的唯一目的是让用户了解发生了什么,因为捕获此中断后,我们可以在屏幕上显示一条信息消息,导致程序崩溃。捕获此类中断的第二个原因是能够将它们记录在日志中以供后续分析(您被黑客攻击了,但至少您知道在哪里)。存在此类库的结果是需要记住包含它们。(例如,可以在此处找到带有库的已检查和未检查异常的列表)如果我们不确切知道要包含哪个库或者有多个错误选项,那么我们可以catch在多个中列出所需的异常。如果列表中存在正确的处理程序,系统本身将选择它。您可以编写一个通用的“异常”来代替特定的异常,它可以处理任何类型的异常(如果它在之前的块中未处理)。
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
如果存在块,try则会自动创建异常。如果我们需要在某个时间点强制出现异常,则可以使用该命令throw。也就是说,我们独立创建一个对象new throw......之后,程序停止工作,向处理器发送中断请求并转移到程序部分catch,从那里尝试获取进一步操作的指令。通过手动创建Exception,我们可以从库中指定其特定类型:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
那么处理程序将搜索catch具有此特定异常的- 在整个程序中搜索所有方面catch。在throw异常处理命令之后,除了块中的代码之外,所有剩余的程序代码将不会被执行catch。如果在程序中找不到处理程序,则会向处理器询问以下问题:“自己决定要做什么”,然后它会中断程序。调用...可以在块内部和外部(程序中的任何位置) new throw进行>try
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

例外情况通知

以前由某人编写的方法可能包括抛出异常。为了保险起见,编写代码的程序员警告后来的程序员,他编写的方法可能会出现错误。因此,例如下面描述的文件创建方法规定创建文件时可能会发生错误(给定路径没有文件),这意味着需要一个错误处理程序:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
但同时,没有处理程序本身,这意味着现在我们将无法在正常模式下简单地调用程序中编写的方法。现在我们必须编写一个错误处理程序并在块中调用此方法try
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

本机异常

如果现有的库不足以满足我们的需求,则可以编写自己的异常来处理某些错误。为此,我们只需创建一个继承自 Exception 类的类
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
创建自己的异常时需要记住两条规则:
  1. 我们的类名必须以“Exception”结尾
  2. 该类必须包含一个带有描述异常问题详细信息的字符串变量的构造函数。在构造函数中,调用超级构造函数并传递消息。
使用生成的异常的示例:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
我们用代码捕获这个异常:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
执行程序的结果将是: StudentNotFoundException: Could not find Student with ID 0000001

为什么需要写异常?

1996 年,阿丽亚娜 5 号火箭因浮点变量到整型变量的错误转换而坠毁。对于这种情况没有例外或处理程序。如果在下载文件时与 Internet 的连接丢失,则异常的存在将允许您在连接恢复后继续下载。如果没有异常,则必须重新开始下载。

参考:

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION