понедельник, 18 июня 2012 г.

Как компилятор java типы проверял

Жил-был компилятор по имени Javac. Он был хорошо воспитан и отличался изысканным вкусом (строгим статическим). Но однажды попалась ему такая программа:
public class Foo {
    public static int foo() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println(foo());
    }
}
Посмотрел он на неё и резонно заявил:
Foo.java:3: incompatible types
found   :
required: int
        return null;
               ^
1 error
Не угодила она компилятору, оказалась не в его вкусе. Но программа очень хотела понравится компилятору и решила попытать счастья снова:
public class Foo {
    public static int foo() {
        return true ? null : 0;
    }

    public static void main(String[] args) {
        System.out.println(foo());
    }
}
Компилятор ничего не заподозрил и всё получилось. У них появился замечательный малыш Foo.class.

Но счастье их длилось не долго. Коварный NullPointerException прервал их идиллию и выстрелил в колени обоим.
Exception in thread "main" java.lang.NullPointerException
    at Foo.foo(Foo.java:3)
    at Foo.main(Foo.java:7)
По мотивам 2ch.so/pr/