java中异常err什么意思?e.printStackTrace() ; 是什么意思
大家好,关于java中异常err什么意思很多朋友都还不太明白,今天小编就来为大家分享关于e.printStackTrace() ; 是什么意思的知识,希望对各位有所帮助!
printstacktrace什么意思
捕获异常的语句:e.printStackTrace();
1、e是Throwable的实例异常对象,用在catch语句中,相当于一个形参,一旦try捕获到了异常,那么就将这个异常信息交给e,由e处理,printStackTrace()是异常类的一个方法。与它重载的方法还有printStackTrace(PrintStream s)和printStackTrace(PrintWriter s)。
2、在Throwable类中printStackTrace()内部是这样执行的:
public void printStackTrace(){
printStackTrace(System.err);
}
3、它调用了printStackTrace(PrintStream s)方法。err是System类当中的一个静态PrintStream类型字段。所以它能传递进去。
扩展资料
public void printStackTrace()将此 throwable及其追踪输出至标准错误流。此方法将此 Throwable对象的堆栈跟踪输出至错误输出流,作为字段 System.err的值。输出的第一行包含此对象的 toString()方法的结果。
剩余行表示以前由方法 fillInStackTrace()记录的数据。此信息的格式取决于实现,但以下示例是最常见的:java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3)
参考资料
百度百科-Java
java "字段"啥意思
public final static InputStream in= nullInputStream();
nullInputStream是这样实现的:
private static InputStream nullInputStream() throws NullPointerException{
if(currentTimeMillis()> 0)
return null;
throw new NullPointerException();
}
他不是返回null,就是抛出异常,如何初始化in呢?
解答:
看了一下java.lang.System的源代码.
System类里有大量的native方法,是调用本地代码的,这些代码很可能是由虚拟机来调用的.
System类的开头有一段:
static{
registerNatives();
}
这段代码会在虚拟机启动的时候就执行,它在虚拟机里注册System需要使用的一些本地代码
比如:
private static native Properties initProperties(Properties props);
private static native void setOut0(PrintStream out);
在windows下的话,它就告诉虚拟机到哪个dll文件里去找相应的实现
>然而,我知道out是一个PrintStream的对象,但我查看了有关的原代码:public final static PrintStream out= nullPrintStream();
>public final static InputStream in= nullInputStream();
在nullInputStream()方法里有注释解释为什么会设置为空:
/**
* The following two methods exist because in, out, and err must be
* initialized to null. The compiler, however, cannot be permitted to
* inline access to them, since they are later set to more sensible values
* by initializeSystemClass().
*/
private static InputStream nullInputStream() throws NullPointerException{
if(currentTimeMillis()> 0)
return null;
throw new NullPointerException();
}
也就说in, out, and err初始化为null,然后会在后来由initializeSystemClass()方法类初始化成有意义的值
/**
* Initialize the system class. Called after thread initialization.
*/
private static void initializeSystemClass(){
props= new Properties();
initProperties(props);
sun.misc.Version.init();
FileInputStream fdIn= new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut= new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr= new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn));!!!
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));!!!
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));!!!
// Enough of the world is now in place that we can risk
// initializing the logging configuration.
try{
java.util.logging.LogManager.getLogManager().readConfiguration();
} catch(Exception ex){
// System.err.println("Can′t read logging configuration:");
// ex.printStackTrace();
}
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
// Subsystems that are invoked during initialization can invoke
// sun.misc.VM.isBooted() in order to avoid doing things that should
// wait until the application class loader has been set up.
sun.misc.VM.booted();
}
in,out,err就是在以上方法以下三条语句里初始化的.
setIn0(new BufferedInputStream(fdIn));!!!
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));!!!
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));!!!
看
private static native void setIn0(InputStream in);
~~~~~~~
这是个native函数,是前面registerNatives()的时候注册了的.这个函数应该是把实际连接到输入输出设备的句柄传给虚拟机并赋值给in,out,err
至于:
>InputStream是个抽象的类,怎么能使用char=(char)System.in.read()读入一个字符
我想你还没有明白什么是面向对象.
看看下面代码,我用OutputStream(也是抽象类,跟InputStream对应的输出类)以方便演示:
import java.io.IOException;
import java.io.OutputStream;
public class HelloWorld{
public OutputStream out=null;
public void setOutputStream(OutputStream out){
this.out=out;
}
public static void main(String[] args) throws IOException{
HelloWorld h=new HelloWorld();
PrintStream myOut=System.out;//System.out是一个PrintStream
h.setOutputStream(myOut);
h.out.write("hello,world".getBytes());//一般没人这么写的
}
}
以上代码执行后会输出hello,world
h.out是OutputStream,也是个抽象类,为什么能write(o)呢?
因为PrintStream是OutputStream的子类,所以能被"当作"OutputStream传给h.setOutputStream(myOut);
h.out.write执行的时候实际上是调用这个传进来的PrintStream实例的write方法
同样System.in和out肯定也是在initializeSystemClass()的时候被赋予了一个实际的可用的子类
要能体会到面向对象的好处,就要逐渐适应"对接口编程"的思想,相同接口的对象可以根据需要方便的替换.
比如,我刚才传了一个PrintStream,因此HelloWorld输出到了屏幕上.我如果传给OutputStream的另一个子类FileOutputStream,就会输出到文件里
>还有为什么不是说字符流:writer和reader一般用于UniCode的读写吗?为什么键盘的输入用reader类呢?
不知道你在哪里看到说writer和reader一般用于UniCode的读写
e.printStackTrace() ; 是什么意思
捕获异常的语句:e.printStackTrace();
1、e是Throwable的实例异常对象,用在catch语句中,相当于一个形参,一旦try捕获到了异常,那么就将这个异常信息交给e,由e处理,printStackTrace()是异常类的一个方法。与它重载的方法还有printStackTrace(PrintStream s)和printStackTrace(PrintWriter s)。
2、在Throwable类中printStackTrace()内部是这样执行的:
public void printStackTrace(){
printStackTrace(System.err);
}
3、它调用了printStackTrace(PrintStream s)方法。err是System类当中的一个静态PrintStream类型字段。所以它能传递进去。
扩展资料
public void printStackTrace()将此 throwable及其追踪输出至标准错误流。此方法将此 Throwable对象的堆栈跟踪输出至错误输出流,作为字段 System.err的值。输出的第一行包含此对象的 toString()方法的结果。
剩余行表示以前由方法 fillInStackTrace()记录的数据。此信息的格式取决于实现,但以下示例是最常见的:java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3)
参考资料
百度百科-Java
文章到此结束,如果本次分享的java中异常err什么意思和e.printStackTrace() ; 是什么意思的问题解决了您的问题,那么我们由衷的感到高兴!