【问题标题】:Why am I getting "java.lang.NumberFormatException" when trying to convert this string into an integer?为什么在尝试将此字符串转换为整数时出现“java.lang.NumberFormatException”?
【发布时间】:2013-02-28 16:34:23
【问题描述】:

我一直在创建一个 Java 程序来编码从用户收到的消息。只是为了了解它是如何做到这一点的一些背景知识:它应该获取输入,将其拆分为字符,然后从 Random.org(真正的随机数生成器)获取一组等于消息长度的随机数,然后移位输入的字符通过其相应的移位或随机数,然后输出编码的消息和移位。到目前为止,我已经获得了输入,将其转换为字符串数组,检查了配额(Random.org 有配额)并获得了随机数。尝试输出转换后的班次时出现此错误(从网站上获得的字符串到整数),我认为这是因为最后一个数字上有一个 CRLF(我尝试使用正则表达式来解决这个问题,但它没有工作)。这是我的代码:

公共类 Encryption_System { static String originalMessege;

public static void main(String[] args) throws Exception {
    System.out.println("Welcome to the encryption system!");
    System.out.println("Type your messege below:");
    System.out.println("\nHere is your original messege: " + scan() + "\n");
    Encrypt code = new Encrypt();
    code.Messege(originalMessege);
    code.encryptMessege();

}

private static String scan() {
    Scanner scan = new Scanner(System.in);
    originalMessege = scan.nextLine();
    return originalMessege;
}

}

然后是第二节课,我的问题就出在这里。我的错误来自最后一种方法(我尝试的正则表达式修复被注释掉了):

public class Encrypt {
    private String messege;
    private String[] characters;
    private URL quotaURL;
    private URLConnection conect;
    private InputStream quotaInput;
    private BufferedReader quotaReader;
    private int quota;
    private boolean go;
    private URL shiftsURL;
    private URLConnection conectShifts;
    private InputStream shiftsInput;
    private BufferedReader shiftsReader;
    private int count;
    private char[] shifts;
    private int[] shiftsInt;
    private String shiftsString;
    private String[] shiftsStrings;

    public void Messege(String x) {
        messege = x;
    }

    private String[] getCharacters() {
        characters = messege.split("(?!^)");
        return characters;
    }

    private boolean checkQuota() throws Exception {
        quotaURL = new URL("http://www.random.org/quota/?format=plain");
        conect = quotaURL.openConnection();
        quotaInput = conect.getInputStream();
        quotaReader = new BufferedReader(new InputStreamReader(quotaInput));
        int quota = Integer.parseInt(quotaReader.readLine());
        if (quota >= getCharacters().length)
            go = true;
        else
            go = false;
        return go;
    }

    private char[] Shifts(String[] x1) throws Exception {
        String[] messegeArray = x1;
        count = 0;
        for (int k = 0; k < x1.length; k++) {
            if (x1[k].equals(" ")) {
                continue;
            } else {
                count++;
            }
        }
        shifts = new char[count * 3];
        if (checkQuota() == true) {
            shiftsURL = new URL("http://www.random.org/integers/?num=" + count
                    + "&min=1&max=27&col=" + count
                    + "&base=10&format=plain&rnd=new");
            conectShifts = shiftsURL.openConnection();
            shiftsInput = conectShifts.getInputStream();
            shiftsReader = new BufferedReader(
                    new InputStreamReader(shiftsInput));
            shiftsReader.read(shifts, 0, count * 3);
        }

        return shifts;
    }

    public void encryptMessege() throws Exception {
        char[] currentShifts = Shifts(getCharacters());
        shiftsString = new String(currentShifts);
        //  shiftsString.replace("[\t\r\n]", "");
        shiftsStrings = shiftsString.split("[(  )]");
        shiftsInt = new int[shiftsStrings.length];
        System.out.println("These are your shifts");
        for (int v = 0; v < shiftsInt.length; v++) {
            shiftsInt[v] = Integer.parseInt(shiftsStrings[v]);
            System.out.println(shiftsInt[v] + " ");
        }
    }
}

这是我的输出:

Welcome to the encryption system!
Type your messege below:
Hello

Here is your original messege: Hello

These are your shifts
3 
19 
12 
3 
Exception in thread "main" java.lang.NumberFormatException: For input string: "12

Process completed.

我只是一个 Java 初学者(高中一年级 comp sci),所以感谢您的帮助!

【问题讨论】:

  • 请添加完整的堆栈跟踪并减少附加代码的数量
  • 这是堆栈跟踪。我的 IDE(Jcreator)输出的正是上面的内容。

标签: java parsing url encryption random


【解决方案1】:

你的代码对我来说失败了,因为:

shiftsStrings = shiftsString.split("[(  )]");

未正确拆分值。

编辑:

试试这个:

public void encryptMessege() throws Exception {
    List<Integer> shifts = new ArrayList<Integer>();
    StringTokenizer st = new StringTokenizer(new String(Shifts(getCharacters())));
    while(st.hasMoreTokens())
    {
        String token =st.nextToken();
        try{
            shifts.add(Integer.parseInt(token));
        }catch(NumberFormatException e)
        {
            System.out.println("did not parse: " + token);
        }
    }

    System.out.println("These are your shifts: " + shifts.toString());
}

请注意,您应该在代码中处理很多事情。

1) 在方法中封装功能。当您将所有变量保留为类级别属性时,它会变得混乱。如果您使用参数在方法之间传递它们,您将更容易阅读代码,并且更容易测试您的代码。

2) 方法名称应以小写字母开头。这是常见的 Java 编码实践。

【讨论】:

  • shiftsStrings = shiftsString.split(" "); 是正确的方法吗?它没有改变任何输出。
  • 我喜欢那个解决方案,它运作良好:) ...但我会弄清楚那部分。谢谢:)
  • 忽略(“但我稍后会弄清楚那部分”)
【解决方案2】:

问题似乎来自这里:

shiftsInt[v]= Integer.parseInt(shiftsStrings[v]);

v 的 for 循环值达到 4 时,这将失败。从for循环中删除表达式,看看shiftsStrings中的每个字符串可以实际解析为int。尝试执行此操作:

for(int v = 0; v < shiftsStrings.length; v++ ) {
    System.out.println(shiftsStrings[v]);
}

如果输出中有意外情况,下一步是找出(并可能删除)该值如何在数组中找到它的位置。

【讨论】:

  • 我有,它会打印出正确数量的数字,所有数字都由制表符和最后的 CRLF 分隔。
【解决方案3】:

如果你认为这是由于最后一个数字中的非数字字符,那么在将其放入 parseInt 之前,使用非数字字符替换它(你可以使用\r\n 等等也开)。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#replace(char, 字符)

Trim 是另一种有用的方法,它会删除所有前导和尾随空格。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim()

【讨论】:

  • 我也是这么想的,但是当我使用replace("[\t\r\n]", "");(以及它的其他变体)以及修剪时,它不起作用......
  • replace("[\t\r\n]", ""); - Java 并不聪明。那个方法调用告诉 Java [\t\r\n] 是一个正则表达式而不是一个字符串呢?
  • 你是对的,我一开始使用replaceAll("[\t\r\n]", "")(也没有工作)但我用相同的参数调用了替换。
  • 如果你使用正则表达式,你可能需要加倍反斜杠,例如replaceAll("[\\t\\r\\n]", "")。不确定它是否也适用于 Java,但我知道它适用于其他语言。
  • 我昨天刚学了正则表达式,所以不知道语句的有效性,但是我试了一下,编译执行了,还是报了同样的错误。
猜你喜欢
  • 2017-01-29
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 2013-10-24
  • 2020-07-19
  • 2021-10-06
相关资源
最近更新 更多