Java 需要';在System.out的实现中捕捉异常?

Java 需要';在System.out的实现中捕捉异常?,java,exception,system,out,Java,Exception,System,Out,我是java新手,为了弄清楚“System.out”,我阅读了相关的java源代码,然后发现了一些我无法理解的东西。 首先是“System.out”的源代码: 然后我转到nullPrintStream private static PrintStream nullPrintStream() throws NullPointerException { if (currentTimeMillis() > 0) { return null; } t

我是java新手,为了弄清楚“System.out”,我阅读了相关的java源代码,然后发现了一些我无法理解的东西。 首先是“System.out”的源代码:

然后我转到
nullPrintStream

private static PrintStream nullPrintStream() throws NullPointerException { 
    if (currentTimeMillis() > 0) { 
        return null; 
    } 
    throw new NullPointerException(); 
    } 
我的问题是:程序可能在函数
nullPrintStream()
中抛出
NullPointerException
,我们不需要在
public final static PrintStream out=nullPrintStream()中捕获异常?为了弄清楚这一点,我在Eclipse中编写了一些测试代码,如下所示:

package MainPackage;

public class Src {
    private static int throwException() throws Exception{
        int m = 1;
        if(m == 0) {
            throw new Exception();
        }
        return 0;
    }
    public static final int aTestObject = throwException();  <==Here i got an error
    public static void main(String args[]) {

    }
}
包MainPackage;
公共类Src{
私有静态int throwException()引发异常{
int m=1;
如果(m==0){
抛出新异常();
}
返回0;
}

public static final int-aTestObject=throweexception();
NullPointerException
是一个
运行时异常
-不需要显式捕获它

如果您让您的方法执行此操作,它不会在编译时爆炸:

private static int throwException() throws Exception{
    int m = 1;
    if(m == 0) {
        throw new RuntimeException();
    }
    return 0;
}

NullPointerException
是一个
RuntimeException
-不需要显式捕获它

如果您让您的方法执行此操作,它不会在编译时爆炸:

private static int throwException() throws Exception{
    int m = 1;
    if(m == 0) {
        throw new RuntimeException();
    }
    return 0;
}

Java有一类特殊的异常,称为。它们都扩展了
RuntimeException
对象,这反过来又扩展了
Exception
对象它不需要显式抛出。有几个不同的异常属于这一类别,例如
IllegalArgumentException
IllegalStateException

编码时使用RTE的优点是,您不需要用大量的try/catch/throws语句来覆盖代码,特别是在异常预计极为罕见且不太可能发生的情况下。此外,如果您有捕获RTE的通用机制,这也将有助于确保您的应用程序处理expection co干净的口红

也就是说,RTE可能更难处理,因为从签名中看不出特定的类或方法会抛出这种类型的异常。因此,除非它们有很好的文档记录,否则它们并不总是API的好主意


A是一个RuntimeException,因此不需要在方法签名中显式声明。

Java有一类特殊的异常被调用。它们都扩展了
RuntimeException
对象,这反过来又扩展了
Exception
对象。RuntimeException的特殊之处在于(与常规异常相反)是它不需要显式抛出。几个不同的异常可以归入这一类别,例如
IllegalArgumentException
IllegalStateException

编码时使用RTE的优点是,您不需要用大量的try/catch/throws语句来覆盖代码,特别是在异常预计极为罕见且不太可能发生的情况下。此外,如果您有捕获RTE的通用机制,这也将有助于确保您的应用程序处理expection co干净的口红

也就是说,RTE可能更难处理,因为从签名中看不出特定的类或方法会抛出这种类型的异常。因此,除非它们有很好的文档记录,否则它们并不总是API的好主意

是一个运行时异常,因此不需要在方法签名中显式声明

如果我坚持在私有静态int throwException()中抛出Exception(),我应该如何修改公共静态final int-aTestObject=throwException()

您可能需要初始化静态块中的值并捕获其中的异常

public static final int aTestObject;
static {
  try {
    aTestObject = throwException();  <==Here i got an error
  } catch (Exception e) {
    throw new AssertionError(e);
  }
}
公共静态最终int aTestObject;
静止的{
试一试{
aTestObject=throweException();
如果我坚持在私有静态int throwException()中抛出Exception(),我应该如何修改公共静态final int-aTestObject=throwException()

您可能需要初始化静态块中的值并捕获其中的异常

public static final int aTestObject;
static {
  try {
    aTestObject = throwException();  <==Here i got an error
  } catch (Exception e) {
    throw new AssertionError(e);
  }
}
公共静态最终int aTestObject;
静止的{
试一试{

aTestObject=throwException();谢谢,我知道了。但我还有一个问题:如果我坚持在私有静态int-throwException()中抛出
Exception()
,我应该如何修改
public static final int-aTestObject=throwException()查看Peter Lawrey的答案。如果您需要检查异常,请使用他的静态初始值设定项。当然,如何处理它取决于您,他选择了AssertionError,这是一个明智的选择-很难从未正确初始化的类中恢复!谢谢,我知道了。但我还有一个问题:如果我坚持抛出
异常()
私有静态int-throwException()
中,我应该如何修改
公共静态final int-aTestObject=throwException();
?参见Peter Lawrey的答案。如果您需要检查异常,请在那里使用他的静态初始值设定项。当然,如何处理它取决于您,他选择了AssertionError,这是一个明智的选择-很难从未正确初始化的类中恢复!