知识与技能
大学告诉我们,理论和实践之间没有太大的区别。好吧,你肯定明白那是不一样的。但是您看不到核心区别。然而有一个。 大多数人在“我知道”和“我能”之间划等号。你? 举几个例子怎么样?- 我知道抽烟对我不好,但我还是抽烟。
- 我知道快餐对我不好,但我还是吃了。
- 我知道交通规则,但我不会开车。
- 我知道慢跑对我有好处,但我早上不慢跑。
你已经达到了一个新的水平
9级
1 Risha,堆栈跟踪
- 嘿!今天我将告诉你堆栈跟踪是什么。但首先让我向您解释一下堆栈是什么。- 想象一堆文件 - 某个职员的任务。一个新的赋值可以放到栈顶,他会从一个栈顶取一个赋值。因此,分配将不是先到先得。每次店员接受最后的任务。这样的集合结构称为栈。 -在 Java 中,有一个特殊的集合 - Stack。这个集合有方法 «add an element» 和 «take(get/take away) an element»。如您所知,最后添加的元素将首先被采用。 - 哼。我想这并不难。 - 美好的。然后让我解释什么是堆栈跟踪是。- 想象一下,在 Java 中,函数 А调用函数 B,后者调用函数 C,后者又调用函数 D。因此,要退出功能 B,您必须先退出功能 C,然后您必须退出功能 D。这与堆栈非常相似。 - 相似之处是什么? - 在堆栈中,要完成某个任务,您还必须完成所有放在最上面的任务。 - 好吧,这是一个类比,但我不确定我是否理解正确。 - 看这里。在 Java 中,堆栈是一组元素。这就像一堆纸。要从顶部开始第三张,你必须拿第二张,但在此之前你必须拿第一张。你总是可以放床单和拿床单,但你只能把床单放在上面,也只能从上面拿。这同样适用于函数调用。函数 А调用函数 B,后者调用函数 C。要退出А,您必须先退出B,为此您必须退出C。 - 等一下。如果我做对了,整个堆栈会变成“只能取出放在堆栈上的最后一张纸”和“首先,最后调用的函数应该退出”。是这样吗? - 是的。因此,函数调用的顺序是«函数调用堆栈»,或简称为«调用堆栈»。最后调用的函数必须首先终止。让我们看一下这个例子: - 好的。我想,函数调用一切都很清楚。但是这个StackTraceElement是什么? - Java 虚拟机记录所有函数调用。为此,它有一个特殊的集合——堆栈。当一个函数调用另一个函数时,JVM 会将一个新元素StackTraceElement放入此堆栈中。当函数结束时,元素从堆栈中删除。因此,该堆栈始终存储有关 «函数调用堆栈» 当前状态的最新信息。 - 每个StackTraceElement包含有关被调用方法的信息。因此,您可以使用getMethodName获取此方法的名称。- 上面的例子说明了这一点:- 获取«调用堆栈»:
- 使用循环for-each迭代数组。我希望你没有忘记它。
- 将方法名称打印到System.out。
2 Diego,堆栈跟踪显示上的任务
- 嘿,阿米戈!这是一个在屏幕上显示堆栈跟踪的小任务。任务 | |
---|---|
1个 | 每个方法都应该返回它的 StackTrace 写五个相互调用的方法。每个方法都应返回其 StackTrace。 |
2个 | StackTrace 再写五个相互调用的方法。每个方法都应返回其调用方方法的名称。您可以使用 StackTrace 获取调用方方法。 |
3个 | 该方法应返回调用此方法的代码的行号,从 编写相互调用的五个方法。每个方法都应返回调用此方法的代码的行号。使用函数element.getLineNumber()。 |
4个 | 10 次调用的堆栈跟踪 编写代码以获得 10 次调用的堆栈跟踪。 |
5个 | 该方法应返回一个结果 - 它的堆栈跟踪深度 编写一个显示并返回其堆栈跟踪深度的方法。堆栈跟踪深度是其方法的数量(列表中的元素数量)。 |
3 Elly,错误和异常
- 嘿,阿米戈!今天我们上了一堂非常有趣的课。我会告诉你例外情况。异常是程序中控制错误的一种特殊机制。以下是程序中可能出现的一些错误示例:- 该程序尝试将文件写入整个磁盘。
- 该程序尝试调用存储空引用的变量的方法。
- 该程序试图将一个数除以 0。
- 当错误发生时,Java 虚拟机创建一个特殊的对象——一个异常——包含关于错误的所有信息。对于不同的错误有不同的异常。
- 然后这个异常会强制程序立即中断当前函数,然后中断下一个函数,直到退出 main 方法。之后程序终止。Java 开发人员将此过程称为“回滚调用堆栈”。
- 如果try块内部发生异常,则不再执行该块中的代码,而是开始执行块catch。
- 如果没有异常发生,try 块将执行到结束,并且永远不会执行catch。
4 Elly,RuntimeException,抛出
- 我决定今天提出另一个话题。在 Java 中,所有异常都分为两种类型——受控/受控和不受控/未受控。必须捕获已检查的异常,可以捕获未检查的异常,但这不是必需的。 - 是否可以故意在代码中抛出异常? - 在你的代码中,你可以自己抛出异常。您甚至可以编写自己的异常。但我们稍后会深入这个洞。现在让我们学习如何处理 Java 虚拟机抛出的异常。 - 好的。 - 如果异常ClassNotFoundException和FileNotFoundException被抛出(出现)在一个方法中,程序员必须在方法的签名(方法头)中指定它们。检查此类异常。这就是它通常的样子: - 所以,我们只写抛出并列出用逗号分隔的异常。正确的?是这样吗? - 是的。但还有一件有趣的事。为了编译下面的示例,调用method1()的方法必须捕获这些异常或将它们向前抛出。如果你想向前抛出检查异常,你需要在方法的头中指定它。- 再一次,如果在main方法中,您想调用一个在其标题短语中包含throws FileNotFoundException 的方法,...那么你必须做以下两件事之一:- 捕获异常 FileNotFoundException,......
你必须用try-catch块包装你调用危险方法的代码 - 不要捕获异常 FileNotFoundException,...
5 Risha,滚动调用堆栈,如何在异常中执行
- 我想告诉你更多关于异常如何工作的信息。下面的例子解释说: - 我不明白。 - 好的。我会解释发生了什么。- 在左边的例子中,我们按链式顺序调用了几个方法。在method2()中,我们专门创建并抛出异常(以引发错误)。- 右边的例子显示了会发生什么。查看method2()。这就是异常的创建转换成的:我们创建一个RuntimeException类型的对象,将它存储在一个特殊的变量异常中,然后立即退出方法 - return。- 在method1中,在调用method2之后进行检查,是否有例外;如果有异常,则 method1 立即终止。此检查在调用每个(!)Java 方法后隐式完成。 - 哇! - 确切地。- 在方法main的右侧栏中,我写了当异常被try-catch块捕获时会发生什么。如果没有异常,代码将继续按计划执行。如果存在catch中指定类型的异常,那么我们将处理它。 - throw和instanceof是什么意思? - 看左边最后一行throw new RuntimeException(s). 通过这种方式,我们创建并抛出异常。这只是一个例子。到目前为止我们不会这样做。- 在右侧块中使用命令« аinstanceofB »我们检查对象a是否具有类型B。也就是说,存储在变量 exception 中的对象是否具有 RuntimeException 类型。这是一个合乎逻辑的表达。 - 好吧,它变得更清楚了。6 Diego,异常捕获任务
- 看这里!迭戈叔叔为您带来了很少的任务。祝你好运。我想你会需要它。呵呵。 - 嘿,阿米戈!这里有一些有趣的异常捕获任务。抓任务 | |
---|---|
1个 | 1. 数字操作异常 捕获运行代码时出现的异常: int a = 42 / 0; 在屏幕上显示异常,指定其类型 |
2个 | 2. 操作字符串时 异常捕获运行代码时出现的异常: String s = null; 字符串 m = s.toLowerCase(); 在屏幕上显示异常,指定其类型。 |
3个 | 3. 数组操作 异常捕获运行代码时出现的异常: int[] m = new int[2]; m[8] = 5; 在屏幕上显示异常,指定其类型。 |
4个 | 4. 操作List集合时 出现异常捕获运行代码时出现的异常: ArrayList<String> list = new ArrayList<String>(); 字符串 s = list.get(18); 在屏幕上显示异常,指定其类型。 |
5个 | 5. 操作Map集合时 异常 捕获运行代码时出现的异常: HashMap<String, String> map = new HashMap<String, String>(null); map.put(null, null); 地图.删除(空); 在屏幕上显示异常,指定其类型。 |
7 Risha,多次捕获的工作原理
- 现在,一些更有趣的讲座。我非常喜欢教学。- 我想告诉你多重捕捉是如何工作的。其实很简单:当try块发生异常时,程序执行转移到第一个catch。-如果块 catch 的括号中指定的类型与异常对象的类型相同,则代码执行从 {} 内部开始。否则我们去下一个捕获。在那里重复检查。- 如果没有更多的catch块,但异常还没有被捕获,则向前抛出,并中断当前方法。 - 我懂了。该 catch 将被执行,其类型与异常类型匹配。 - 是的,对。实际上,它有点复杂:关键是类可以相互继承。如果类 «Cow» 继承自类 «Animal»,则类型 «Cow» 的对象不仅可以存储在类型 «Cow» 的变量中,还可以存储在类型 «Animal» 的变量中. - 所以呢? - 因为所有的异常都是从类Exception或RuntimeException继承的(它们也是从Exception继承的),它们都可以使用命令catch (Exception e)或catch (RuntimeException e)来捕获。 - 所以呢? - 这意味着,首先,您可以使用命令 catch(Exception e) 捕获任何异常。其次, catch块的顺序很重要。 示例: -除以 0 导致的 ArithmeticException在第二个 catch 中被捕获。- 在下面的示例中,ArithmeticException在第一个catch中被捕获,因为所有异常的类都是从 Exception 继承的。所以,Exception 捕获任何异常。 - 在下面的示例中,异常ArithmeticException没有被捕获,而是被抛给了调用方法。 - 好吧,现在越来越清楚了。这些异常并不那么容易。 - 似乎只是如此。事实上,它是 Java 中最简单的东西之一。 ——不知该高兴还是不高兴……8 Diego,多个异常捕获任务
- 嘿,阿米戈!昨天我喝醉了,把你的任务搞得过于复杂了,但我希望你没有怨恨,你会解决所有的问题吗?这是为你好 这里:任务 | |
---|---|
1个 | 1. 异常 有一个方法抛出两个继承自Exception的异常,另外两个继承自RuntimeException:NullPointerException、ArithmeticException、FileNotFoundException和URISyntaxException。 您需要捕获NullPointerException和FileNotFoundException,但不需要捕获ArithmeticException和URISyntaxException。怎么做? |
2个 | 2、捕获异常Exception 依次继承了三个异常:class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 有一个方法,描述如下:public static void method1() throws Exception1, Exception2, Exception3 写一个catch阻止捕获所有三个Exception1,Exception2和Exception3 |
3个 | 3. 捕获选择性异常 1. 找出方法BEAN.methodThrowExceptions抛出的异常是什么。 2. 方法processExceptions()应该调用方法BEAN.methodThrowExceptions并处理异常: 2.1。如果发生异常FileSystemException ,则通过调用方法BEAN.log记录它并向前抛出 2.2。如果发生异常CharConversionException或任何其他IOException,只需通过调用方法BEAN.log 记录它 3. 添加您在 2.1 中转发的异常的类/类型。到processExceptions()方法签名。 4. 处理方法main() 中剩余的异常并记录它。使用try..catch 提示:如果您捕获了您不想捕获的 异常MyException ,您可以使用以下代码将其向前抛出: catch (MyException e) { throw e; } |
4个 | 4. 捕获已检查的异常 在方法processExceptions()中处理所有已检查的异常。 您需要在屏幕上显示已发生的每个已检查异常。 您可以只使用一个块try。 |
5个 | 5. 捕获未经检查的异常在方法processExceptions() 中处理所有未经检查的异常。您需要使用printStack() 方法在屏幕上显示每个发生的异常的堆栈跟踪。 您可以只使用一个块try。 |
9 教授,关于例外的讲座
- 今天我们有一个超级有趣的话题——异常。当时,当年轻的科学家和程序员对这个话题深感兴奋时…… - 对不起,我必须去实验室。这里是讲义。我想你会自己想办法的。此处: Java 异常(Oracle 文档) Java 中的异常处理(Java T 点) Java - 异常处理(教程点) Basic Java Exception Handling10 胡里奥
- 阿米戈,你觉得今天的课怎么样?你的正电子脑还没有锻炼出来吗?迭戈的任务足以让任何人筋疲力尽。让我们喝杯啤酒,放松一下。你还站着吗?11 松鼠船长
- 你好,士兵! - 早上好先生! - 我有一些好消息要告诉你。这是一个快速检查以加强您的技能。每天都这样做,你会很快提高你的技能。任务是专门为在 Intellij IDEA 中执行而设计的。在 Intellij Idea 中完成的其他任务 | |
---|---|
1个 | 1. 除以零 创建一个方法 public static void divisionByZero(),您需要将任何数字除以零,并将除法结果显示到屏幕上。 将divisionByZero()方法调用包装到try..catch中。使用方法exception.printStackTrace()在屏幕上显示异常堆栈跟踪。 |
2个 | 2.从10到0倒计时 写一个从10到0倒计时的循环,使用Thread.sleep(100)做一个延时; 将sleep调用包装到try..catch中。 |
3个 | 3. 将方法包装到 try..catch 从键盘读取数字。将用于从键盘读取数字的代码写入单独的方法readData()中。将此方法的整个主体( readData() 方法 中的整个代码,除了将存储数字的列表的声明之外)包装到 try..catch中。 如果用户输入一些文本而不是输入数字,该方法必须捕获异常并在屏幕上显示之前输入的所有数字。 在屏幕上显示数字。每个数字都应该在一个新行上。数字的顺序应该和输入时一样。 |
4个 | 4. 日期转换器 从键盘读取格式为 «08/18/2013» 的日期 在屏幕上显示格式为 «AUG 18, 2013» 的日期。 使用对象Date和SimpleDateFormat。 |
5个 | 5. 元音和辅音 编写一个从键盘读取一行的程序。 程序应在屏幕上显示两个字符串: 1) 第一个字符串应包含元音 2) 第二个字符串应包含输入文本中的辅音和标点字符。 用空格分隔字符。 示例输入: Stop look listen 示例输出: oooie stplklstn |
6个 | 六、小红帽的故事 1.有五个班级:小红帽、外婆、帕蒂、樵夫、狼。2、每个类都有两个ArrayList 类型 的字段:killed和ate。 3. 已经创建了必要的对象(头巾、祖母……)。 4.建立正确的关系(谁吃了谁杀了谁)得到《小红帽》的逻辑。 |
7 | 7. Move static 修饰 Move static 修饰符使代码编译通过。 |
8个 | 8. 数字数组列表 创建一个列表,其元素是数字数组。将长度分别为 5、2、4、7、0 的五个对象数组添加到列表中。用任何数据填充数组并将它们显示在屏幕上。 |
9 | 9. 十只猫 创建一个类 Cat,其字段为String name。 创建字典Map<String, Cat>,在模型 «Name» - «Cat» 上添加 10 只猫。从地图 中获取一组名称并将该组显示到屏幕上。 |
奖励任务 | |
---|---|
1个 | 1.程序没有编译运行。修理它。 任务:程序应从键盘读取两个文件名,并将第一个文件复制到第二个文件名指定的位置。 |
2个 | 2. 为程序添加新功能。 旧任务:程序应从键盘读取两个文件名,并将第一个文件复制到第二个文件名指定的位置。 新任务:程序应从键盘读取两个文件名,并将第一个文件复制到第二个文件名指定的位置。 如果具有指定名称的文件(将被复制)不存在,程序应该在屏幕上显示消息 «文件不存在» 并在读取之前再次尝试从控制台读取文件名第二个(目标)文件的名称。 |
3个 | 3.学习和练习算法。 从键盘上读出单词和数字的列表。在屏幕上按升序显示单词,按降序显示数字。 示例输入: Cherry 1 Bean 3 Apple 2 0 Watermelon 示例输出: Apple 3 Bean 2 Cherry 1 0 Watermelon |
GO TO FULL VERSION