提问人:Pramod Devrath 提问时间:10/31/2023 最后编辑:OneCricketeerPramod Devrath 更新时间:11/1/2023 访问量:70
如何将 Scanner 类转换为 String?
How can I convert Scanner Class into String?
问:
import java.util.Scanner;
public class Cond {
static ScannerClass usrID, pwdd;
static String pass = "123456";
static String usr = "ABCD";
public static void main(String[] args) {
System.out.println("Enter UserID: ");
usrID = new ScannerClass();
usrID.main();
String o = usrID.toString();
System.out.println("Enter password: ");
pwdd = new ScannerClass();
pwdd.main1();
String t = pwdd.toString();
if ((usr.equals(o)) && (pass.equals(t))) {
System.out.println("You are logged in!");
}
else {
System.out.println(("Please enter correct credentials"));
}
}
}
我做了一个单独的类,它是:
import java.util.Scanner;
public class ScannerClass {
static Scanner sc = new Scanner(System.in);
public void main(){
String UserID = sc.nextLine();
}
public void main1(){
String pwd = sc.nextLine();
}
}
代码没有像我预期的那样重新出现.这就是问题所在:
输入用户 ID: ABCD公司 输入密码: 123456 请输入正确的凭据
我尝试使用 toString() 转换 Scanner 类,我在 internt 上发现了这个,但它不起作用,如您在上面的结果中看到的那样。
答:
里面的方法从用户那里读取,创建一个局部变量及其内容,然后丢弃该变量。方法中的第一个变化是返回局部变量,以便您可以在其他位置访问它:main
ScannerClass
public class ScannerClass {
static Scanner sc = new Scanner(System.in);
public String getUserId(){
String UserID = sc.nextLine();
return UserID;
}
public void getPassword(){
String pwd = sc.nextLine();
return pwd;
}
}
然后,在您的主要方法中,您可以做到Cond
ScannerClass scanner = new ScannerClass();
System.out.println("Enter UserID: ");
String usrID = scanner.getUserId();
System.out.println("Enter password: ");
String pwd = scanner.getPassword();
if ((usr.equals(usrID)) && (pass.equals(pwd))) {
System.out.println("You are logged in!");
} else {
System.out.println(("Please enter correct credentials"));
}
ScannerClass 没有构造函数,因此调用它不会执行您想要的操作(设置该类中的任何变量)。此外,您还需要更详细地了解变量范围。new
相反,您需要 getter 方法
import java.util.Scanner;
public class ScannerClass {
private final Scanner sc;
public ScannerClass() {
this.sc = new Scanner(System.in);
}
public String getUserID(){
return sc.nextLine();
}
public String getPwd(){
return sc.nextLine();
}
}
然后,在您的主要方法中,您只需要一个扫描仪
ScannerClass sc = new ScannerClass();
String uid = sc.getUserID();
String pwd = sc.getPwd();
(注意:这两种方法返回完全相同的东西,因此创建一个新对象,只是为了重命名,通常被认为是不好的做法)Scanner.nextLine
这已经是一个字符串了。我不知道你为什么要在 String 上调用 toString,但在 ScannerClass 对象上调用它是不正确的(打印输出,你就会明白为什么)
您没有正确使用该类:您的 ScannerClass 或多或少是无用的,因为您所做的只是使用一个实例。Scanner
static Scanner
你宁愿这样做:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 1
System.out.println("Enter UserID: ");
String o = scanner.nextLine(); // (2)
System.out.println("Enter password: ");
String t = scanner.nextLine(); // (3)
if (usr.equals(o) && pass.equals(t)) {
System.out.println("You are logged in!");
} else {
System.out.println("Please enter correct credentials");
}
}
- 您通常应该在此处使用 try with resource,尤其是在您持有资源的情况下。这样可以避免处理泄漏,在特定情况下,这问题较少,甚至更罕见。
System.in
- 我们使用 nextLine() 以用户身份获取下一行,但如果有新的下一行,这可能会失败:您通常应该调用 before: may fails 例如,如果 stdin 不再在这里(结束
文件等)
hasNextLine()
nextLine()
- 请参见 2。
由于您正在读取密码,因此您也可以使用隐藏密码的好处,但它在IDE(如Eclipse)中可能无法很好地工作:Console
Console cons = System.console()
if (cons == null) {
throw new IllegalStateException("no console");
}
String o = cons.readLine("Enter UserID: ");
char[] t = cons.readPassword("Enter Password: ");
if (usr.equals(o) && t != null && Arrays.equals(pass.toCharArray(), t)) {
System.out.println("You are logged in!");
} else {
System.out.println("Please enter correct credentials");
}
如果你想保留你的 ScannerClass,那么你最好有一个静态方法从用户那里获取所有信息:
class ScannerClass {
private final String userId;
private final String password;
private ScannerClass(String userId, String password) {
this.userId = userId;
this.password = password;
}
public String getUserId() {return userId;}
public String getPassword() {return password;}
static ScannerClass obtainFrom(/*WontClose*/ InputStream is) { // (1)
Scanner scanner = new Scanner(is);
System.out.println("Enter UserID: ");
String o = scanner.nextLine();
System.out.println("Enter password: ");
String t = scanner.nextLine();
return new ScannerClass(o, t);
}
}
请注意,我们不会关闭 (1) 实例,因为 Scanner.close 将关闭 ,这可能是需要的,也可能不需要。Scanner
InputStream
然后,您可以使用它:
ScannerClass scanner = ScannerClass.obtainFrom(System.in);
String o = scanner.getUserId();
String t = scanner.getPassword();
这样做的好处是将关注点分开:获取信息和 ScannerClass 所述信息。obtainFrom
评论
System.in
InputStream
评论