java.io.BufferedWriter.min(int a,int b)的重点是什么?

时间:2016-02-13 20:47:26

标签: java java-io bufferedwriter

java.io.BufferedWriter中有一种方法:

/**
 * Our own little min method, to avoid loading java.lang.Math if we've run
 * out of file descriptors and we're trying to print a stack trace.
 */
private int min(int a, int b) {
    if (a < b) return a;
    return b;
}

这种方法有什么意义?加载java.lang.Math所需的额外文件描述符?

如果我使用-verbose:class

编译并运行空程序
public class Main {
    public static void main(String[] args) {
    }
}

我会得到日志:

[Loaded java.lang.Math from /opt/jdk/jdk1.8.0_65/jre/lib/rt.jar]

2 个答案:

答案 0 :(得分:2)

错误是这样说:

如果在尝试打印堆栈跟踪时用完了文件描述符,并且调用了Math.min(a, b),并且类加载器尚未加载Math(不太可能,但可能会发生,例如在启动时),那么你甚至无法生成堆栈跟踪。因此,他们已将min直接添加到BufferedWriter类以避免这种情况。

答案 1 :(得分:2)

如果您的JVM很早就失败,Math可能尚未加载。在调用main之前,您的JVM执行了大量工作并运行了大量代码。这意味着在你达到这一点之前很多事情都会出错。

例如,这个简单的程序

public class HowManyStrings {
    public static void main(String[] args) throws IOException {
        System.out.println("Hello world");
        System.in.read();
    }
}

创建大约10,000个对象。

http://vanillajava.blogspot.co.uk/2015/10/common-misconception-how-many-objects.html