我正在创建一个接受用户输入并生成去演唱会门票的程序。为此,在其中一个文本字段中,用户输入其全名。然后程序获取文本字段的内容并将其设置为字符串Concegoer。为了获得用户的首字母,我使用String Tokenizer将Concegoer分成firstName,middleName和lastName字符串,然后使用substring从每个字符串中获取第一个字母。
我希望程序处理异常,如果用户只输入了文本字段中的一个空格分隔的两个单词(ex名字和姓氏),那么程序会生成一个随机字母,并将其连接到字符串Concegoer在第一个和最后一个名称之间,空格所在的位置,以便middleName可以有一个初始值。我尝试通过处理字符串Concegoer并扫描空格并尝试用字母替换空格来做到这一点。但是,它无法正常工作,程序崩溃了。程序的这一部分的代码如下所示,特别是在for循环中。控制台的println语句主要供参考,崩溃后显示的消息也在下面。
Random numCharacter2 = new Random();
String alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char addedLetter2 = alphabet2.charAt(numCharacter2.nextInt(alphabet2.length()));
for (int counter = 0; counter < concertgoer.length(); counter++) {
char scanner = ' ';
if (concertgoer.charAt(counter) == scanner) {
System.out.println(scanner + "\n Hello, World");
concertgoer = concertgoer.replace(concertgoer.charAt(scanner), addedLetter2);
System.out.println("New: " + concertgoer);
}
}
concertgoer = concertgoer + " " + addedLetter2;
//! Add letter in middle of string concertgoer if only two words are entered as substitute
//for middle name
StringTokenizer token = new StringTokenizer(concertgoer);
String firstName = token.nextToken();
String middleName = token.nextToken();
String lastName = token.nextToken();
String firstInitial = firstName.substring(0, 1);
String middleInitial = middleName.substring(0, 1);
String lastInitial = lastName.substring(0, 1);
firstInitial = firstInitial.toUpperCase();
middleInitial = middleInitial.toUpperCase();
lastInitial = lastInitial.toUpperCase();
System.out.println(firstInitial);
System.out.println(middleInitial);
System.out.println(lastInitial);
String nameInitials = firstInitial + middleInitial + lastInitial;
nameInitials = nameInitials.replace(" ", "");
System.out.println(nameInitials);
//double num = Math.random();
//Use random class and nextInt set range for any random number
Random num = new Random();
int randomInteger = Math.abs(num.nextInt() % 9999);
System.out.println(randomInteger);
ticketPasscode = nameInitials + randomInteger;
String message = "Your ticket passcode is: " + ticketPasscode;
messageBox(message);
System.out.println(ticketPasscode);
有人可以帮我解决这个问题找到正确的方法吗?我感谢您的帮助。谢谢。
*崩溃
Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at TicketPrinter.buttonClicked(TicketPrinter.java:138)
at BreezyGUI.GBFrameButtonListener.actionPerformed(GBFrame.java:241)
at java.awt.Button.processActionEvent(Button.java:409)
at java.awt.Button.processEvent(Button.java:377)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
答案 0 :(得分:1)
在每次调用hasNextToken()
之前使用nextToken()
来检查是否确实存在下一个令牌。在这一步,你有0,1,2,3 ......弦。
在这一步,如果你有3个字符串(名字,中间名,姓氏),一切都很好,程序继续第一个标记作为第一个名称,第二个标记作为中间名,第三个标记作为姓氏,当然。
如果另一方面,在此步骤中只有两个字符串,则按照所述为中间名称分配一个随机字母,并将第一个标记分配给第一个名称,将第二个标记分配给姓氏。
从那里,你的程序继续
String firstInitial = ...
答案 1 :(得分:1)
你确定这条线吗?
concertgoer = concertgoer.replace(concertgoer.charAt(scanner), addedLetter2);
这将实际检查String Concegoer中的第32个字符,然后尝试替换它。这是因为char''实际上计算为int 32.你确定这是你想要的功能吗?此外,如果Concegoerer字符串少于32个字符,则会抛出异常。
答案 2 :(得分:0)
这有用吗? (没有测试)
String insert(String input, char tbi, int index) {
String pre = input.substring(0, index-1);
String post = input.substring(index, input.length-1);
return pre + tbi + post;
}
你实际上可以用它做一个单行...