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

竟然想到了这个问题,就去查看了源代码,不过没点几下,就遇到了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) +"\n");
} 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程序运行时函数入栈是在数组的起始位置入栈,其它的栈元素后移。这是我的个人之见,我也不敢确定自己所想是否正确,欢迎有别的看法的人或知道原理的人留言指点交流。

Java线程运行轨迹-代码追踪与定位的更多相关文章

  1. Java中运行javascript代码

    Java中运行javascript代码 1.Java 代码 2.JS代码 2.1demoWithParams.js 2.2demoWithListParams.js 原文作者:russle 原文地址: ...

  2. Java线程池ExecutorService 代码备忘

    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5)创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 p ...

  3. iOS 后台运行执行代码(例如定位)

  4. app 自动化测试 Appium+Java可以运行的代码

    地址:http://www.cnblogs.com/sunny-sl/p/6520465.html

  5. java 线程安全不线程不安全

    经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vec ...

  6. java线程详解(一)

    1,相关概念简介 (1)进程:是一个正在执行的程序.每一个进程执行都有一个执行的顺序,该顺序就是一个执行路径,或者叫一个控制单元.用于分配空间. (2)线程:就是进程中一个独立的控制单元,线程在控制着 ...

  7. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  8. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  9. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

随机推荐

  1. Scrapinghub | Professional Services

    VShell破解版 VShell破解版 Scrapinghub | Professional Services OUR PROFESSIONAL SERVICES INCLUDE

  2. Android实现弹出输入法时,顶部固定,中间部分上移的效果

    前言 最近做项目时碰到一个问题,在意见反馈里面,提交按钮写到顶部,当用户输入反馈意见或者邮箱手机号时,弹出的输入法会上移整个页面,导致提交按钮显示不了. 很明显,这样的界面是非常不友好的,找了一些资料 ...

  3. rnqoj-73-展演队型-dp

    纯属于敢想就敢做的题目,列出来状态转移就OK了 #include<stdio.h> #include<string.h> #include<iostream> #i ...

  4. C:\WINDOWS\system32\drivers\etc\hosts host文件夹里面的内容是什么?

    这个文件是根据TCP/IP for Windows 的标准来工作的,它的作用是包含IP地址和Host name(主机名)的映射关系,是一个映射IP地址和Host name(主机名)的规定,规定要求每段 ...

  5. javascript 匿名函数的理解,js括号中括function 如(function(){})

    代码如下: (function(){  //这里忽略jQuery所有实现  })();  (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也 ...

  6. 超人学院Hadoop大数据资源分享

    超人学院Hadoop大数据资源分享 http://bbs.superwu.cn/forum.php?mod=viewthread&tid=770&extra=page%3D1 很多其它 ...

  7. linux 同步备份 rsyncd 相关设置

    17:25 2013/10/18------------------ rsync linux 同步备份服务器 配置vi /etc/rsyncd.conf 配置文件 /usr/bin/rsync --d ...

  8. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...

  9. Qt 学习之路:绘制设备

    绘图设备是继承QPainterDevice的类.QPaintDevice就是能够进行绘制的类,也就是说,QPainter可以在任何QPaintDevice的子类上进行绘制.现在,Qt 提供了若干这样的 ...

  10. Java(Android)线程池 总结

        JAVA的Executors源码:(可以看出底层都是通过ThreadPoolExecutor来具体设置的~) public static ExecutorService newCachedTh ...