关于Java异常的处理的一个小问题

当double d1 = Double.parseDouble(args[0]);发生异常时,我想在catch里面得到发生异常的这句话......

就是通过使用传进来的 e 杂个能得到发生异常的"double d1 = Double.parseDouble(args[0]);"这句话,以及这句话发生的本JAVA文件名,JAVA文件中这句话的行号等呢?

public static void main(String[] args) {
try{
if (3 != args.length){
System.out.println("Usage: TestArray1 " + "\"n1\""+" \"op\" " +"\"n2\"");
System.exit(-1);
}
double d1 = Double.parseDouble(args[0]);
}catch (Exception e) {
//?????在这里杂个写呢?
}
}

5个回答

可以从e.getStackTrace();返回的字符串中解析出你要的信息(因为没有直接的接口):

[code="java"] public static void main(String[] args) throws UnsupportedEncodingException, ClassNotFoundException {
try {
double d1 = Double.parseDouble("a");
} catch (Exception e) {
StackTraceElement[] trace = e.getStackTrace();
String firstException = trace[trace.length-1].toString();
String[] strList = firstException.split(".main");
String packageName = strList[0];
strList = strList[1].split(":");
String fileName = strList[0].substring(1);
String countNum = strList[1].substring(0, strList[1].length()-1);

        System.out.println("packageName: " + packageName);
        System.out.println("fileName: " + fileName);
        System.out.println("countNum: " + countNum);
    }
}[/code]

返回结果:
packageName: com.robert.base.TestClass
fileName: TestClass.java
countNum: 26

不过按照“effective java”说的,这是一种不好的获取信息的方式,最好不要采用。

System.out.println(e.toString());

把异常堆栈打出来?里面信息就很全了。。。。
当前执行文件名可以这样
this.class.getName()

[code="java"]

public class ExceptionParser {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {

        double d1 = Double.parseDouble(args[0]);
    } catch (Exception e) {
        // ?????在这里杂个写呢?

        StackTraceElement[] st = e.getStackTrace();
        StackTraceElement s = st[st.length-1];
        System.out.println("异常发生的文件名为:" + s.getFileName() );
        System.out.println("异常发生的类名为:" + s.getClassName() );
        System.out.println("异常发生的方法名为:" + s.getMethodName() );
        System.out.println("异常发生的行号为:" + s.getLineNumber() );

    }
}

}

[/code]

[code="java"]

public class ExceptionParser extends classStatus{

//String classPath = "/src/ExceptionParser.java";
public ExceptionParser() {
}

public static void main(String[] args) {   
    // TODO Auto-generated method stub   
    ExceptionParser test = new ExceptionParser();
    try {                
        double d1 = Double.parseDouble("a");   
    } catch (Exception e) {   
        // ?????在这里杂个写呢?   
        StackTraceElement[] st = e.getStackTrace();   
        StackTraceElement s = st[st.length-1];
        System.out.println("异常发生的文件名为:" + s.getFileName()); 
        System.out.println("异常发生的类名为:" + s.getClassName());   
        System.out.println("异常发生的方法名为:" + s.getMethodName());   
        System.out.println("异常发生的行号为:" + s.getLineNumber()); 
        //System.getProperty("user.dir")+"/src/ExceptionParser.java"
        //我的src是java的根目录,自己相应修改一下
        System.out.println("异常发生的行:"+readF(s.getLineNumber(),System.getProperty("user.dir")+"/src/ExceptionParser.java"));
    }   
}   

}

[/code]
[code="java"]
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class classStatus {

public static String readF(int errno,String childClassPath){
    String line = null;
    FileInputStream fin = null;
    BufferedReader in = null;
    try {
        int no = 1;//行数
        fin = new FileInputStream(childClassPath);
        in = new BufferedReader(new java.io.InputStreamReader(fin,"UTF-8"));
        line = in.readLine();
        no++;
        while(line!=null){
            line = in.readLine();
            if(no==errno){
                break;
            }
            no++;
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{
        if(in!=null){
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(fin!=null){
            try {
                fin.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return line;
}

}
[/code]
结果是
异常发生的类名为:ExceptionParser
异常发生的方法名为:main
异常发生的行号为:12
F:\companyWorkspace\paoding
异常发生的行: double d1 = Double.parseDouble("a");

catch (Exception e) {

        e.printStackTrace();
    }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问