1

我正在尝试为学校编写一个 JAVA 程序。它要求我们使用提供的类,避免使用拆分,并解析:不同部分之间分隔的电话号码。

    package aaronjonesprog1;


public class AaronJonesProg1 {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
        AJDissector phone = new AJDissector("1:919:882:5000");
        System.out.println(phone.getPhoneNumber());
        System.out.println(phone.getPhoneNumber(4));
        System.out.println(phone.getPhoneNumber(1));
        System.out.println(phone.getPhoneNumber(3));
        System.out.println(phone.getPhoneNumber(2));
    }
}

我的司机:

    package aaronjonesprog1;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Aaron
 */
public class AJDissector
{

    private String phoneColon;
    private int areaCode, preCode, number, countryCode, emptyNum;   

    public AJDissector(String phoneNum)
    {
        this.phoneColon         = phoneNum;
        int index0      = phoneNum.indexOf(":");
        int index1      = phoneNum.indexOf(":", index0);
        int index2      = phoneNum.lastIndexOf(":");

        this.countryCode    = Integer.parseInt(phoneNum.substring(0, index0));
        this.areaCode       = Integer.parseInt(phoneNum.substring(index0, index1));
        this.preCode        = Integer.parseInt(phoneNum.substring(index1, index2));
        this.number         = Integer.parseInt(phoneNum.substring(index2));
    }

    public String getPhoneNumber()
    {
        return this.phoneColon;
    }

    public int getPhoneNumber(int a)
    {
        switch (a) 
        {
            case 1:
                return this.number;
            case 2:
                return this.countryCode;
            case 3:
                return this.preCode;
            case 4:
                return this.number;
            default:
                return this.emptyNum;
        }
    }
}

我收到的错误是:

   Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.parseInt(Integer.java:527)
    at aaronjonesprog1.AJDissector.<init>(AJDissector.java:26)
    at aaronjonesprog1.AaronJonesProg1.main(AaronJonesProg1.java:18)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

有人可以帮我理解我做错了什么吗?我不相信我用parseInt错了。我查看了http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html试图弄清楚,但我认为我的代码是正确的。谁能告诉我我在这里做错了什么?

4

3 回答 3

3

请注意,该substring方法在指定索引处开始子字符串,包括在内。您从中获得的值是字符indexOf的索引。您对和:的使用存在问题。substring indexOf(char, index)

在尝试解析它们之前打印出 - 或在调试器中检查 - 你得到的每个索引和你的子字符串,你会看到有什么问题。

例如,在您AJDissector获取子字符串的构造函数中,尝试:

System.out.println("substring 2 indexes: " + index0 + ", " + index1);
System.out.println("substring 2: " + phoneNum.substring(index0, index1));

对于每个索引,查看整个索引String,并且 - 记住索引开始于0-substring在您的脑海中完成工作。

于 2012-08-23T01:25:39.660 回答
1

还有另一种方法可以做到这一点。您可以使用 string.replace 方法将其分解或插入您的 : 符号这里是来自另一个程序的示例

 outputString = outputString.replaceAll(",",",\n" + " " );
 outputString = outputString.replaceAll("\\{","\\{\n" +" ");
 outputString = outputString.replaceAll(":",": ");
 outputString = outputString.replaceAll("}",",\n}");
 StringTokenizer output2 = new StringTokenizer(outputString,", ",true);

这组替换字符串做了一些奇怪的格式化,对于这篇文章的主题来说很难解释,但是研究一下 ythis,你就会明白。要理解这一点,请参阅 java String api

于 2012-08-23T03:24:45.877 回答
0

也许您应该进一步了解 Java API,可能是这样的:java.util.Scanner.

从javadocs:

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。

java.util.Scanner API 文档

于 2012-08-23T03:33:37.993 回答