絶対にぬるぽを出さない
We never throw NPE
JJUG CCC 2016 Spring 懇親会LT
@yy_yank
          こいつです
          ・vimmer
          ・サクラエディタicon
          ・小物SIer
          ・JavaとKotlinが好き
ヤンク(@yy_yank)
自己紹介
  ネタ枠
joke LT
大人な
Javaユーザーの皆
様においては
LT中に
それ◯◯でしょ?
とか先に答えを
言ってはいけない
ぬるぽ
NullPointerException
「ぬるぽ
出すなよ!絶対だぞ!絶
対ぬるぽ出すなよ」
そっか
ならば
出さなければ良い
・持たず
・作らず
・持ち込まず
非ぬるぽ3原則
・持たず
・作らず
・持ち込まず
非ぬるぽ3原則
その1 持たず
非ぬるぽ3原則 〜持たず〜
・NullPointerExceptionというクラスがなければそ
もそもそんな例外は発生しない
・なるほどclassファイルが無ければ良いんや
・NullPointerExceptionというクラスがなければそ
もそもそんな例外は発生しない
_人人人人人人人人人人人人人人人人_
> 突然のClassNotFoundException <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
非ぬるぽ3原則 〜持たず〜
その1 持たず
失敗
・持たず
・作らず
・持ち込まず
非ぬるぽ3原則
その2 作らず
非ぬるぽ3原則 〜作らず〜
・NullPointerExceptionというクラスのインスタン
スが生成されなければ
そもそもそんな例外は発生しない
非ぬるぽ3原則 〜作らず〜
・java.lang.reflect.Proxyはきびしー
・ならばNullPointerExceptionクラスをバイトコー
ドエンハンス・・・・・!!!
非ぬるぽ3原則 〜作らず〜
・java.lang.reflect.Proxyはきびしー
・NullPointerExceptionクラスをバイトコードエン
ハンスしてコンスタラクタをアレすれば
・・・・・!!!
・そこでjavassist
いや無理
・javassistはjava.langパッケージのクラスのバイト
コードをいじることは出来ない
・多分JVM起動時にすでにロードされてしまうから
非ぬるぽ3原則 〜作らず〜
ならば力技だ
非ぬるぽ3原則 〜作らず〜
public static void main(String... args) {
Thread.setDefaultUncaughtExceptionHandler(
(t, e) -> System.out.println(“ぬるぽなんてな
かった”));
}
・・だめですか???
ですよねー
(握りつぶしだもんね)
public class NullPointerException extends
RuntimeException {
public NullPointerException() {
System.exit(0);
}
}
非ぬるぽ3原則 〜作らず〜
javac NullPointerException.java
jar -xvf rt.jar java/lang
copy NullPointerException.class
java/lang/NullPointerException.class
jar -uf rt.jar
非ぬるぽ3原則 〜作らず〜
javac NullPointerException.java
jar -xvf rt.jar java/lang
copy NullPointerException.class
java/lang/NullPointerException.class
jar -uf rt.jar
こいつをjdkに仕込めば…!!
非ぬるぽ3原則 〜作らず〜
public static void main(String... args) {
throw new NullPointerException();
// しかし何も起こらなかった!!!
}
非ぬるぽ3原則 〜作らず〜
めでたしめでたし
いや違う
(プロセス終了しちゃう)
その2 作らず
失敗
・持たず
・作らず
・持ち込まず
非ぬるぽ3原則
・ぬるぽは絶対に出るわ!当たり前やろ!
プログラマが持ち込まないほかない
・飽くなきテスト
・@NotNull @Nullableとか
・チェック制約
・バリデーション
・java.util.Optional
・Kotlin
非ぬるぽ3原則 〜持ち込まず〜
絶対ぬるぽを発生させな
いのはあなたたちです!
おしまい

絶対にぬるぽを出さない