知識とスキル
大学では、理論と実践の間に大きな違いはない、と教えられました。まあ、それが同じではないことは確かに理解しています。しかし、核心的な違いはわかりません。それでも、1つあります。 ほとんどの人は、「知っています」と「できる」の間に等号を置きます。あなたは? いくつか例を挙げてみましょう。- 喫煙が体に悪いのはわかっていますが、喫煙してしまいます。
- ファストフードは体に悪いとわかっていますが、食べてしまいます。
- 交通規制は知っていますが、運転はできません。
- ジョギングが体に良いことは知っていますが、朝はジョギングしません。
新しいレベルに到達しました
レベル9
1 リーシャ、スタックトレース
- おい!今日はスタックトレースとは何かについて説明します。まず、スタックとは何かについて説明しましょう。- 書類の山を想像してください - 特定の事務員への割り当て。新しい割り当てをスタックの一番上に置くことができ、彼はスタックの一番上から割り当てを取得します。したがって、割り当ては先着順ではなく行われます。事務員が最後に来る課題を引き受けるたびに。このようなコレクションの構造をスタックと呼びます。 - Java には、特別なコレクションであるスタックがあります。このコレクションには、«要素の追加» と «要素の取得 (取得/削除)» メソッドがあります。すでにご存知のとおり、最後に追加された要素が最初に取得されます。 - うーん。難しいことではないと思います。 - 大丈夫。それでは、スタックトレースとは何かを説明しましょうは。- Java で、関数 А が関数 Bを呼び出し、後者が関数 Cを呼び出し、関数 C が関数 Dを呼び出すと想像してください。したがって、関数 Bを終了するには、まず関数 Cを終了する必要があり、そのためには関数 Dを終了する必要があります。これはスタックに非常によく似ています。 -そして、類似点は何ですか? - スタック内で、特定の割り当てに到達するには、一番上にあるすべての割り当ても完了する必要があります。 - そうですね、ちょっと例え話ですが、すべてを正しく理解できているかどうかはわかりません。 - ここを見て。Java では、スタックは要素のセットです。それは紙が束になっているようなものです。上から3枚目を取るには2枚目を取らなければなりませんが、その前に1枚目を取らなければなりません。シートはいつでも出し入れできますが、上からしかかけず、上からだけ取ることもできます。関数呼び出しにも同じことが当てはまります。関数 Aは関数 Bを呼び出し、後者は関数 Cを呼び出します。Аを終了するには、まずBを終了し、そのためにはCを終了する必要があります。 - ちょっと待って。私が正しく理解できた場合、スタック全体は「スタックに置かれた最後のシートのみが取得可能」であり、「最初に、最後に呼び出された関数が終了する必要がある」ことがわかります。そうですか? - はい。したがって、関数呼び出しのシーケンスは「関数呼び出しスタック」、または単に「呼び出しスタック」と呼ばれます。最後に呼び出された関数が最初に終了される必要があります。例を見てみましょう: - OK。関数呼び出しを見ればすべてが明らかだと思います。しかし、このStackTraceElementとは何でしょうか? - Java 仮想マシンはすべての関数呼び出しをログに記録します。この目的のために、特別なコレクションであるスタックがあります。ある関数が別の関数を呼び出すと、JVM は新しい要素StackTraceElementをこのスタックに配置します。関数が終了すると、要素はスタックから削除されます。したがって、このスタックには、«関数呼び出しスタック» の現在の状態に関する最新の情報が常に保存されます。 - すべてのStackTraceElement呼び出されたメソッドに関する情報が含まれます。したがって、 getMethodNameを使用してこのメソッドの名前を取得できます。- 上の例はそれを示しています。- «コールスタック» を取得します。
- for-eachループを使用して配列を繰り返します。忘れていないことを願っています。
- メソッド名をSystem.outに出力します。
2 Diego、スタックトレース表示上のタスク
- やあ、アミーゴ! ここでは、スタック トレースを画面に表示する小さなタスクを示します。タスク | |
---|---|
1 | 各メソッドは、相互に呼び出すStackTrace Write 5 つのメソッドを返す必要があります。各メソッドはその StackTrace を返す必要があります。 |
2 | StackTrace を再度 呼び出します。相互に呼び出す 5 つのメソッドを作成します。各メソッドは呼び出し元メソッドの名前を返す必要があります。StackTrace を使用して呼び出し元のメソッドを取得できます。 |
3 | メソッドは、このメソッドが呼び出されたコードの行番号を返す必要があります。 相互に呼び出すメソッドを 5 つ作成します。各メソッドは、このメソッドの呼び出し元のコードの行番号を返す必要があります。関数element.getLineNumber()を使用します。 |
4 | 10 回の呼び出しのスタック トレース 10 回の呼び出しのスタック トレースを取得するコードを作成します。 |
5 | メソッドは結果、つまりスタック トレースの深さを返す必要があります。 スタック トレースの深さを表示して返すメソッドを作成します。スタック トレースの深さは、そのメソッドの数 (リスト内の要素の数) です。 |
3 Elly、エラーと例外
- やあ、アミーゴ! 今日はとても興味深いレッスンがあります。例外についてお話します。例外は、プログラム内のエラーを制御するための特別なメカニズムです。プログラムで発生する可能性のあるエラーの例をいくつか示します。- プログラムは、フルディスクにファイルを書き込もうとします。
- プログラムは、null 参照を格納する変数のメソッドを呼び出そうとします。
- プログラムは数値を 0 で除算しようとします。
- エラーが発生すると、Java 仮想マシンはエラーに関するすべての情報を含む特別なオブジェクト (例外) を作成します。エラーが異なれば、例外も異なります。
- この例外により、プログラムは現在の関数を直ちに中断し、メイン メソッドを終了するまで次の関数を強制的に中断します。その後、プログラムは終了します。Java 開発者は、このプロセスを「コールスタックのロールバック」と呼びます。
- tryブロック内で例外が発生した場合、このブロック内のコードは実行されなくなりますが、ブロックcatchの実行が開始されます。
- 例外が発生しなかった場合、try ブロックは最後まで実行され、catchは実行されません。
4 Elly、RuntimeException がスローされる
- 今日は別の話題を取り上げることにしました。Java では、すべての例外は、制御/チェック済みと非制御/非チェックの2 つのタイプに分類されます。チェックされた例外はキャッチする必要があり、チェックされていない例外もキャッチできますが、それは必須ではありません。 - コード内で意図的に例外をスローすることは可能ですか? - コード内で、自分で例外をスローできます。独自の例外を作成することもできます。しかし、この穴の奥深くには後で行きます。次に、Java 仮想マシンによってスローされた例外を処理する方法を学びましょう。 - OK。 - 例外ClassNotFoundExceptionおよびFileNotFoundExceptionの場合メソッド内でスローされる (出現する) 場合、プログラマはメソッドのシグネチャ (メソッド ヘッダー) でそれらを指定する必要があります。このような例外はチェックされます。通常は次のようになります。 - したがって、スローを記述し、カンマで区切って例外をリストするだけです。右?そうですか? - はい。しかし、もう一つ興味深いことがあります。以下の例をコンパイルするには、 method1()を呼び出すメソッドがこれらの例外をキャッチするか、例外を転送する必要があります。チェック済み例外を前方にスローしたい場合は、メソッドのヘッダーでそれを指定する必要があります。- もう一度言いますが、メインメソッドで、ヘッダーフレーズに FileNotFoundExceptionをスローする メソッドを呼び出したい場合、…次に、次の 2 つのことのいずれかを行う必要があります。- 例外をキャッチするには FileNotFoundException, …危険なメソッドを呼び出すコードをtry-catchブロック
でラップする必要があります - 例外 FileNotFoundException をキャッチしないようにするには、…
5 Risha、コールスタックのローリング、例外でのローリング方法
- 例外がどのように機能するかについてもう少し詳しく説明したいと思います。以下の例は、次のことを説明しています。 - 理解できません。 - Ok。何が起こっているのか説明します。- 左側の例では、複数のメソッドを連鎖的に呼び出しています。Method2()では、(エラーを開始するために) 例外を具体的に作成してスローします。- 右の例は、何が起こるかを示しています。Method2()を見てください。これが例外の作成の変換です。RuntimeExceptionタイプのオブジェクトを作成し、それを特別な変数例外に格納し、すぐにメソッドを終了します ( return )。- method1では、 method2の呼び出し後にチェックが行われます。例外があるかどうか。例外が発生した場合、method1 は直ちに終了します。このチェックは、各 (!) Java メソッドを呼び出した後に暗黙的に行われます。 - おお! - その通り。- メソッドmainの右側の列に、try-catchブロックで例外がキャッチされたときに何が起こるかを書きました。例外がなかった場合、コードは計画どおりに実行を続けます。catchで指定されたタイプの例外があった場合は、それを処理します。 - そして、throwとinstanceof は何を意味しますか? - 左側の最後の行を見てください。新しい RuntimeException がスローされます。。このようにして、例外を作成してスローします。これはほんの一例です。今のところはやりません。- 右側のブロックでコマンド「аinstanceof B」を使用して、オブジェクトa がタイプBを持つかどうかを確認します。つまり、変数Exceptionに格納されているオブジェクトの型が RuntimeException であるかどうかです。論理的な表現ですね。 - そうですね、少しずつ明確になってきました。6 Diego、例外キャッチタスク
- ここを見て!ディエゴおじさんは、あなたのために捕獲に関する仕事をほとんど持ってきませんでした。あなたの幸運を祈ります。必要になると思います。へー。 - やあ、アミーゴ! ここでは、興味深い例外キャッチ タスクをいくつか紹介します。タスクをキャッチする | |
---|---|
1 | 1. 数値を操作する場合の例外 コードの実行時に発生する例外をキャッチします。 int a = 42 / 0; タイプを指定して例外を画面に表示します |
2 | 2. 文字列操作時の 例外 コードの実行時に発生する例外をキャッチします 。 文字列 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); マップ.put(null, null); マップ.削除(null); タイプを指定して例外を画面に表示します。 |
7 Risha、複数のキャッチの仕組み
- さて、さらに興味深い講義があります。私は教えるのがとても好きです。- 複数のキャッチがどのように機能するかを説明したいと思います。実際には非常に単純です。ブロックtryで例外が発生すると、プログラムの実行は最初のcatchに転送されます。-ブロック キャッチのかっこ内に指定された型が例外オブジェクトの型と同じである場合、コードの実行は {} 内で開始されます。それ以外の場合は、次のcatchに進みます。そこでチェックが繰り返されます。- catchブロックがなくなっても、例外がキャッチされていない場合、例外は前方にスローされ、現在のメソッドは中断されます。 - そうか。そのキャッチは、例外のタイプと一致するタイプで実行されます。 - はい、そうです。実際にはもう少し複雑です。重要なのは、クラスが相互に継承できるということです。クラス«Cow»がクラス«Animal»から継承されている場合、タイプ«Cow»のオブジェクトはタイプ«Cow»の変数だけでなく、タイプ«Animal»の変数にも格納できます。 。 - だから何? - すべての例外はクラスExceptionまたはRuntimeException (これもExceptionから継承) から継承されるため、それらはすべてコマンドcatch (Exception e)またはcatch (RuntimeException e)を使用してキャッチできます。 - だから何? - この意味は、まず、コマンド catch(Exception e) を使用して例外をキャッチできます。次に、 catchブロックの順序が重要です。 例: - 0 による除算の結果生じる ArithmeticException は、2 番目のキャッチでキャッチされます。- 以下の例では、すべての例外のクラスが Exception から継承されているため、最初のcatchでArithmeticException がキャッチされます。したがって、Exception はあらゆる例外をキャッチします。 - 以下の例では、例外ArithmeticException はキャッチされませんが、呼び出し元のメソッドにスローされます。 - そうですね、だんだんはっきりしてきました。これらの例外はそれほど簡単ではありません。 -そう見えるだけです。実際、これは Java で最も単純なものの 1 つです。 ――喜ぶべきか怒るべきか迷ってしまいます…。8 Diego、複数の例外キャッチ タスク
- やあ、アミーゴ! 昨日私は酔っ払ってあなたの仕事を複雑にしすぎましたが、あなたにつらい思いはなく、すべて解決してくれることを願っています。それはあなた自身の利益のためです。ここ:タスク | |
---|---|
1 | 1. 例外Exceptionから継承された 2 つの例外と、 RuntimeExceptionから継承された他の 2 つの例外( NullPointerException、ArithmeticException、FileNotFoundException、およびURISyntaxException ) をスローするメソッドがあります。NullPointerExceptionとFileNotFoundException を キャッチする必要がありますが、ArithmeticExceptionとURISyntaxException はキャッチする必要はありません。どうやってするの? |
2 | 2. 例外のキャッチException から順番に継承される例外は 3 つあります。class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 次のようなメソッドがあります。public static void method1() throws Exception1, Exception2, Exception3 catch を書きます。 3 つの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 をキャッチした場合は、次のコードを使用して 例外を前方にスローできます 。 } |
4 | 4. チェック例外の捕捉メソッドprocessExceptions() ですべてのチェック例外を処理します。 発生したチェック例外をそれぞれ画面に表示する必要があります。try ブロックは 1 つだけ使用できます。 |
5 | 5. 未チェック例外のキャッチすべての未チェック例外をprocessExceptions() メソッドで処理します。printStack() メソッドを使用して、発生した各例外のスタック トレースを画面に表示する必要があります。try ブロックは 1 つだけ使用できます。 |
9 教授、例外に関する講義
- 今日は非常に興味深いトピックがあります - 例外。当時、若い科学者やプログラマーがこのトピックに深く興奮していたとき… - 申し訳ありませんが、研究室に行かなければなりません。こちらが講義ノートです。あなた自身でそれを理解すると思います。ここ: Java 例外 (Oracle ドキュメント) Java での例外処理 (Java T ポイント) Java - 例外処理 (チュートリアル ポイント) 基本的な Java 例外処理7月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»の形式で画面に表示します。DateオブジェクトとSimpleDateFormat オブジェクトを使用します。 |
5 | 5. 母音と子音 キーボードから行を読み取るプログラムを作成します。 プログラムは 2 つの文字列を画面に表示します。1 ) 最初の文字列には母音が含まれている必要があります 。2) 2 番目の文字列には、入力されたテキストの子音と句読点文字が含まれている必要があります。 文字はスペースで区切ります。 入力例: Stop look listen 出力例: oooie stplklstn |
6 | 6. 赤ずきんちゃんの物語 1. 赤ずきんちゃん、おばあちゃん、パティ、きこり、オオカミの 5 つのクラスがあります。2. 各クラスには、 ArrayList タイプ の 2 つのフィールド(killed とate) があります。 3. 必要なオブジェクトはすでに作成されています (フード、おばあさんなど)。 4. 正しい関係 (誰が食べ、誰を殺したのか) を作成して、«赤ずきんちゃん» のロジックを取得します。 |
7 | 7. 静的修飾子の移動 コードがコンパイルされるように静的修飾子を移動します。 |
8 | 8. 数値の配列のリスト 数値の配列を要素とするリストを作成します。それぞれ長さ 5、2、4、7、0 の 5 つのオブジェクト配列をリストに追加します。配列に任意のデータを入力し、画面に表示します。 |
9 | 9. 10 匹の猫String nameフィールドを持つクラス Cat を作成します。 辞書Map<String, Cat>を作成し、モデル «Name» - «Cat» に 10 匹の猫を追加します。マップ から名前のセットを取得し、そのセットを画面に表示します。 |
ボーナスタスク | |
---|---|
1 | 1. プログラムがコンパイルされず、実行されない。修理する。 タスク:プログラムはキーボードから 2 つのファイル名を読み取り、最初のファイルを 2 番目の名前で指定された場所にコピーする必要があります。 |
2 | 2. プログラムに新しい機能を追加します。 古いタスク:プログラムはキーボードから 2 つのファイル名を読み取り、最初のファイルを 2 番目の名前で指定された場所にコピーする必要があります。 新しいタスク:プログラムはキーボードから 2 つのファイル名を読み取り、最初のファイルを 2 番目の名前で指定された場所にコピーする必要があります。 指定された名前のファイル (コピーされるファイル) が存在しない場合、プログラムは画面に「ファイルが存在しません」というメッセージを表示し、ファイル名を読み取る前にコンソールからもう一度ファイル名を読み取る必要があります。 2 番目の (宛先) ファイルの名前。 |
3 | 3. アルゴリズムを学び、実践する。 キーボードから単語と数字のリストを読み取ります。単語を昇順で、数字を降順で画面に表示します。 入力例: Cherry 1 Bean 3 Apple 2 0 Watermelon 出力例: Apple 3 Bean 2 Cherry 1 0 Watermelon |
GO TO FULL VERSION