Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在尝试将此字符串转换为整数时会出现“java.lang.NumberFormatException”?_Java_Parsing_Url_Encryption_Random - Fatal编程技术网

为什么在尝试将此字符串转换为整数时会出现“java.lang.NumberFormatException”?

为什么在尝试将此字符串转换为整数时会出现“java.lang.NumberFormatException”?,java,parsing,url,encryption,random,Java,Parsing,Url,Encryption,Random,我一直在创建一个Java程序,对从用户收到的消息进行编码。只是想了解一下它是如何做到这一点的:它应该获取输入,将其拆分为字符,然后从random.org true random number generator获取一组与消息长度相等的随机数,然后将输入的字符按相应的移位或随机数移位,然后输出编码信息和移位。到目前为止,我已经获得了输入,将其转换为字符串数组,检查quota Random.org是否有配额,并获得了随机数。我在尝试将从网站上获取的字符串转换为int时遇到了这个错误,我想这是因为上一

我一直在创建一个Java程序,对从用户收到的消息进行编码。只是想了解一下它是如何做到这一点的:它应该获取输入,将其拆分为字符,然后从random.org true random number generator获取一组与消息长度相等的随机数,然后将输入的字符按相应的移位或随机数移位,然后输出编码信息和移位。到目前为止,我已经获得了输入,将其转换为字符串数组,检查quota Random.org是否有配额,并获得了随机数。我在尝试将从网站上获取的字符串转换为int时遇到了这个错误,我想这是因为上一个数字上有一个CRLF,我尝试使用正则表达式来解决这个问题,但它不起作用。这是我的密码:

公共类加密系统{ 静态字符串原始值

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] + " ");
        }
    }
}

我只是一个Java初学者,高中一年级的comp-sci,所以谢谢你的帮助

问题似乎源于此:

shiftsInt[v]= Integer.parseInt(shiftsStrings[v]);
当for循环中的v值达到4时,这将失败。从for循环中删除表达式,并查看shiftsStrings中的每个字符串是否都可以解析为int。请尝试执行以下操作:

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

如果输出中出现意外情况,下一步将是找出并可能删除该值在数组中的位置

如果您认为这是由于最后一个数字中的非数字字符造成的,那么在将其放入parseInt之前,请使用非数字字符替换它,\r\n等等

,char

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


我无法使用您的代码,因为:

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编码实践。

请添加完整的堆栈跟踪并减少附加的代码量这是堆栈跟踪。我的IDE Jcreator输出的正是上面的内容。我也这么认为,但当我使用replace[\t\r\n]时;和它的其他变体以及修剪,但它不起作用…替换[\t\r\n],;-Java并不聪明。那个方法调用告诉Java[\t\r\n]是一个正则表达式而不是一个字符串呢?您是对的,我起初使用的是replaceAll[\t\r\n],但它也不起作用,但我用相同的参数调用了replace。如果您使用的是正则表达式,可能需要在反斜杠上加倍,例如replaceAll[\\t\\r\\n]。我不确定它是否也适用于Java,但我知道它适用于其他语言。我昨天刚刚学习了regex,所以我不知道该语句的有效性,但我尝试了它,它编译并执行了,但给了我相同的错误。我,它会打印出正确数量的数字,所有数字都在末尾由制表符和CRLF分隔;这是正确的方法吗?它没有改变任何输出。我喜欢这个解决方案,它工作得很好:。。。但我会把那部分弄清楚的。谢谢:不要理会这个问题,但我会在以后解决这个问题
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());
}