i need use method
public static string readstring() { return input.nextline(); }
in order use scanner method next.line(), requirement of project, thing when use static method projectutils.readstring() gather user input string throws me lot of errors, cant understand why, im using way
public static void encryptastring() { projectutils.println("enter phrase , key"); string p = projectutils.readstring(); projectutils.println("enter key"); int k = projectutils.readinteger(); projectutils.println(encryptstring.encryptstring(p,k ));
but ends terminating , throwing
exception in thread "main" java.util.inputmismatchexception @ java.util.scanner.throwfor(unknown source) @ java.util.scanner.next(unknown source) @ java.util.scanner.nextint(unknown source) @ java.util.scanner.nextint(unknown source) @ projectutils.readinteger(projectutils.java:24) @ projectutils.encryptastring(projectutils.java:88) @ stringmenumanager.run(stringmenumanager.java:37) @ projectutils.operationsonstrings(projectutils.java:69) @ mainmenumanager.run(mainmenumanager.java:47) @ p1main.main(p1main.java:9)
thanks in advance.
mcve
the main class
public class main { public static void main(string[] args) { mcve.encryptastring(); } }
the mcve method or projectutils class in original project
import java.util.scanner; public class mcve { private static final scanner input = new scanner(system.in); public static void println(string s) { system.out.println(s); } public static int readinteger() { // moment, assume input // valid integer.... want // more robust , explicitly read , test first if // input integer or not.... return input.nextint(); } public static string readstring() { // moment, assume input // valid string.... want // more robust , explicitly read , test first if // input integer or not.... return input.nextline(); } public static void encryptastring() { mcve.println("enter phrase , key"); string p = mcve.readstring(); int k = mcve.readinteger(); mcve.println(encryptstring.encryptstring(p,k )); } }
and encryption class
public class encryptstring { private static final int alength = 26; /** * encrypt string using given key value. * @param s string encrypted * @param key key * @return encrypted string */ public static string encryptstring(string s, int key) { // if key value not in accepted range (-25..25) // encrypted string same input string if (key < -25 || key > 25) return s; // key valid, construct encrypted string // described in p1 specs... string newstring = ""; for(int x = 0; x<s.length(); x++) { if(((int)s.charat(x)>64&&(int)s.charat(x)<123)) newstring = newstring + encryptchar(s.charat(x), key); else newstring = newstring + s.charat(x); } return newstring; } /** * encrypt particular character. * @param ch character encrypt - assumed letter ‘a’..’z’ or ‘a’..’z’ * @param key key used. assumed value in range (-25..25) * @return new character after encryption */ private static char encryptchar(char ch, int key) { // pre: ch letter 'a'..'z' or 'a'..'z' // pre: key integer in range -25..25 int base; if (character.isuppercase(ch)) base = (int) 'a'; else base = (int) 'a'; return (char) (math.abs((((int) ch - base) + key + alength) % alength) + base); }
}
although i'm not sure exact underlying problem, there seems newline in input shouldn't there. it's causing first input.nextline()
read (presumably) empty line.
a temporary workaround consume newline calling readstring()
, ignoring return value, reading actual string input readstring()
call.
Comments
Post a Comment