zoukankan      html  css  js  c++  java
  • Java线程运行轨迹-代码追踪与定位

    今天在写程序时,想到一个问题,当我的程序出异常的时候,控制台输出信息中,明确指出了出现异常的位置,并详细列举了函数的调用层次关系,它是怎么做到的。

    竟然想到了这个问题,就去查看了源代码,不过没点几下,就遇到了native本地方法,只好作罢。于是又去网上找了这方面的资料,最后找到了一点这方面的东西,不过它给出的只是API,却并没有对代码做什么解释。代码如下


    public class Test {
    	public static int getLineNumber() {
    		return Thread.currentThread().getStackTrace()[2].getLineNumber();
    	}
    
    	public static String getFileName() {
    		return Thread.currentThread().getStackTrace()[2].getFileName();
    	}
    
    	public static void main(String args[]) {
    		System.out.println("[" + getFileName() + ":" + getLineNumber() + "]" + "Hello World!");
    	}
    }

    这程序中为什么要取数组中的第二个呢?原帖没有给出解释。

    接着,我自己去写了一段代码进行测试,代码如下

    class StackTraceDemo
    {
    	public static void main(String[] args) 
    	{
    		System.out.println(findLocation(2));
    		System.out.println();
    		System.out.println(findAllLocation());
    	}
    
    	public static String findAllLocation()
    	{
    		StringBuilder locations = new StringBuilder();
    		StackTraceElement elements [] = Thread.currentThread().getStackTrace();
    
    		for(int i=0;i<elements.length;i++){
    			locations.append(findLocation(i) +"
    ");
    		}
    	
    		return locations.toString();
    	}
    	
    	public static String findLocation(int level)
    	{
    		StackTraceElement element = Thread.currentThread().getStackTrace()[level];
    		return "File: "+element.getFileName()+" Line: "+element.getLineNumber()+" Method: "+element.getMethodName();
    	}
    }
    

    程序运行得到这样的结果:

    File: StackTraceDemo.java Line: 5 Method: main


    File: Thread.java Line: 1567 Method: getStackTrace
    File: StackTraceDemo.java Line: 24 Method: findLocation
    File: StackTraceDemo.java Line: 16 Method: findAllLocation


    从这个结果中来看,之所以前面那个程序选取第二个元素,是因为Java程序运行时函数入栈是在数组的起始位置入栈,其它的栈元素后移。这是我的个人之见,我也不敢确定自己所想是否正确,欢迎有别的看法的人或知道原理的人留言指点交流。


  • 相关阅读:
    原生Python机器学习分类之一Knn算法
    Java可视化文件(夹)加密解密压缩解压
    基于图搜索技术的八数码问题求解C++
    遗传算法解决TSP问题
    简单dp
    并查集
    KMP算法
    快速迭代
    为什么vs2017在代码右键上没有vs2013(第一个图)上实现抽象类这个选项?
    关于C#面向对象中的查看类图(没有此按键的问题)的解决方法 The solution to view class diagrams in C # object-oriented (without this key)
  • 原文地址:https://www.cnblogs.com/lvyahui/p/4009964.html
Copyright © 2011-2022 走看看