在本文中,我们将详细介绍在Java中使用e.printStackTrace的各个方面,并为您提供关于的相关解答,同时,我们也将为您带来关于e.getMessage()e.printStackTrace
在本文中,我们将详细介绍在Java中使用e.printStackTrace的各个方面,并为您提供关于的相关解答,同时,我们也将为您带来关于e.getMessage() e.printStackTrace() 和e.printStackTrace() 小结、e.printStackTrace();、e.printStackTrace()导致的锁死、e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中的有用知识。
本文目录一览:- 在Java中使用e.printStackTrace()(在Java中使用(__)类型的实例对象表示一个字符串)
- e.getMessage() e.printStackTrace() 和e.printStackTrace() 小结
- e.printStackTrace();
- e.printStackTrace()导致的锁死
- e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中
在Java中使用e.printStackTrace()(在Java中使用(__)类型的实例对象表示一个字符串)
这可能是一个新手问题,但希望您能帮助我。:)我有这样的事情:
try{ //try to do something there}catch (IOException e){//handle the exception e.printStackTrace();}
我使用的是NetBeans IDE,由于某种原因,在弯曲的行中加了下划线的是printStackTrace。当我按Alt +
Enter时,提示应删除Throwable.printStackTrace()。这是什么意思?谁能提供更多的见解,这可能意味着什么?还是我可以忽略这个?
谢谢!
答案1
小编典典这只是一个建议。在eclipse中很好-
我相信这只是IDE告诉您,还有其他一些常规方法可以执行此操作。我发现它对于调试很有用,并且应该在发生致命错误时告诉用户使用调试模式(例如控制台开关-d)来收集这些日志。
e.getMessage() e.printStackTrace() 和e.printStackTrace() 小结
1 e.getMessage() ; 只会获得异常的名称。比如说NullPoint 空指针,就告诉你说是空指针
2.e.toString(): 获得异常种类和错误信息
3.e.printStackTrace(); 在控制台打印打印出详细的异常信息,异常名称。便于调试
3 如果异常是用无参构造器构造后续又没有设置message的话一般就是null,如果用带String参数的构造器构造的话,返回的就是那个参数。
下面是栗子1:
public static String str =null;
public static void main( String[] args )
{
try{
if(str.equals("name")){}
}catch (Exception e){
System.out.println("e.toString()打印结果: "+ e.toString());
System.out.println("e.getMessage()打印结果: "+ e.getMessage());
System.out.println("============分割线=============");
e.printStackTrace();
}
}
执行结果:
e.toString()打印结果: java.lang.NullPointerException
e.getMessage()打印结果: null
============分割线=============
java.lang.NullPointerException
at test.App.main(App.java:13)
下面是栗子2:
public static int m = 0;
public static void main( String[] args )
{
try{
m = 899/0;
}catch (Exception e){
System.out.println("e.toString()打印结果: "+ e.toString());
System.out.println("e.getMessage()打印结果: "+ e.getMessage());
System.out.println("============分割线=============");
e.printStackTrace();
}
}
执行结果:
e.toString()打印结果: java.lang.ArithmeticException: / by zero
e.getMessage()打印结果: / by zero
============分割线=============
java.lang.ArithmeticException: / by zero
at test.App2.main(App2.java:13)
e.printStackTrace();
catch(Exception e){
e.printStackTrace() ;
}
当 try 语句中出现异常是时,会执行 catch 中的语句,java 运行时系统会自动将 catch 括号中的 Exception e 初始化,也就是实例化 Exception 类型的对象。e 是此对象引用名称。然后 e(引用)会自动调用 Exception 类中指定的方法,也就出现了 e.printStackTrace () ;。
printStackTrace () 方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)
关于 System.out.println (e) 与 e.printStackTrace ()
在抛出异常的情况下,有很多方法,System.out.println (e); 这个方法打印出异常,并且输出在哪里出现的异常;e.printStackTrace () 也是打印出异常,但是它还将显示出更深的调用信息。比如说:
A extends ---> B extends---> C
当在创建 A 的过程中出现问题了,我们抛出异常。<
System.out.println (e),除了标准异常外,只打印 at A 然后再向外层层输出。
e.printStackTrace (),除了标准异常外,打印
at C
at B
at A
....... 再向外层调查。
在向外层调查的情况下,都一样。最后都会回到 com.sun.midp.main.Main.main
System.out.println (); 当发生异常时显示你自己设定的字符串信息;就比如下面的代码,try 里面进行 IO 操作,你知道要抛出异常肯定也是 IO 异常,catch 里面就写上特定的 IOException,自己打印就行了
try{
//function
}
catch(IOException exc){
System.out.println("IOException");
}
e.printStackTrace (); 是打印异常的堆栈信息,指明错误原因,其实当发生异常时,通常要处理异常,这是编程的好习惯,所以 e.printStackTrace () 可以方便你调试程序!
e.printStackTrace()导致的锁死
e.printStackTrace() 会导致锁死?这仅仅是打印啊,怎么可能?!
先别惊呼不可能,且听我细细道来。
先看截图1:
注意右下角区域,红框部分。这块内存是什么呢?非堆!那么,左边是代码缓存区内存,右边红框就是字符串池,常量,基本类型数据的内存区。然后呢?已经满了。什么原因呢?e.printStackTrace()!
满了的后果呢?整个web服务,访问之后,没响应了,就当是卡死掉了。
再来看截图2:
看看有多少web的请求线程,被卡住在打印这一步!原因呢?要打印字符串输出到控制台上,那你字符串常量池所在的内存块要有空间啊。然而,因为e.printStackTrace() 语句要产生的字符串记录的是堆栈信息,太长太多,内存被填满了!注意 上面代码语句:4208行!
来看图3:
没毛病,没没事儿找事儿冤枉谁。就是这句代码惹的祸!当然,我承认,被 try 住的代码本身就有问题,导致很多调用都会抛异常。
那么,让我们再来理理整个事件产生的经过:
短时间内大量请求访问此接口 -> 代码本身有问题,很多情况下抛异常 -> e.printStackTrace() 来打印异常到控制台 -> 产生错误堆栈字符串到字符串池内存空间 -> 此内存空间一下子被占满了 -> 开始在此内存空间产出字符串的线程还没完全生产完整,就没空间了 -> 大量线程产出字符串产出到一半,等在这儿(等有内存了继续搞啊)-> 相互等待,等内存,锁死了,整个应用挂掉了。
综上,这就是 e.printStackTrace() 引发的血案。
总结当然重要,有3点:
1,代码质量啊亲,代码不抛异常咱不就能愉快的继续浪么?
2,不要使用 e.printStackTrace() 啊,这玩意儿,在项目发布后,除过不断的刷控制台,并没用什么卵用啊,您到是用 log 对象输出到日志文件里面啊。
3,推及开来,在java中,会产生大量字符串的方法,使用时,一定得悠着点,别一不小心撑到肚子(字符串池所属的那么点非堆内存空间),撑到肚子了,会死的啊 。
e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中
1、e.printStackTrace()打印在哪里
在catch中的e.printStackTrace()将打印到控制台
2、e.printStackTrace()打印的内容是什么
如下代码:
import org.apache.logging.log4j.Logger;
public class ExceptionTest {
private static final Logger logger=LogManager.getLogger();
public void test() {
try {
int i=1/0;
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
ExceptionTest test= new ExceptionTest();
test.test();
}
}
输出结果如下:
java.lang.ArithmeticException: / by zero
at myProject.ExceptionTest.test(ExceptionTest.java:10)
at myProject.ExceptionTest.main(ExceptionTest.java:18)
可见,e.printStackTrace()打印了错误的具体信息,即这个错误出现的位置,便于查找错误源
3、如果将e.printStackTrace()的信息打印在日志里应该怎么做呢?
见如下代码:
package myProject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ExceptionTest {
private static final Logger logger=LogManager.getLogger();
public void test() {
try {
int i=1/0;
}catch(Exception e){
logger.error(e);
}
}
public static void main(String[] args) {
ExceptionTest test= new ExceptionTest();
test.test();
}
}
用logger.error(e);打印日志,输出结果如下:
19:17:39.753 [main] ERROR myProject.ExceptionTest - java.lang.ArithmeticException: / by zero
可见,用这种方法打印的日志,只有大概的错误信息,并没有指出报错的代码位置,不便于查找错误。用logger.error(e.getMessage());也是输出这种大概的错误信息。
再见如下代码:
package myProject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ExceptionTest {
private static final Logger logger=LogManager.getLogger();
public void test() {
try {
int i=1/0;
}catch(Exception e){
logger.error("ExceptionTest Exception:",e);
}
}
public static void main(String[] args) {
ExceptionTest test= new ExceptionTest();
test.test();
}
}
用logger.error("ExceptionTest Exception:",e);,则输出结果如下:
19:20:32.948 [main] ERROR myProject.ExceptionTest - ExceptionTest Exception:
java.lang.ArithmeticException: / by zero
at myProject.ExceptionTest.test(ExceptionTest.java:10) [classes/:?]
at myProject.ExceptionTest.main(ExceptionTest.java:18) [classes/:?]
这和e.printStackTrace()打印的内容大致是相同的。
关于在Java中使用e.printStackTrace和的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于e.getMessage() e.printStackTrace() 和e.printStackTrace() 小结、e.printStackTrace();、e.printStackTrace()导致的锁死、e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中等相关内容,可以在本站寻找。
本文标签: