为什么在尝试将此字符串转换为整数时会出现“java.lang.NumberFormatException”?
我一直在创建一个Java程序,对从用户收到的消息进行编码。只是想了解一下它是如何做到这一点的:它应该获取输入,将其拆分为字符,然后从random.org true random number generator获取一组与消息长度相等的随机数,然后将输入的字符按相应的移位或随机数移位,然后输出编码信息和移位。到目前为止,我已经获得了输入,将其转换为字符串数组,检查quota Random.org是否有配额,并获得了随机数。我在尝试将从网站上获取的字符串转换为int时遇到了这个错误,我想这是因为上一个数字上有一个CRLF,我尝试使用正则表达式来解决这个问题,但它不起作用。这是我的密码: 公共类加密系统{ 静态字符串原始值为什么在尝试将此字符串转换为整数时会出现“java.lang.NumberFormatException”?,java,parsing,url,encryption,random,Java,Parsing,Url,Encryption,Random,我一直在创建一个Java程序,对从用户收到的消息进行编码。只是想了解一下它是如何做到这一点的:它应该获取输入,将其拆分为字符,然后从random.org true random number generator获取一组与消息长度相等的随机数,然后将输入的字符按相应的移位或随机数移位,然后输出编码信息和移位。到目前为止,我已经获得了输入,将其转换为字符串数组,检查quota Random.org是否有配额,并获得了随机数。我在尝试将从网站上获取的字符串转换为int时遇到了这个错误,我想这是因为上一
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());
}