CodeGym /Java 博客 /随机的 /旧级别 09
John Squirrels
第 41 级
San Francisco

旧级别 09

已在 随机的 群组中发布

知识与技能

旧级别 09 - 1大学告诉我们,理论和实践之间没有太大的区别。好吧,你肯定明白那是不一样的。但是您看不到核心区别。然而有一个。 大多数人在“我知道”和“我能”之间划等号。你? 举几个例子怎么样?
  1. 我知道抽烟对我不好,但我还是抽烟。
  2. 我知道快餐对我不好,但我还是吃了。
  3. 我知道交通规则,但我不会开车。
  4. 我知道慢跑对我有好处,但我早上不慢跑。
人们常常把“我知道”当成“我能”。这是交通规则的一个很好的例子。如果一个人知道规则,知道怎么开车,是不是就可以开车了?没有。如果他认为自己会开车怎么办?那么他为什么需要一位导师——他已经什么都知道了。 当您确定自己已经了解所有内容时,您可能不会学到任何新东西。如果你确定你知道如何做所有事情,你就不会学习。这样的想法甚至不会出现在你的脑海中。这意味着您将错过所有学习某些东西的绝好机会。普通的大学只给你知识;你必须自己获得技能。但是我听到了什么?你在大学里有过理论以外的实践吗?好吧,如果你学的是物理系,制作效率至少为 20% 的蒸汽机工作模型。我打赌你知道怎么做,但你实际上做不到,对吗?你是化学家?制作无烟火药。你知道怎么做,但你不能,哈? 数学家,你是?计算炮弹的弹道。不要忘记考虑外壳的形状。数学点在现实生活中不会飞。而且没有球形马。 旧级别 09 - 2生物学家?分离青霉素。这种霉菌长在甜瓜上,你知道的。你知道怎么做——太棒了!你可以做到吗? 经济学家?预测石油价格增长。完毕?现在根据您的预测将其变成每年 2,000 美元或 200,000 美元。你玩过外汇吗?为了真钱?或者你只知道它是什么? 国际经济学?灿烂!我在哪里开设离岸公司?在 Hong-Cong、爱尔兰或美国。为什么?即使你知道这一点,这是值得怀疑的,你也很难做到,因为你从未真正做到过。你甚至不知道如何去做。哦,你在大学里没学过这个?我有什么权利给你没有准备的任务?因为这些是现实生活中的任务。这是练习,你在大学里学的只是:球形马,完美竞争——现实生活中都不存在。但为什么我忘了提营销专家?花掉我的 500 美元以使尽可能多的人了解我的讲座的最佳方式是什么?上广告?你知道吗,不仅经典广告已经过时,而且 USP(独特的销售主张)的概念也已经过时,我相信你在大学里被教导为几乎是独一无二的灵丹妙药。 忘了你什么都知道。问问自己——我能做什么?有用,我的意思是?人们愿意花钱买的东西?好钱,我的意思是? 所以小伙伴们,让我们对CodeGym这么精彩的课程表示感谢吧。由于它,您不仅会知道如何编程,而且您实际上能够做到这一点。你也可以在几年内找到一份工作并赚取丰厚的收入。我希望这笔钱足以让我过上舒适惬意的生活。我会再说一遍,所以你要记住:你知道什么并不重要。唯一重要的是你有什么有用的技能,人们会急于付钱给你。你越早明白这一点越好。

你已经达到了一个新的水平

9级

旧级别 09 - 3

1 Risha,堆栈跟踪

旧级别 09 - 4- 嘿!今天我将告诉你堆栈跟踪是什么。但首先让我向您解释一下堆栈是什么。- 想象一堆文件 - 某个职员的任务。一个新的赋值可以放到栈顶,他会从一个栈顶取一个赋值。因此,分配将不是先到先得。每次店员接受最后的任务。这样的集合结构称为 -在 Java 中,有一个特殊的集合 - Stack。这个集合有方法 «add an element» 和 «take(get/take away) an element»。如您所知,最后添加的元素将首先被采用。 - 哼。我想这并不难。 - 美好的。然后让我解释什么是堆栈跟踪是。- 想象一下,在 Java 中,函数 А调用函数 B,后者调用函数 C,后者又调用函数 D。因此,要退出功能 B,您必须先退出功能 C,然后您必须退出功能 D。这与堆栈非常相似。 - 相似之处是什么? - 在堆栈中,要完成某个任务,您还必须完成所有放在最上面的任务。 - 好吧,这是一个类比,但我不确定我是否理解正确。 - 看这里。在 Java 中,堆栈是一组元素。这就像一堆纸。要从顶部开始第三张,你必须拿第二张,但在此之前你必须拿第一张。你总是可以放床单和拿床单,但你只能把床单放在上面,也只能从上面拿。这同样适用于函数调用。函数 А调用函数 B,后者调用函数 C。要退出А,您必须先退出B,为此您必须退出C- 等一下。如果我做对了,整个堆栈会变成“只能取出放在堆栈上的最后一张纸”和“首先,最后调用的函数应该退出”。是这样吗? - 是的。因此,函数调用的顺序是«函数调用堆栈»,或简称为«调用堆栈»。最后调用的函数必须首先终止。让我们看一下这个例子: 旧级别 09 - 5- 好的。我想,函数调用一切都很清楚。但是这个StackTraceElement是什么? - Java 虚拟机记录所有函数调用。为此,它有一个特殊的集合——堆栈。当一个函数调用另一个函数时,JVM 会将一个新元素StackTraceElement放入此堆栈中。当函数结束时,元素从堆栈中删除。因此,该堆栈始终存储有关 «函数调用堆栈» 当前状态的最新信息。 - 每个StackTraceElement包含有关被调用方法的信息。因此,您可以使用getMethodName获取此方法的名称。- 上面的例子说明了这一点:
  1. 获取«调用堆栈»:
  2. 使用循环for-each迭代数组。我希望你没有忘记它。
  3. 将方法名称打印到System.out
- 一件有趣的事情,而且显然很容易。谢谢你,里沙!

2 Diego,堆栈跟踪显示上的任务

- 嘿,阿米戈!这是一个在屏幕上显示堆栈跟踪的小任务。
任务
1个 每个方法都应该返回它的 StackTrace
写五个相互调用的方法。每个方法都应返回其 StackTrace。
2个 StackTrace
再写五个相互调用的方法。每个方法都应返回其调用方方法的名称。您可以使用 StackTrace 获取调用方方法。
3个 该方法应返回调用此方法的代码的行号,从
编写相互调用的五个方法。每个方法都应返回调用此方法的代码的行号。使用函数element.getLineNumber()
4个 10 次调用的堆栈跟踪
编写代码以获得 10 次调用的堆栈跟踪。
5个 该方法应返回一个结果 - 它的堆栈跟踪深度
编写一个显示并返回其堆栈跟踪深度的方法。堆栈跟踪深度是其方法的数量(列表中的元素数量)。

3 Elly,错误和异常

- 嘿,阿米戈!今天我们上了一堂非常有趣的课。我会告诉你例外情况。异常是程序中控制错误的一种特殊机制。以下是程序中可能出现的一些错误示例:
  1. 该程序尝试将文件写入整个磁盘。
  2. 该程序尝试调用存储空引用的变量的方法。
  3. 该程序试图将一个数除以 0。
这些操作会导致错误。通常,这会导致程序关闭——没有必要继续执行代码。 - 这是为什么? - 车子掉下悬崖时打方向盘有没有意义? - 你是说程序应该结束了吗? - 是的。以前就是这样。任何错误都会导致程序终止。 - 这是一个非常明智的决定。 - 努力工作不是更好吗? - 是的。您在 MS Word 中键入了一个巨大的文本,保存了它,它没有被保存,但是程序告诉您一切正常。然后你继续打字。愚蠢,不是吗? - 是的。 - 然后程序员想出了一个有趣的举动:每个功能都返回其工作状态。0 表示该函数按预期工作,任何其他值 - 出现错误:此值是错误代码。- 但这种方法有一个缺点。在每次 (!) 函数调用之后,您必须检查函数返回的代码(数字)。首先,它很不方便:错误处理代码很少被执行,但你总是不得不编写它。其次,函数本身经常返回不同的值——如何处理它们? - 是的。这就是我要问的。 - 然后光明的未来出现了 - 出现了异常和错误处理。它是这样工作的:
  1. 当错误发生时,Java 虚拟机创建一个特殊的对象——一个异常——包含关于错误的所有信息。对于不同的错误有不同的异常。
  2. 然后这个异常会强制程序立即中断当前函数,然后中断下一个函数,直到退出 main 方法。之后程序终止。Java 开发人员将此过程称为“回滚调用堆栈”。
- 但是你说过程序肯定不会退出。 - 没错,因为有一种方法可以捕获异常。无论何时何地,只要你需要,你就可以编写专门的代码来捕捉这些异常,做一些重要的事情。- 为此,有一个特殊的结构try-catch。看看它是如何工作的: 旧级别 09 - 6- 为什么«在 method1 调用之后。Never will be showed» 不会显示在屏幕上? - 很高兴你问起这件事。在第 25 行中,除以零。这会导致错误——异常。Java 虚拟机创建了包含错误信息的ArithmeticException对象。这个对象是一个例外。- 方法method1()内部发生异常。这导致该方法立即终止。如果没有try-catch块,它还会导致方法main的终止。- 如果在 try 块内发生异常,它将在catch块中捕获。块try中的其余代码将不会执行,块catch将立即开始执行。 - 我不太明白。 - 换句话说,这段代码是这样工作的:
  1. 如果try块内部发生异常,则不再执行该块中的代码,而是开始执行块catch
  2. 如果没有异常发生,try 块将执行到结束,并且永远不会执行catch
- 咳咳! - 想象一下,在每次方法调用之后,我们检查被调用的方法是自行终止还是由于异常而终止。如果出现异常,JVM 开始执行块捕获(如果可用),并捕获异常。如果没有 catch 块,JVM 将终止当前方法。然后在调用当前方法的方法中开始相同的检查。 - 现在我想我明白了。 - 没关系。 - catch 块中的异常是什么? -所有异常都是从类Exception 继承的类。我们可以通过在catch中指定它的类来捕获它们中的任何一个通过指定一个公共父类 Exception 来阻止或同时阻止所有这些。然后,从变量 e(此变量存储异常对象的引用)中,您可以获得有关错误的所有必要信息。 - 伟大的!如果在我的方法中出现不同的异常,我可以用不同的方式处理它们吗? - 你必须。您可以这样做: 旧级别 09 - 7- try 块可以包含多个catch块,每个 catch 块都会捕获其类型的异常。 - 嗯。好吧,我有点明白了。当然,我不会自己写这样的东西。不过,遇到这样的代码我是不会害怕的。

4 Elly,RuntimeException,抛出

旧级别 09 - 8- 我决定今天提出另一个话题。在 Java 中,所有异常都分为两种类型——受控/受控不受控/未受控必须捕获已检查的异常,可以捕获未检查的异常,但这不是必需的- 是否可以故意在代码中抛出异常? - 在你的代码中,你可以自己抛出异常。您甚至可以编写自己的异常。但我们稍后会深入这个洞。现在让我们学习如何处理 Java 虚拟机抛出的异常。 - 好的。 - 如果异常ClassNotFoundExceptionFileNotFoundException被抛出(出现)在一个方法中,程序员必须在方法的签名(方法头)中指定它们。检查此类异常。这就是它通常的样子: 旧级别 09 - 9- 所以,我们只写抛出并列出用逗号分隔的异常。正确的?是这样吗? - 是的。但还有一件有趣的事。为了编译下面的示例,调用method1()的方法必须捕获这些异常将它们向前抛出。如果你想向前抛出检查异常,你需要在方法的头中指定它。- 再一次,如果在main方法中,您想调用一个在其标题短语中包含throws FileNotFoundException 的方法,...那么你必须做以下两件事之一:
  1. 捕获异常 FileNotFoundException,......
    你必须用try-catch块包装你调用危险方法的代码
  2. 不要捕获异常 FileNotFoundException,...
您必须将这些异常添加到方法main的抛出列表中。 - 你能给我举个例子吗? - 看这里: - 这个例子不会被编译,因为方法main调用了方法 method1(),它抛出了必须捕获的异常。- 为了编译示例,您需要向方法main添加异常处理。您可以通过两种方式执行此操作: - 在这里我们使用try-catch捕获它: - 它越来越清晰,但很少。 - 查看下面的示例: - 仍然存在异常 - RuntimeException和从它继承的类。旧级别 09 - 10旧级别 09 - 11旧级别 09 - 12旧级别 09 - 13不需要抓住或扔掉它们。这些是未经检查的异常。这些异常被认为是难以预测的,因此几乎不可能预测它们的发生。您可以对它们执行相同的操作,但无需在throws中指定它们。

5 Risha,滚动调用堆栈,如何在异常中执行

- 我想告诉你更多关于异常如何工作的信息。下面的例子解释说: 旧级别 09 - 14- 我不明白。 - 好的。我会解释发生了什么。- 在左边的例子中,我们按链式顺序调用了几个方法。在method2()中,我们专门创建并抛出异常(以引发错误)。- 右边的例子显示了会发生什么。查看method2()。这就是异常的创建转换成的:我们创建一个RuntimeException类型的对象,将它存储在一个特殊的变量异常中,然后立即退出方法 - return。- 在method1中,在调用method2之后进行检查,是否有例外;如果有异常,则 method1 立即终止。此检查在调用每个(!)Java 方法后隐式完成。 - 哇! - 确切地。- 在方法main的右侧栏中,我写了当异常被try-catch块捕获时会发生什么。如果没有异常,代码将继续按计划执行。如果存在catch中指定类型的异常,那么我们将处理它。 - throwinstanceof是什么意思? - 看左边最后一行throw new RuntimeException(s). 通过这种方式,我们创建并抛出异常。这只是一个例子。到目前为止我们不会这样做。- 在右侧块中使用命令« аinstanceofB »我们检查对象a是否具有类型B。也就是说,存储在变量 exception 中的对象是否具有 RuntimeException 类型。这是一个合乎逻辑的表达。 - 好吧,它变得更清楚了。

6 Diego,异常捕获任务

- 看这里!迭戈叔叔为您带来了很少的任务。祝你好运。我想你会需要它。呵呵。 旧级别 09 - 15- 嘿,阿米戈!这里有一些有趣的异常捕获任务。
抓任务
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,多次捕获的工作原理

旧级别 09 - 16- 现在,一些更有趣的讲座。我非常喜欢教学。- 我想告诉你多重捕捉是如何工作的。其实很简单:当try块发生异常时,程序执行转移到第一个catch。-如果块 catch 的括号中指定的类型与异常对象的类型相同,则代码执行从 {} 内部开始。否则我们去下一个捕获。在那里重复检查。- 如果没有更多的catch块,但异常还没有被捕获,则向前抛出,并中断当前方法。 - 我懂了。该 catch 将被执行,其类型与异常类型匹配。 - 是的,对。实际上,它有点复杂:关键是类可以相互继承。如果类 «Cow» 继承自类 «Animal»,则类型 «Cow» 的对象不仅可以存储在类型 «Cow» 的变量中,还可以存储在类型 «Animal» 的变量中. - 所以呢? - 因为所有的异常都是从类ExceptionRuntimeException继承的(它们也是从Exception继承的),它们都可以使用命令catch (Exception e)catch (RuntimeException e)来捕获。 - 所以呢? - 这意味着,首先,您可以使用命令 catch(Exception e) 捕获任何异常其次, catch块的顺序很重要。 示例: -除以 0 导致的 ArithmeticException在第二个 catch 中被捕获。旧级别 09 - 17- 在下面的示例中,ArithmeticException在第一个catch中被捕获,因为所有异常的类都是从 Exception 继承的。所以,Exception 捕获任何异常旧级别 09 - 18- 在下面的示例中,异常ArithmeticException没有被捕获,而是被抛给了调用方法。 旧级别 09 - 19- 好吧,现在越来越清楚了。这些异常并不那么容易。 - 似乎只是如此。事实上,它是 Java 中最简单的东西之一。 ——不知该高兴还是不高兴……

8 Diego,多个异常捕获任务

- 嘿,阿米戈!昨天我喝醉了,把你的任务搞得过于复杂了,但我希望你没有怨恨,你会解决所有的问题吗?这是为你好 这里:
任务
1个 1. 异常
有一个方法抛出两个继承自Exception的异常,另外两个继承自RuntimeExceptionNullPointerExceptionArithmeticExceptionFileNotFoundExceptionURISyntaxException

您需要捕获NullPointerExceptionFileNotFoundException,但不需要捕获ArithmeticExceptionURISyntaxException。怎么做?
2个 2、捕获异常Exception
依次继承了三个异常:class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 有一个方法,描述如下:public static void method1() throws Exception1, Exception2, Exception3 写一个catch阻止捕获所有三个Exception1Exception2Exception3






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 Handling

10 胡里奥

- 阿米戈,你觉得今天的课怎么样?你的正电子脑还没有锻炼出来吗?迭戈的任务足以让任何人筋疲力尽。让我们喝杯啤酒,放松一下。你还站着吗?

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» 的日期。
使用对象DateSimpleDateFormat
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
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION