2014年度、2015年度、2016年度と3年連続で新人プログラマの教育をやりました。
そこで気づいた事は、どの子もプログラムを書いていてエラーに遭遇すると、どうしていいかわからなくなってしまう、ということでした。
今回は、Qiitaで春の新生活を応援しましょうということで、以下で正しい対応と、正しい対応ができない場合どうするか?を述べます。
正しい対応
非常にシンプルです。以下の順で対応しましょう。
1.StackTrace(スタックトレース)を確認する
StackTraceとは実行中のプログラムにエラーが発生した際に、直前に実行していた関数やメソッドなどの履歴を表示したものです。とにもかくにもまずはこれの確認です。ほとんどの現場でIDE(Eclipse、IntelliJ IDEA、Visual Studio等)を利用して開発しています。これらのツールはエラー発生時にStackTraceをコンソール出力してくれます(下記ハイライトのStackTraceの例のようなものです)。なので、まずは(内容が分からなくても良いので)出力されたStackTraceを確認しましょう。
※StackTraceを見る癖は早い段階から身に付けましょう。
2.StackTraceからエラーが発生している個所を特定する
StackTraceを確認したらエラーが発生している個所を特定します。下記のStackTraceはjavaのものですが、基本的にStackTraceはメソッドの呼び出し元から呼び出し先に向かって下から上に出力されます。下記のStackTraceでは「★★★ここ★★★」とある個所がポイントです。この場合、com.example.service.ExampleService.javaの15行目(com.example.service.ExampleServiceクラスのdoSomethingメソッド内)でNullPointerExceptionが発生していることが分かります。
※ほとんどの場合StackTraceからエラーが発生している個所を特定できます。
また、この時に発生しているExceptionがどんな時に発生するものか分からなければ必ず調べて理解するようにしてください。調べても分からなければ先輩や上司に教えてもらい理解するようにしてください。いずれにしろ次に遭遇した時は1人で対応できるようになっていると良いかと思います。
3.原因を突き止める
エラーが発生している個所を特定できたら、ソースを確認して何故エラーが発生しているか原因を突き止めます。
4.ソースを修正する
原因を突き止められたらソースを修正します。
java.lang.IllegalStateException: Failed to execute CommandLineRunner ★★★ここ★★★
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:809) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:790) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:777) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at com.example.Main.main(Main.java:17) [classes/:na]
Caused by: java.lang.NullPointerException: null ★★★ここ★★★
at com.example.service.ExampleService.doSomething(ExampleService.java:15) ~[classes/:na] ★★★ここ★★★
~省略~
at com.example.Main.run(Main.java:21) [classes/:na] ★★★ここ★★★
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:806) [spring-boot-1.3.2.RELEASE.jar:1.3.2.RELEASE]
... 6 common frames omitted
正しい対応ができない場合どうするか?
先輩や上司に聞きましょう。
ただし、上記の正しい対応で述べた「1.StackTrace(スタックトレース)を確認する」は必ず行ってください。これをやらずに先輩や上司に聞きに行くと、「StackTrace見たの?」って突っ込まれる可能性があります。そのうえで、ケースに応じて以下のような要領で聞くと先輩や上司もアドバイスしやすくなります。
「2.StackTraceからエラーが発生している個所を特定する」で特定できない場合
エラーが発生している個所が特定できなければ、最低限Exception名だけでも聞くときに伝えられると良いかと思います。「エラーが発生しちゃいました」だけでは聞かれる方も困ってしまいます。
「3.原因を突き止める」で原因が分からない場合
色々調べたけど何故エラーとなっているか分からない、なんてこともよくあります。そういった場合は、自分でどういったことを調べたか、を聞くときに伝えてあげると良いです。そうすることで聞かれる方は、であればあのあたりかな?と原因を突き止めるうえで予測が立てやすくなります。
「4.修正する」で修正の仕方が分からない場合
素直に先輩や上司に聞きましょう。
まとめ
くどいようですが、エラーに遭遇したらまずはStackTraceを見る癖をつけられると良いです。その後にエラー発生個所特定して→ソースを確認して原因を突き止め→ソースを修正します。正しい対応ができなければ先輩や上司に聞くことになりますが、その際に、どんなエラーが出ているのか、自分でどこまで調べたのか、等の情報も一緒に伝えられると、先輩や上司もスムーズに回答ができると思います。